解读复杂的C/C++声明[入门篇]

复杂的C/C++声明,常出现在学校的考卷,面试题或是牛人老外的代码中。
我们在实际的工作中,应该尽可能少使用复杂的声明。复杂的声明,会让阅读您代码的人很是郁闷。
虽然不使用这种复杂的声明,但还是应该把将如何解析这种复杂的声明的方法记在心中。
所以,我把这种方法记录下来,以备不时之需。

 

入门题

 

1) 一个整型数(An integer)

答:int n

 

2) 一个指向整型数的指针(A pointer to an integer)

答:int *p

 

3) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

答:int **p

 

4) 一个有10个整数的数组(An array of 10 integers)

答:int a[10]

 

5) 一个有着10个元素的数组,每个元素都是一个指向整形数的指针(An array of 10 pointers to integers)

答:从第1题至第4题,都是一眼能看出来的。第5题就需要注意。

我将第5题的题目按如下解读:

a.从外往内进行解读

b.有一个10个元素的数组:typedef P (a[10])

c.每个元素都是一个指向整形数的指针:int *P

d.从下往上进行嵌套~

e.所以答案为int *(a[10]) = int *a[10]

 

6) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

答:解读如下

a.从外往内进行解读 b.这是一个指针 typedef P (*a)

b.有着10个整型的数组 int P[10]

c.从下往上进行嵌套

d.所以答案为 int (*a)[10]

 

7) 一个指向函数的指针,该函数有一个整型参数并返回一个整数(A pointer to a function that takes an integer as an argument and returns an integer)

答:解读如下,

a.从外往内进行解读

b.这是一个指针 typedef P(*a)

c.这是一个函数,有一个整型参数并返回一个整数 int P(int)

d.从下往上进行嵌套

e.所以答案为 int (*a)(int)

 

8) 一个有10个函数指针的数组,这些函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

答:解读如下,

a.从外往内进行解读

b.这是一个数组 typedef P (a[10])

c.这是一个指针 typedef Q (*P)

d.这些函数有一个整型参数并返回一个整型 int Q(int)

e.从下往上进行嵌套

f.所以答案为 int (*(a[10]))(int) = int (*a[10])(int)

 

总结一下: 按从外往内的关系进行分解,分析出最外面的是什么类型,到底是一个指针,还是一个数组。

前面这8道题,都很明确的指出最外层的类型。

接着typedef一下,就像我上面做的那样,就得加个括号。

最后被分离到无法再分离之后,从下往上进行组合,就可以得出答案。

 

这是从语言描述出声明的题目,一般比较少考。

考的比较多的,是要求将声明使用语言描述出来。

比如:(也是网络上抄的题)

int * (* (*fp1) (int) ) [10];

int *( *( *arr[5])())(); (Ps:实际工作中,要是敢这么写,估计会被老大秒杀。)

流行的解读方法是"right-left"法则(右左法则)。

我用的方法应该也差不多,写在下一篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值