指针函数疑问:为何代码输出为4?我的逻辑是否正确?
#include <stdio.h> void tell_me(int f(int)); int f(int); int a(int); void main() { tell_me(a); } void tell_me(int (*f)(int)) { int x; if(f == (*a)) { x = 1; } else x = 2; printf("%d\n", f(x)); } int f(int j) { return j * j; } int a(int j) { return j * 4; }
代码分析与问题解答
你的核心判断是正确的,具体细节拆解如下:
函数名与函数指针的等价性
在C语言中,函数名本身就等价于指向该函数的指针。当你在main里调用tell_me(a)时,a作为函数名被隐式转换为指向a函数的指针,传递给tell_me的形参f(类型为int (*f)(int),即指向接收int参数、返回int的函数指针)。f == (*a)的判断逻辑
对函数名执行*解引用操作,得到的结果依然是该函数的指针(可以理解为函数指针的“解引用”是幂等的,多次解引用还是同一个指针)。所以这里f(指向a的指针)和*a(解引用a得到的指针)是相等的,条件成立,x被赋值为1。最终调用与输出结果
执行f(x)时,因为f指向的是函数a,所以实际调用的是a(1),返回1*4=4,这就是程序输出4的原因。函数
f的作用
代码里的函数f确实没有被实际调用,它只是完成了声明和定义,整个程序流程中没有任何地方触发它的执行逻辑。
内容的提问来源于stack exchange,提问作者somi
相关产品推荐
相关产品推荐

