2013-02-18 224 views
0

我有一個「無符號int *」值,我需要將它轉換爲一個簡單的「無符號整型」, ,所以我可以將其轉換爲函數。但不幸的是, 當我嘗試做一個簡單的演員,價值得到改變:C/C++:如何正確地將「unsigned int *」值轉換爲「unsigned int」?

Code: 

unsigned int * addr; 

... 

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); 
fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned int)addr); 


Output: 

=== addr: fc880000 === 
=== casted addr: 400eff20 === 

請告訴我,如何將這個值正確轉換,因此它不會在轉換過程中的變化?

+3

...有沒有C/C++你使用哪一個? – Mike 2013-02-18 14:10:54

+1

您正在打印兩個不同的變量:'addr'和'address'! – 2013-02-18 14:12:14

+0

@Mike C,但C++解決方案也會很有趣。 – 2013-02-18 14:12:22

回答

4

只需使用*addr。這是有效的,應該始終有效。如果您需要獲取指針的而不是指針指向的值,則需要更大的類型。通常,unsigned int*的值是64位,而unsigned int只有32位。

+0

非常感謝!似乎我需要一個更大的類型。演員(長無符號整數)工作完美! – 2013-02-18 14:26:49

+0

我不會說int的大小通常是32.特別是現在有很多64位系統。 – 2013-02-18 14:47:50

+0

@JakeBadlands有兩個標準整數類型明確地用於保存指針值:intptr_t和uintptr_t,具體取決於您希望整數值是有符號還是無符號。根據平臺的具體情況,其他任何內容都不能保證是合適的大小。 – syam 2013-02-18 14:56:33

1

當你聲明的指針,就像

unsigned int * addr; 

該指針的值將是unsigned int它指向的地址。

當你想要得到的unsigned int的價值它指向您使用引用操作*

unsigned int value = *addr; 

所以你在第二輸出線所看到的就是addr點的內容。

1

如果您有某種類型的指針,並且您需要將其轉換爲類型,則只需要遵守指針。

void foo(unsigned int some_value); 

... 

int main() 
{ 

    unsigned int * addr = 0x12345678; // some address holding an unsigned int 
    foo(*addr); // some function taking a unsigned int 

由於您沒有更改類型,因此無需在此處指定任何類型。請注意,在您的代碼中,「值」不會更改:

// prints the address 
fprintf(stdout, "=== addr: %08x ===\n", addr); 

// prints the value at that address 
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)addr); 
1

您沒有更改該值。

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); 

您正在訪問指針的地址。

fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address); 

您正在訪問的價值指向。

+0

對不起,我包含了錯誤的代碼示例。現在修好 – 2013-02-18 14:18:57

+1

好吧,就像別人說的那樣,像fprintf一樣取消引用你的指針(stdout,「=== castted addr:%08x === \ n」,(unsigned int)(* addr)); – 2013-02-18 14:22:54