将函数指针作为参数传递

6

我正在使用以下简单代码重新学习C语言中的函数指针:

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

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

我使用以下方式调用它:
Caller(TestFn, 7)  //and
Caller(&TestFn, 7)

两种方式得到了相同的输出结果: 14。这是什么解释呢?我之前一直在使用第二种调用方式。


2
我相信当你传递TestFn时,地址是隐式传递的,因此它实际上被解释为与&TestFn相同。 - Martinsos
2
我认为这个问题已经回答了,尽管它是关于C++的。https://dev59.com/dmw15IYBdhLWcg3wA24A - Joe
2个回答

8

在这里,函数的工作方式有点像数组。假设你有:

char hello[5];

您可以直接引用这个变量的地址作为 hello - 变量名会“衰变”成指针 - 或者作为 &hello,明确获取地址。
函数也是一样的:如果您写 TestFn,它会衰变成一个函数指针。但是您也可以使用 &TestFn。后者可能更好,因为它更熟悉。

1
谢谢,正如你所说,在数组的情况下,hello和&hello是相同的,我尝试了函数指针并发现它们比数组更进一步:&ptr、ptr、ptr、ptr、*..*ptr都是相同的。这似乎与数组有些不同,因为解引用将给出元素值。 - CuriousSid
是的,有一点不同:当您解引用函数指针时,会获得一个由其地址表示的函数。但该地址也是指针的值。因此,如果p是一个函数指针,则p == *p == **p == ... - Joni

2

就像您在不使用&符号时传递字符串的地址一样,您无需使用&符号来表示您正在传递函数指针。您可以通过K&R的书籍进行搜索。其中包含了很好的解释。


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