You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:21:06