C函数指针混淆

3
这两种声明有什么不同呢?
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作为2个数字的函数传递给func,结果仍然相同。为什么?

2个回答

4

§6.7.5.3/8:

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

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

至于函数调用,根据§6.5.2.2/3:

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

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


3
这两个函数的原型是等价的。根据C99,6.7.5.3的规定:
“将一个参数声明为‘返回类型函数’将被调整为‘返回指针类型函数’,如6.3.2.1所示。”
这两个函数调用(operate(sum, 1, 1) 和 operate(&sum, 1, 1))是等价的;在大多数情况下,函数会衰变为一个函数指针(类似于数组衰变为指向其第一个元素的指针)。 根据C99,6.3.2.1的规定:
“函数标识符是具有函数类型的表达式。除非它是sizeof运算符或一元&运算符的操作数,否则具有类型‘返回类型函数’的函数标识符将转换为具有类型‘返回指针类型函数’的表达式。”

第二段关于衰减的内容我觉得有些不合适。除非你把 (*func) 视为函数,func 视为它所衰减指向的指针,否则是没有发生衰减的。 - R.. GitHub STOP HELPING ICE
@R..:哦,我懂了。我指的是 operate(sum, 1, 1)operate(&sum, 1, 1) 的区别。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接