(void *)指针和&指针之间的区别?

时间:2014-06-08 00:02:00

标签: c pointers void memory-address

我正在使用LCTHW学习C,我遇到了一些我感兴趣的指针,所以我发现了this。在浏览过程中,我找到了这段代码:

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);

跑步给我这样的东西:

iptr=0x7fffa97a8464, vptr=0x7fffa97a8464

显然,内存地址是相同的,所以C为它们打印出相同的东西。但是,在试验代码并放入时,而不是最后一行:

printf("iptr=%p, vptr=%p\n", &iptr, &vptr);

我明白了:

iptr=0x7fff61a21ee0, vptr=0x7fff61a21ed8

我打印出两个不同的内存地址,这不应该发生。第一个问题:如果这里的&符号表示“地址”,正如丹尼斯在帖子中所说,那么为什么这两行代码输出两个不同的东西?第二个问题:由于两行代码输出两个不同的东西,显然(void *)指针必须表示与&指针不同的东西。这两件事有什么区别?

2 个答案:

答案 0 :(得分:7)

(void*)ptrptr强制转换为void指针而不更改其值。另一方面,&ptr产生指针本身的地址。换句话说,&ptr是指向指针的指针。 iptrvptr是不同的对象,因此它们具有不同的地址。

答案 1 :(得分:4)

(void *)pointerpointer强制转换为指向void的指针 - 即指向任何内容的指针。另一方面,&pointer获取变量的地址(不是它指向的地址),因此如果pointer的类型为char *,则&pointer的类型将是char **。原因如下:

printf("iptr=%p, vptr=%p\n", &iptr, &vptr);

打印两个不同的值是因为虽然iptrvptr包含相同的值(它们指向相同的东西),但它们是两个不同的变量,因此变量本身是不同的。