2010-10-16 62 views

回答

2

任何其他指針類型可以轉換爲一個空指針,打印其地址:

char c='A'; 
char *pc=&c; 

printf("%p",(void *) pc); 

現在,如果你想在這個地址的字符:

char c='A'; 
char *pc=&c; 

printf("%c",*pc); 
3

如果你的問題是 - 你怎麼能推斷存儲在void*表示的給定位置的對象的類型,那麼你不能。如果你的問題是我怎麼能知道字節的值我void*點,那麼它是

unsigned char valueAtAddressP = *((unsigned char*)p); 
+0

應將'unsigned char'移植到具有補碼或符號/幅度和帶符號的plain-'char'類型的病態系統。 (在這些系統上,0x00/0xFF或0x00/0x80之間的區別將通過使用普通的'char'來摺疊)。 – 2010-10-16 18:43:58

+0

@R ..編輯。其實我不確定C中是否有無符號字符:) – 2010-10-16 18:46:13

1

您可以通過多種方式做到這一點

int x = 5; 
int *ptrX = 6; 
printf("The pointer of x is: %d", &x); 
printf("The ptrX is: %d", ptrX); 

上述兩種方法的給你地址值。

+0

這將只打印引號中的字符串...... – 2010-10-16 18:36:09

3

無法在C中檢測到您的應用程序應該將指針指向的數據視爲特定類型 - 取決於您的需求。

void treat_as_char(const void* ptr) 
{ 
    const char *p = ptr; 
    printf("Data: %s\n", p); 
} 

void treat_as_int(const void* ptr) 
{ 
    const int *p = ptr; 
    printf("Data (int): %d\n", p); 
} 

你需要一些自定義的結構,讓不同類型的特定指針:

typedef struct _Variant 
{ 
    enum {INT, CHAR, DOUBLE} type; 
    void *ptr; 
} Variant; 
2

另一種方式,你可以做到這一點是指你的數據作爲void*,然後是指,作爲一個unsigned char*,並以十六進制字節打印所有內容。我發現它在處理連續字節的時候非常有用,因爲它們的使用還不知道。

但是,此方法要求您有一種方法來知道您的數據有多長時間,因爲無法在任意類型的數據上調用sizeof

#include <stdio.h> 

int main() { 
    char name[16] = "hello there"; 
    void* voidBuffer = name; 

    unsigned char* buffer = voidBuffer; 
    int i; 
    for (i=0; i<16; i++) { 
     printf("%x ", (unsigned int)buffer[i]); 
    } 

    return 0; 
} 

這將輸出68 65 6c 6c 6f 20 74 68 65 72 65 0 0 0 0 0

+0

看起來您正在嘗試打印出該地址中的ASCII代碼,這並不是問題所在。 – antonio081014 2010-10-16 19:06:33

+0

@ antonio081014:至少對我而言,這並不明顯,至少對於什麼問題 – 2010-10-16 19:26:01

+0

+1當對象的類型未知時,最好的辦法是將值作爲十六進制轉儲打印出來。但是你必須小心不要訪問可能超出限制的地址。 – Ziffusion 2010-10-16 19:32:07