2012-02-16 122 views
3

是什么这两个声明的区别:C函数指针混乱

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号的功能,其结果仍然是相同的。为什么?

回答

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操作者或一元&操作者,功能指示器与 类型“‘函数返回类型’的操作数 ”被转换为已输入“‘指针 函数返回类型’”的表达式。

+0

约衰减第二段是外的地方,我想。无腐烂发生的事情,除非你计数'(* FUNC)'作为函数和'func'为指针它衰变到...? – 2012-02-16 16:59:48

+0

@R:哦,我明白了。我指的是“操作(sum,1,1)”与“操作(&sum,1,1)”。 – 2012-02-16 17:01:14

+0

哦,我明白了.. – 2012-02-16 17:02:59