2013-03-26 251 views
4

我用下面简单的代码重新审视函数指针在C:使用传递函数指针作为参数

Caller(TestFn, 7) //and 
Caller(&TestFn, 7) 

两个

unsigned TestFn(unsigned arg) 
{ 
    return arg+7; 
} 

unsigned Caller(unsigned (*FuncPtr)(unsigned), unsigned arg) 
{ 
    return (*FuncPtr)(arg); 
} 

我把它叫做给出了相同的输出结果:14有什么解释这个的。我之前一直在使用第二种调用方式。

+2

我相信地址是通过TestFn时隐式传递的,所以它的解释实际上与&TestFn相同。 – Martinsos 2013-03-26 17:03:00

+2

我认为这个问题可以回答它,即使它是C++ http://stackoverflow.com/questions/6893285/why-do-all-these-crazy-function-pointer-definitions-all-work-what-is-really- goi – Joe 2013-03-26 17:03:00

回答

6

函数在这里工作类似于数组。假设你有:

char hello[5]; 

您可以参考这个变量的地址直接作为hello - 变量名“衰变”成一个指针 - 或者&hello,其中明确取得地址。

功能是一样的:如果你写TestFn它衰变成一个函数指针。但是你也可以使用&TestFn。后一种形式可能会更好,因为它对更多人来说很熟悉。

+1

Thnx,正如你在数组中hello和hello相同的情况下所说的那样,我尝试过使用func ptrs,并且看到它们是:&ptr,ptr,* ptr,** ptr,****。 * ptr都一样。这与取消引用将赋予元素值的数组显得有点不同。 – CuriousSid 2013-03-26 17:22:10

+0

是的,它有点不同:当你取消引用函数指针时,你得到一个函数,用它的地址表示。但地址也是指针的值。所以如果p是一个函数指针,p == * p == ** p == ... – Joni 2013-03-26 18:24:01

2

就像您传递字符串的地址而不使用&符号'&'符号一样,您不需要使用&字符来表示您传递的是function pointer。您可以通过K & R搜索该书。它包含了一个很好的解释