我正在使用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 *)指针必须表示与&指针不同的东西。这两件事有什么区别?
答案 0 :(得分:7)
(void*)ptr
将ptr
强制转换为void指针而不更改其值。另一方面,&ptr
产生指针本身的地址。换句话说,&ptr
是指向指针的指针。 iptr
和vptr
是不同的对象,因此它们具有不同的地址。
答案 1 :(得分:4)
(void *)pointer
将pointer
强制转换为指向void
的指针 - 即指向任何内容的指针。另一方面,&pointer
获取变量的地址(不是它指向的地址),因此如果pointer
的类型为char *
,则&pointer
的类型将是char **
。原因如下:
printf("iptr=%p, vptr=%p\n", &iptr, &vptr);
打印两个不同的值是因为虽然iptr
和vptr
包含相同的值(它们指向相同的东西),但它们是两个不同的变量,因此变量本身是不同的。