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

sli*_*773 2 c pointers void memory-address

我正在使用LCTHW学习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);
Run Code Online (Sandbox Code Playgroud)

跑步给我这样的东西:

iptr=0x7fffa97a8464, vptr=0x7fffa97a8464
Run Code Online (Sandbox Code Playgroud)

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

printf("iptr=%p, vptr=%p\n", &iptr, &vptr);
Run Code Online (Sandbox Code Playgroud)

我明白了:

iptr=0x7fff61a21ee0, vptr=0x7fff61a21ed8
Run Code Online (Sandbox Code Playgroud)

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

rig*_*old 7

(void*)ptrptr在不改变其值的情况下转换为void指针.&ptr另一方面,产生指针本身的地址.换句话说,&ptr是指向指针的指针.iptr并且vptr是不同的对象,因此它们具有不同的地址.