提问者:小点点

为什么从指针获得的地址总是相同的? [副本]


我现在有点糊涂了。 所以,如果我编写以下代码:

int x = 5;
cout << &x << endl;

编译它并运行,我将得到类似0x920FC7D的内容,这是内存位置的正常十六进制值。 但是当我编译并运行以下代码时:

#include <iostream>
using namespace std;

void add(int a, int b){
    cout << a + b << endl;
}

void subtract(int a, int b){
    cout << a - b << endl;
}

void multiply(int a, int b){
    cout << a * b << endl;
}

int main(){

    void ( *operations[3] ) (int, int) = {add, subtract, multiply};

    int length = sizeof(operations)/sizeof(operations[0]);

    for(int i=0; i < length; ++i){
        cout << operations[i] << endl;
    }

    return 1;
}

我总是得到:

1
1
1

指针的地址似乎也应该是十六进制值,但即使是二进制或十进制,为什么总是一样呢?


共2个答案

匿名用户

如果查看以std::Ostream&作为左手操作数的运算符<<的重载,您会发现没有作为右手操作数的指向函数的指针的重载。

但您正在插入函数指针。 那么,插入的是什么呢? 嗯,函数指针可以隐式地转换为bool,bool有一个重载。 All为1,因为所有转换后的值都为真。 这是因为没有一个函数指针为null,而null是唯一转换为FALSE的函数指针。

匿名用户

如果您在调试器中单步执行它,您将看到basic_ostream&; 正在调用运算符<<(bool_val)void(*)(int,int)没有流运算符。 如果要输出函数地址,可以强制转换为void*并输出

cout << reinterpret_cast<const void*>(operations[i]) << endl;