2010-10-16 72 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