复杂的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"法则(右左法则)。
我用的方法应该也差不多,写在下一篇。