4

可能重复:
具有不同语义的函数调用

我正在阅读 C 中的函数指针。我尝试了这个程序:

#include <stdio.h>

int foo(void)
{
    printf("At foo.");
    return 0;
}

int main (void)
{
    printf("%p\t%p\t%p\n", &foo, foo, *foo);
    return 0;
}

该程序的输出是:

0040138C    0040138C    0040138C

在一维数组<datatype> <identifier>[N]中,identifier&identifier指向相同的值,但值的性质不同。一个是类型datatype*,另一个是指向一维数组的类型指针。类似地,对于函数,foo&foo是相同的。但是*foo,它的本质是&foo, foo, *foo什么?

4

2 回答 2

4
于 2012-08-11T07:53:21.560 回答
1

在 C/C++ 中,函数只能以两种方式使用:您可以获取它的地址并且可以调用它。你不能用它做任何其他事情。

所以,foo是一个函数本身。C++ 有一个标准转换4.3 Function-to-pointer conversion。这意味着foo将自动转换为&foo. 表示法&&&&foo会导致语法错误。

在 C++5.3.1.1 Unary operators中,有一种措辞允许使用函数本身的结果来取消引用函数指针。这意味着*不应允许多个 '。尽管如此,它们至少在 MSVC 和 GCC 中工作。也许是这样,因为编译器Function-to-pointer conversion在取消引用之后立即应用,然后再处理下一个操作。

我没有看到允许多个*'s 和不允许多个&'s 功能的充分理由。出于某种原因,为*&操作实现了不同的逻辑。

You can try to cast foo to char* and dereference this pointer. It will contain bytes of the machine code. The length of these bytes is unknown. Read/write protection of this address is unknown too. Many CPU architectures allow setting execute bit without setting read and write bits. So, you can call the function but an attempt to read at this address may result in a crash.

于 2012-08-11T19:01:52.150 回答