在前面取消引用(void *)

时间:2013-01-14 22:51:52

标签: c pointers dereference

我对取消引用C指针有些怀疑。给出以下代码:

void *vptr; // declare as a void pointer type
int val = 1;
int *iptr;

// void type can hold any pointer type or reference
iptr = &val;
vptr = iptr;
printf("iptr=%p, vptr=%p\n", (void *)iptr, (void *)vptr);

当我们(void *)iptr时,我们实际打印的是什么?我认为在解除引用时,它应该打印数字1,但它实际上打印了一个地址。这是为什么?为什么有必要在前面添加(void *)才能打印地址? iptr不够吗?

由于

3 个答案:

答案 0 :(得分:2)

  

当我们做(void *)iptr时,我们实际打印的是什么?

您正在以实现定义的方式打印iptr指针的值。

  

我认为在解除引用时,它应该打印数字1,但它实际上会打印一个地址

您没有使用(void *)操作取消引用任何内容,而是转向void *。要打印iptr指向的对象的值,您需要将d转换说明符与参数*iptr一起使用(此处为解除引用iptr指针)。

  

为什么有必要在前面添加(void *)才能打印地址?

因为p转换说明符需要类型为void *的参数。

  

ip不足够吗?

iptrint *p转换说明符需要void *,因此如果没有强制转换,则会调用未定义的行为。

答案 1 :(得分:1)

当您编写(void*)iptr时,将指针转换为int 指向指向void 的指针。取消引用指针将写为*iptr。这将使值iptr指向。

当您使用格式iptr打印%p时,会打印iptr指向的地址。它与&val相同。如果要打印值iptr,请使用格式%d

printf("*iptr=%d\n", *iptr);

这将显示

  

* IPTR = 1

答案 2 :(得分:1)

要在C / C ++中取消引用指针,请使用*符号。你实际上在做的是将iptr作为void指针。因此,您会看到打印的地址。

请改为尝试: printf("iptr=%p, vptr=%p\n", *iptr, (void *)vptr);:)