这是入门篇中提到的那两题:
int * (* (*fp1) (int) ) [10];
int *( *( *arr[5])())();
解答如下
1.int * (* (*fp1) (int) ) [10];
从外往内进行分析
a.typedef P=(* (*fp1) (int) ),那么原声明改写为 int*P[10],这是一个有10个元素的数组,每个元素都是一个指向整型数的指针
b.typedef Q=(*fp1),那么P改写为 *Q(int),这是一个函数,该函数有一个int形参,返回值为一个指针。
c.*fp1 这是一个指针
按从下往上进行修饰的方式组合。
这是一个指向函数的指针,该函数有一个int形参,返回值为一个指向10个元素数组的指针。该数组里的每一个元素都是一个指向整形数的指针。
2.int *( *( *arr[5])())()
从外往内进行分析
a.typedef P = ( *( *arr[5])()) ,那么原声明被改写为 int *P () ,这是一个函数,该函数没有形参,返回值为int*
b.typedef Q = *arr[5],那么P被改写为 *(Q)() ,这是一个函数,该函数没有形参,返回值为一个指针
c.*arr[5],这是一个有着5个元素的数组,每个元素都是一个指针。
按从下往上进行修饰的方式组合。
这是一个有5个元素的数组,每个元素都是一个指向函数的指针,该函数没有形参,有返回值。
它的返回值是一个指向函数的指针,这个函数同样没有形参,返回值为指向整型数的指针。
总结:
拿到这种声明,要一层一层的剥开,就像我上面的a,b,c步骤一样,直到不能再剥为止。
然后从下往上的进行修饰组合。
如c是指针,b是数组,那我们就说这是一个指向数组的指针。
c是数组,b是指针,那我们就说这个数组里的每个元素都是指针
要想提高解析的速度,下面几个基本声明要牢记于心,做到第一反应
int *a[10] 一个有着10个元素的数组,每个元素都是一个指向整形数的指针 sizeof(a)=sizeof(int)*10=40
int (*a)[10] 一个指向有10个整型数数组的指针 sizeof(a)=4
int (*a)(int) 一个指向函数的指针,该函数有一个整型参数并返回一个整数 sizeof(a)=4