C语言函数指针语法困惑及代码报错问题排查
C语言函数指针语法解惑及代码问题分析
函数指针的等价写法为啥这么多?
C语言里函数名、&函数名、*函数指针、**函数指针在函数指针操作中都是等价的,核心原因是:函数名会自动隐式转换为指向该函数的指针。
- 写
func时,函数名直接转成函数指针; &func是显式取函数地址,和func效果完全一样;- 对函数指针
func_ptr写(*func_ptr),解引用得到的函数标识又会自动转回指针,所以调用时func_ptr(arg)和(*func_ptr)(arg)没区别; - 就算写
**func_ptr,多次解引用后最终还是会转回函数指针,语法上也是合法的。
代码报错根源
你遇到的double*无法赋值给double的错误,结合你后来发现的问题,本质是函数指针的声明括号位置错了:
- 错误写法
double *(operation)(double, double):这其实是声明了一个普通函数operation,它接受两个double参数,返回double*类型,根本不是函数指针; - 正确写法
double (*operation)(double, double):括号把*operation包裹起来,才表示operation是一个指针,指向的函数接受两个double参数、返回double类型。
回到你写的func1,参数(*func0)(double)是合法的函数指针声明(表示func0指向接受double、返回double的函数),但如果实际传入的func0是返回double*的函数,就会出现类型不匹配——因为temp[i]是double类型,却被赋值了double*类型的值。
修正后的示例代码
如果func0是返回double的函数指针,修正后的代码可以参考:
#include <stdlib.h> double *func1(double (*func0)(double), double *var, size_t some_size, int some_cycles) { double *temp = malloc(some_size * sizeof(double)); if (!temp) { // 必须检查malloc是否成功 return NULL; } for(int i = 0; i < some_cycles; ++i) { temp[i] = func0(var[i]); // 这里直接调用和(*func0)(var[i])完全等价 } return temp; }
内容的提问来源于stack exchange,提问作者Daniel Muñoz
相关产品推荐
相关产品推荐

