指標和整數之間的轉換

可以使用 reinterpret_cast 將物件指標(包括 void*)或函式指標轉換為整數型別。只有在目標型別足夠長時才會編譯。結果是實現定義的,通常產生指標指向的記憶體中位元組的數字地址。

通常,longunsigned long 足夠長以容納任何指標值,但標準不保證這一點。

Version >= C++ 11

如果存在型別 std::intptr_tstd::uintptr_t,則保證它們足夠長以容納 void*(因此任何指向物件型別的指標)。但是,它們不能保證足夠長以容納函式指標。

類似地,reinterpret_cast 可用於將整數型別轉換為指標型別。結果再次是實現定義的,但是通過整數型別的往返保證指標值不變。該標準不保證將零值轉換為空指標。

void register_callback(void (*fp)(void*), void* arg); // probably a C API
void my_callback(void* x) {
    std::cout << "the value is: " << reinterpret_cast<long>(x); // will probably compile
}
long x;
std::cin >> x;
register_callback(my_callback,
                  reinterpret_cast<void*>(x)); // hopefully this doesn't lose information...