2013-07-26 50 views
2

我看到這種類型的代碼了很多項目,我的工作:reinterpret_cast指針的含義是什麼意思?

reinterpret_cast<long>(somePointer) 

,我不明白這一點。它通常用於用戶定義的類, 也就是說,somePointer是指向用戶定義的類的實例的指針。

感謝所有幫助

+0

看到這個 - http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to-whatever – 2013-07-26 12:12:05

+2

*「I在我工作的一個項目中,很多人都會看到這種類型的代碼:「* - 某人的項目被破解並且充斥着黑客,更可能發生。 –

+0

這很糟糕。指針長度可能不夠大。 –

回答

6

它用於指針的地址轉換成其數字表示,並將其存儲爲long

當您需要將指針存儲在不支持實際指針的特定上下文中時,通常會使用它。例如,某些API允許您傳遞一個數字鍵,這些鍵將從該API的任何回調中返回給您。您可以創建一個對象並將其轉換爲數字並將其提供給API。然後在回調中,您將該號碼轉回到pointer=reinterpret_cast<type*>(number)的指針,然後訪問您的數據。

+0

是的,這正是他們所做的。謝謝! – user2381422

+1

@ user2381422如果存在迂腐的風險,指針的大小可能會比長整型大,在這種情況下,該值可能會被截斷,從而導致關鍵衝突。 –

+0

它只會在讀回時爆炸,因爲如果它的一半已經消失,指針將會失效 – paulm

0

指針實際上只不過是一個整數值,它只是編譯器將其解釋爲內存地址。

這意味着如果其他整數類型足夠大以容納地址,則可以將其存儲爲其他整數類型(例如,不能將64位地址存儲在16位整數變量中)。

但由於C++認爲指針和正常的整數值爲截然不同的類型,你不能只是做一個正常的演員,你要問編譯器重新詮釋的指針作爲long,這是什麼reinterpret_cast呢。

0
reinterpret_cast<long>(somePointer) 

這段代碼由somePointer holded者地址強制轉換爲long,最好在C++ 11在此使用intptr_tuintptr_t的符號/無符號整數類型。它們能夠保存從void指針轉換的值,然後將其轉換爲具有與原始指針相等的值的類型。

0

正如其他人所說的那樣,將指針轉換爲整數值。這有點「危險」,因爲指針可能實際上不適合long。在cstdint中有一種稱爲intptr_t的類型,該類型旨在用於此目的。

reinterpret_cast<new_type>(value)真的是「把‘位’的value和轉換,以便它可以作爲new_type」 - 編譯器會只是做你問的是什麼,無論它使多大意義或不 - 因此,作爲一名程序員,您應該確保只以真正有用的方式來執行此操作 - 如果您碰巧從64位指針中刪除了32位,然後再嘗試將其設置爲指針如果指針「不好」之後就是你的錯。 reinterpret_cast應該只能作爲最後的手段,通常還有其他方法可以做同樣的事情。

0

reinterpret_cast<x>(exp)

重新解釋底層的比特模式,返回類型的值x

它指示編譯器以治療exp彷彿它有類型x

隨着比特序列reinterpret_cast你可以投射一個指向不同類型的指針,然後reinterpret_cast它回到原始類型來獲得原始值。

0

就像肖恩說的,它對於操縱指針就好像它們是數字一樣有用。

下面是the MSDN website使用它來實現一個基本的哈希函數的例子(注意,這裏使用一個unsigned int,而不是一個長期的,但原理是一樣的)

unsigned short Hash(void *p) { 
    unsigned int val = reinterpret_cast<unsigned int>(p); 
    return (unsigned short)(val^(val >> 16)); 
} 

這需要一個任意指針,併爲該指針生成(有效)唯一的散列值 - 將指針視爲unsigned int,將積分值與其自身的位移版本異或,然後將結果截斷爲unsigned short

然而,像其他人一樣,這是非常危險的,應該避免。

相關問題