C语言中不使用typedef声明函数指针变量的方法及错误解析
函数指针声明问题解答
错误写法失效的原因
C语言的变量声明语法有明确规则,函数指针的类型和变量名的绑定位置是固定的,你尝试的两种写法都不符合语法要求:
- 错误写法1
int (*Aptr) (int, int) a = &add;:编译器会把int (*Aptr)(int,int)识别为声明了一个函数指针变量Aptr,后面的a就成了未声明的独立标识符,自然触发报错。 - 错误写法2
int (*) (int, int) a = &add;:这种写法跳过了函数指针声明中必须的变量名占位位置((*)中间),编译器无法将a和前面的类型关联起来,只会把a当成未声明的符号。
不使用typedef的正确声明方式
直接声明函数指针变量时,必须把变量名放在(*)的括号内部,正确写法如下:
// 直接声明并初始化,&add可以简化为add int (*a)(int, int) = add; // 调用方式不变 printf("The sum of 45, 23: %d\n", a(45, 23));
原理是C的声明遵循“声明模仿使用”的逻辑:(*a)(int,int)表示使用a时,要先通过*a解引用得到函数,再传入两个int参数调用,所以变量名必须放在(*)中间来明确这是一个函数指针。而typedef的作用就是把这个复杂的类型包装成一个别名,让后续声明更简洁,但本质和直接声明是等价的。
内容的提问来源于stack exchange,提问作者Abenaki
相关产品推荐
相关产品推荐

