对于这种复杂的声明格式,可以采用替换的形式来看明白。
比如char (*(*x())[])();这个, 你可以找个 a代替括号里面的,然后逐步代替。
char (*(*x())[])();
// 用a 代替 (*x())[]
char (*a)();
// 上面的a的意思就是一个函数指针,空参,返回char
// 再看(*x())[],用b代替 *x()
(b)[];
// b是一个数组,而且数组每一项是一个指针a
*x();
// x是一个空参函数,返回类型是一个b的指针
所以上面的x是一个函数,参数为空,返回值是一个数组的指针,数组的每一项是一个指针,指向的是一个函数指针,这个函数的形式是空参返回char。
所以使用的方式就是
char f1(){return 1;};
char f2(){return 2;};
char (*(*x())[2])(){
typedef char A();
A* f = f1;
typedef A* B[];
B arr = {f,f};
typedef B* F();
return &arr;
};
同样的道理
char (*(*x[3])())[5];这个表达式的使用方式就是
typedef char A[5];
A* b(){
static A a = {1,2,3,4,5};
return &a;
}
typedef A* B();
char (*(*x[3])())[5] = {&b,&b,&b};
也就是说x 是个有3个值的数组,每个数组的类型是一个函数指针,这个函数(b)是空参,返回的是一个指针,指向一个含有5个char的数组。