为什么c ++函数的地址总是为True?

时间:2011-05-16 20:20:48

标签: c++ gcc function-pointers

为什么会这样,

#include <iostream>

using namespace std;

int afunction () {return 0;};

int anotherfunction () {return 0;};

int main ()
{
    cout << &afunction << endl;
}

给这个,

1

  1. 为什么每个函数都能解决?
  2. 如果所有函数共享(看起来)相同的地址,函数指针如何工作?

7 个答案:

答案 0 :(得分:16)

函数地址不是“true”。接受任意函数指针的ostream没有重载。但是有一个布尔值,函数指针可以隐式转换为bool。因此编译器会将afunction从其实际值转换为truefalse。由于您在地址0处无法使用此功能,因此打印的值始终为truecout显示为1

这说明了为什么隐式转换通常不受欢迎。如果转换为bool是明确的,那么您将遇到编译错误而不是默默地做错事。

答案 1 :(得分:3)

开箱即用的std::ostream不支持函数指针类型。您的指针只会转换为可能的兼容类型 - bool - 由于向后兼容C,因此非{0}的东西是true

答案 2 :(得分:2)

函数指针(流操作符除外)没有operator<<的重载,但bool有一个,所以函数指针在显示之前转换为该类型。

地址不相等,但它们都是非空的,因此它们都转换为true

答案 3 :(得分:1)

没有重载函数:operator<<(ostream&, int(*)()),因此您的函数指针将转换为唯一有效的类型bool。然后operator<<(ostream&, bool)正在打印转换后的值:1。

您可以像这样打印功能地址:

cout << (void*)&afunction << endl;

答案 4 :(得分:0)

C ++中的所有地址都不为零,因为零是NULL指针并且是保留值。任何非零值都被视为真。

答案 5 :(得分:0)

iostream的函数指针不能重载&lt;&lt;运算符,因为有无数个可能的函数指针类型。因此,函数指针会应用转换,在本例中为bool。尝试:

cout << (void *) afunction << endl;

哪个会给你十六进制的地址 - 对我来说结果是:

0x401344

答案 6 :(得分:-1)

你也检查了anotherfunction()吗?

无论如何,C ++指针地址,如C指针地址,通常在大多数平台上是虚拟的,并不直接对应于内存位置。因此,价值可能非常小或不寻常。

此外,它们将始终为真,因为0NULL,指针无效,且任何超过0的内容都为真