0

我对取消引用 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不够吗?

谢谢

4

3 回答 3

2

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

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

我以为取消引用时应该打印数字1,但实际上打印的是地址

您没有通过(void *)操作取消引用任何内容,您正在转换为 void *. 要打印所指向的对象的值,iptr您需要使用d带有参数的转换说明符*iptr(这里是取消引用iptr指针)。

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

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

iptr 还不够吗?

iptris a int *butp转换说明符需要 a void *,因此如果没有强制转换,它将调用未定义的行为。

于 2013-01-14T22:54:44.393 回答
1

编写(void*)iptr时,将指向 int指针转换为指向 void的指针。取消引用指针被写为*iptr. 这将采取价值iptr点。

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

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

这将显示

*iptr=1

于 2013-01-14T22:55:09.657 回答
1

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

试试这个 printf("iptr=%p, vptr=%p\n", *iptr, (void *)vptr);:)

于 2013-01-14T22:56:14.857 回答