我现在有点糊涂了。 所以,如果我编写以下代码:
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
指针的地址似乎也应该是十六进制值,但即使是二进制或十进制,为什么总是一样呢?
如果查看以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;