我如何知道指针指向的特定地址是什么?我想在这个地址位置打印内容?我应该添加什么作为占位符?
答案 0 :(得分:3)
如果您的问题是 - 如何推断出由void*
表示的给定位置存储的对象的类型,那么您不能。如果你的问题是如何知道我的void*
指向的字节的值,那么它是
unsigned char valueAtAddressP = *((unsigned char*)p);
答案 1 :(得分: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 :(得分:2)
任何其他指针类型都可以强制转换为void指针以打印其地址:
char c='A';
char *pc=&c;
printf("%p",(void *) pc);
现在,如果你想要这个地址的角色:
char c='A';
char *pc=&c;
printf("%c",*pc);
答案 3 :(得分: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
。
答案 4 :(得分:1)
您可以通过多种方式实现
int x = 5;
int *ptrX = 6;
printf("The pointer of x is: %d", &x);
printf("The ptrX is: %d", ptrX);
上述两种方法都为您提供了地址值。