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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值