我对取消引用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
不够吗?
由于
答案 0 :(得分:2)
当我们做(void *)iptr时,我们实际打印的是什么?
您正在以实现定义的方式打印iptr
指针的值。
我认为在解除引用时,它应该打印数字1,但它实际上会打印一个地址
您没有使用(void *)
操作取消引用任何内容,而是转向void *
。要打印iptr
指向的对象的值,您需要将d
转换说明符与参数*iptr
一起使用(此处为解除引用iptr
指针)。
为什么有必要在前面添加(void *)才能打印地址?
因为p
转换说明符需要类型为void *
的参数。
ip不足够吗?
iptr
是int *
但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);
:)