C函数指针混乱

时间:2012-02-16 16:52:48

标签: c function pointers

这两个声明之间有什么区别:

int operate(int (*func)(int, int), int a, int b){
    return (*func)(a, b);
}

int operate(int func(int, int), int a, int b){
        return func(a, b);
 }

这两个似乎也相同:operate(sum, 1, 1)operate(&sum, 1, 1)

如果我在sum的位置传递函数func作为2个数字的函数,则结果仍然相同。为什么呢?

2 个答案:

答案 0 :(得分:4)

§6.7.5.3/ 8:

  

参数声明为''函数返回类型''应调整为''函数返回类型的指针'',如6.3.2.1中所述。

换句话说,两个函数声明是相同的。

就函数调用而言,§6.5.2.2/ 3:

  

后缀表达式后跟括号(),其中包含可能为空的逗号分隔   表达式列表是一个函数调用。后缀表达式表示被调用的函数。

由于func(a, b);(*func)(a, b)都是后缀表达式,后跟括号,因此它们都是函数调用。由于func(*func)都指定了相同的函数,因此它们都调用相同的函数。

答案 1 :(得分:3)

两个函数原型是等价的。来自C99,6.7.5.3:

  

参数声明为''函数返回类型''应调整为''函数返回类型的指针'',如6.3.2.1中所述。

两个函数调用(operate(sum, 1, 1)operate(&sum, 1, 1))是等效的;函数在大多数上下文中衰减成函数指针(类似于数组如何衰减成指向其第一个元素的指针)。从C99,6.3.2.1:

  

函数指示符是具有函数类型的表达式。除非它是   sizeof运算符或一元&运算符的操作数,一个函数指示符   type''function returns type''转换为类型为''指针的表达式   函数返回类型''。