2016-12-02 22 views
3

這是我的測試代碼:瞭解無效*反對使用intptr_t和uintptr_t

int value = 0; 
void* addyvoid = static_cast<void*>(&value); // C++-style cast. 

它完美的作品,但我可以用uintptr_t/intptr_t。但是因爲人們說here太大,所以他們不太擅長控球。那麼,這是真的嗎?但是,如果是,拿着指針使用void*會更好,但會有數據丟失嗎?

+0

除非將其更改爲'reinterpret_cast',否則不能使用'uintptr_t' /'intptr_t',否則它將保留所需的數據 –

回答

6

intptr_tuintptr_t的目的是,在某些應用中,你其實需要做某種數值計算對指針值,也許通過翻轉個別位,也許他們XORing等。在這種情況下,你的時候需要使用數字指針的值,intptr_tuintptr_t是整數類型(如果它們存在)保證足夠大以容納任何指針。例如int的情況並非如此,因爲沒有指定相對於指針大小的int的大小。

由於這些轉換基本上是不安全的,因此C++要求您使用reinterpret_cast來轉換和從intptr_tuintptr_t和指針類型。

如果您所做的只是存儲「指向某個東西的指針」,並且假定該指針不是函數指針或成員函數指針,則可以將其轉換爲void*。該演員陣容保證工作,從void*回到原來的類型只需要static_cast,並保證是安全的。

intptr_tuintptr_t的大小不是避免它們的好理由。他們只是爲了不同的應用程序。如果您需要對指針進行數字計算,請使用這些類型。否則,如果您只需要存儲「指向某個東西的指針」,請使用void*