指標和整數之間的轉換
可以使用 reinterpret_cast
將物件指標(包括 void*
)或函式指標轉換為整數型別。只有在目標型別足夠長時才會編譯。結果是實現定義的,通常產生指標指向的記憶體中位元組的數字地址。
通常,long
或 unsigned long
足夠長以容納任何指標值,但標準不保證這一點。
Version >= C++ 11
如果存在型別 std::intptr_t
和 std::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...