商务合作:179001057@qq.com

解读复杂的CC++声明[实战篇]

技术2022-05-11  0


某平台价值19860元的编程课程资料免费领取【点我领取】


这是入门篇中提到的那两题:

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

 


最新回复(0)