char (*(*a)())[]; 的定义
The definition of char (*(*a)())[];
我听不懂
char (*(*a)())[]
int main()
{
char (*(*a)())[]; // do not change this
char *x="My endless\n";
char * func (){
return(x);
}
a=func;
return 0;
}
当我编译时,我收到如下警告:
main.c:13:6: 警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]
指的是a=func
我知道 char (*(*a)())
表示指向函数的指针,该函数 returns 是一个 char 指针,但我不知道添加 []
对它有什么作用,即 char (*(*a)())[];
这个
char (*(*a)())[];
是指向函数指针的声明,returns指向不完整类型数组的指针char[]
。
请注意,在另一个函数中定义函数不是标准的 C 功能。
这是一个至少可以编译的演示程序。
#include <stdio.h>
char ( *f() )[]
{
static char s[][10] =
{
"Hello",
"World"
};
return s;
}
int main(void)
{
char (*(*a)())[] = f;
char ( *p )[] = a();
puts( *p );
return 0;
}
程序输出为
Hello
在这个程序中使用像这样的转换
char ( *p )[10] = ( char ( * )[10] ) a();
你可以获得一个指向完整数组类型的指针。
要破译复杂的 C 声明,您可以使用螺旋规则,请参阅 http://c-faq.com/decl/spiral.anderson.html。还有一个将 C 声明翻译成简单英语的工具:
一般来说,一个复杂的声明最好分成几个部分,并给它们起有意义的名字,例如
#include <stdlib.h>
typedef char (*ArrayPointer)[];
typedef ArrayPointer (*Function)();
int main(void)
{
char (*(*a)())[] = NULL;
Function b;
b = a;
return 0;
}
我听不懂
char (*(*a)())[]
int main()
{
char (*(*a)())[]; // do not change this
char *x="My endless\n";
char * func (){
return(x);
}
a=func;
return 0;
}
当我编译时,我收到如下警告:
main.c:13:6: 警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]
指的是a=func
我知道 char (*(*a)())
表示指向函数的指针,该函数 returns 是一个 char 指针,但我不知道添加 []
对它有什么作用,即 char (*(*a)())[];
这个
char (*(*a)())[];
是指向函数指针的声明,returns指向不完整类型数组的指针char[]
。
请注意,在另一个函数中定义函数不是标准的 C 功能。
这是一个至少可以编译的演示程序。
#include <stdio.h>
char ( *f() )[]
{
static char s[][10] =
{
"Hello",
"World"
};
return s;
}
int main(void)
{
char (*(*a)())[] = f;
char ( *p )[] = a();
puts( *p );
return 0;
}
程序输出为
Hello
在这个程序中使用像这样的转换
char ( *p )[10] = ( char ( * )[10] ) a();
你可以获得一个指向完整数组类型的指针。
要破译复杂的 C 声明,您可以使用螺旋规则,请参阅 http://c-faq.com/decl/spiral.anderson.html。还有一个将 C 声明翻译成简单英语的工具:
一般来说,一个复杂的声明最好分成几个部分,并给它们起有意义的名字,例如
#include <stdlib.h>
typedef char (*ArrayPointer)[];
typedef ArrayPointer (*Function)();
int main(void)
{
char (*(*a)())[] = NULL;
Function b;
b = a;
return 0;
}