2012-12-30 30 views
1

我試圖地址的值存儲在非指針int變量,當我嘗試將其轉換我從‘詮釋*’的編譯錯誤「無效的轉換「詮釋」」這是我使用的代碼:我如何將指針爲int

#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 

vector<int> test; 

int main() { 
    int *ip; 
    int pointervalue = 50; 
    int thatvalue = 1; 

    ip = &pointervalue; 
    thatvalue = ip; 

    cout << ip << endl; 

    test.push_back(thatvalue); 

    cout << test[0] << endl; 
    return 0; 
} 
+0

從你的代碼中,存儲一個指針向量並打印它們將是同一件事。 – chris

+1

你爲什麼要那樣做?單獨的轉換不是很便攜(並不是每個環境都有'uintptr_t'),你可能想要對結果進行的任何算術運算都可以通過指針來實現,或者更不便攜。 – delnan

+0

如果您將指針值轉換爲整數類型,那麼您很可能會做錯某些事情。這是一個合法的轉換,如果你做得對(如果機器有*一些*整數類型,足以保持結果而不丟失信息),但99%的時間你最好只是將指針視爲指針。如果你告訴我們你想用指針值做什麼,你認爲使用整數可以更好地完成,也許我們可以幫助你在沒有轉換的情況下做到這一點。 –

回答

4

int可能不是大到足以存儲一個指針。

您應該使用intptr_t。這是一個明確足夠大的整數類型來存放任何指針。

intptr_t thatvalue = 1; 

    // stuff 

    thatvalue = reinterpret_cast<intptr_t>(ip); 
       // Convert it as a bit pattern. 
       // It is valid and converting it back to a pointer is also OK 
       // But if you modify it all bets are off (you need to be very careful). 
+0

我不忍心,int是不夠大,以容納任何指針?但是int的大小正好是4294967295,這就是FFFFFFFF的十六進制數,並且它們不是僅僅在內存中保存數字地址的指針,它在00000000和FFFFFFFF之間?這不是說int對於指針來說足夠大嗎?這是我對這個工作原理的理解,請糾正我錯誤的地方。 – user1934608

+0

@ user1934608:它不保證足夠大。在某些系統上它會很大,但不是在所有系統上。例如,一些64位系統需要64位指針,但它們的整數可能只有32位(儘管有些將有64位整數取決於它)。但'intptr_t'將永遠足夠大以容納一個指針而不會丟失信息。注意:我使用了一個macbook,我改變了你的代碼來使用'thatvalue = reinterpret_cast (ip)',我得到錯誤:'錯誤:從'int *'轉換爲'int'失去精度' –

+0

@LokiAstari:這很重要區分'int'(這是一個特定類型)和「整數」(它們是從'char'到'long long int'範圍內的一個類型集合)。例如,一個系統可能有一個32位'int'類型和一個64位* integer *類型(稱爲'long'或'long long')。 –

2

爲什麼你想這樣做,反正你只需要投中,C代碼:

thatvalue = (int)ip; 

如果你的寫作C++代碼,最好使用reinterpret_cast

+3

我建議使用類似'reinterpret_cast'的C++風格類型轉換而不是舊式的C類型轉換。 –

+1

reinterpret_cast的是比C風格的類型轉換好,究其原因:http://stackoverflow.com/questions/7831696/reinterpret-cast-vs-c-style-cast – benjarobin

+0

我想,剛纔,我認爲它給了產量不同來自指針地址。它打印了:「2293616」和「0x22ff70」,我所做的全部都是用'thatvalue =(int)ip;'替換了'thatvalue = ip;'行,我做錯了什麼?編輯:沒關係,只是GOOGLE了一個十六進制到base10轉換器,並找出我出錯的地方..大聲笑 – user1934608

5

你可以這樣做:

int a_variable = 0; 

int* ptr = &a_variable; 

size_t ptrValue = reinterpret_cast<size_t>(ptr); 
+6

使用''中的'std :: uintptr_t'。 – GManNickG

+0

@GManNickG ...謝謝你,我沒有意識到這一點。我使用'size_t'作爲它適應平臺上的指針大小。 – sgarizvi

+3

size_t可能會工作。但是'intptr_t'明確地被設計成一個可以保存指針值的整數(而不會丟失信息)。 –

2

我建議使用reinterpret_cast

thatvalue = reinterpret_cast<intptr_t>(ip); 
+2

正確使用reinterpret_cast。但不是整數。 –

+0

我認爲在OP的機器上int的大小足以存儲一個指針,但我同意你的觀點,通常最好使用'intptr_t'對於一些64位系統,所以我已經更新了我的答案。謝謝。 –