上周被算法部门的头抓壮丁帮忙面试了几位AE的候选人,这个职位对编程水平的要求其实并不算高,能看懂C或者C++代码,并且可以根据客户的要求做一些小的修改即可。几位候选人都在知名外企工作多年,职位估计也不低,年龄也比我大一点。要求候选人现场手写代码,真是有点太难为情,但又不能不仔细考察。在网上找了几道指针和位操作相关的题,结果让我颇感意外,竟然没有答对的。大外企大国企大锅饭废人不假,但是面试前临时抱佛脚也是应该有的吧?不过也可能是人家看不上我们小公司,权当练手罢了。
废话少说,也贴一道抄来的面试题:解读声明int *(*x[10]) (void)
?
C语言设计相关的教材里面讲得很清楚,无论多么复杂的声明,两个规则来解读:
1. 从内往外解读声明符
换句话说,找到声明的标识符,并且从此处开始解读。
2. [ ]和( )优先级高于*
如果在标识符前面,而标识符后面跟着[ ],那么标识符表示数组而不是指针。同样的,如果在标识符前面,而标识符后面跟着( ),那么标识符表示函数而不是指针。
举例:
声明 | 解读 |
---|---|
int *ap[10]; | ap是指向int的指针数组 |
float *fp(float); | fp是指向float的指针函数 |
void (*pf)(int); | pf是指向形参为int,返回值为void的函数指针 |
int *(*x[10]) (void); | x是大小为10且指向某函数的指针数组,此函数没有输入参数,返回值为int指针 |
char (*x[10])(int); | x是大小为10且指向某函数的指针数组,此函数输入为1个int,返回值为char |
int (*x(int))[5]; | x是指针函数,此函数的输入为1个int,返回值为指向大小为5的int数组的指针 |
float *(*x(void)) (int); | x是指针函数,指向一个没有输入参数且返回值为指针函数y的函数;y是输入为1个int,返回值为float指针的指针函数 |