这两个声明之间有什么区别:
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个数字的函数,则结果仍然相同。为什么呢?
答案 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''转换为类型为''指针的表达式 函数返回类型''。