【C/C++】面试题:函数指针

问题1:如何把一个类的成员函数赋值给空指针?

他的回答是:函数指针应该加类域。正确

接下来再问,如果要赋值给一个没有类域的指针,应该怎么办?

他说:不能那样赋值,编译器会报错。

继续问:没有办法骗过编译器进行赋值吗?

他没回答上来。

虽然他最终没答上来,但也算是通过了。其实答案是通过union来做。



问题2:请问下面的代码定义了什么

int (*(*funcs[4])(int (*)(int, int), int, int))(int, int);

分析:这是一行定义语句,C语言最难理解的便是其花样繁多的声明/定义。理解声明/定义语句的关键是抓住一条: C语言像调用一样声明变量,从变量名(函数本身也是变量,代表一段“逻辑”内存)出发,看变量经过怎样的操作(注意操作顺序),最终得到什么样类型的值。

回答:

1. 变量名funcs,可以进行[] 下标操作,说明funcs是一个数组;

2. funcs数组的元素可以被*解析,说明数组元素是指针,funcs是指针的构成的数组;

3. 指针指向的对象,可以进行()调用操作,说明指向的对象是函数,funcs是函数指针的构成的数组;

4. funcs数组的元素指向的函数,有三个参数:int(*)(int,int)、int、int,第一个参数是一个函数指针,它的参数是两个int变量,返回值是int型

5. funcs数组的元素指向的函数的返回值可被*解析,说明返回值是个指针,这个指针解析后又可以进行()函数调用,说明仍然是个函数指针

6. 返回的函数指针指向的函数,参数是2个int变量,返回结果是int

定义了一个有4个元素的数组,数组元素是函数指针,指向的函数以int(*)(int,int)、int、int为参数,返回是一个函数指针。

返回的函数指针以int int为参数,返回值是int

结论: C语言就是在折腾“逻辑”内存(线性空间),我们声明一段内存可以做怎样的解释,代表什么样的东西,然后对这个东西进行操作。




你可能感兴趣的:(【C/C++】面试题:函数指针)