【问题标题】:Difference Between (void *)pointer and &pointer?(void *)pointer 和 &pointer 之间的区别?
【发布时间】:2014-06-08 00:02:00
【问题描述】:

我正在使用 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 *)pointer 的含义一定与 &pointer 不同。这两件事有什么区别?

【问题讨论】:

    标签: c pointers void memory-address


    【解决方案1】:

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

    【讨论】:

    • 那么我是否正确地说(void *)ptr 真正的意思是“地址”,而&ptr 并不是真正的意思,丹尼斯错了吗?
    • 嗯,实际上,我猜丹尼斯是对的,因为&ptr 的意思是“指针地址”
    • & 是地址运算符。 &ptr 获取指针的地址。如果你想要指向对象的地址,(void*)ptrptr 都会给你。
    • printf("iptr=%p, vptr=%p\n", iptr, vptr); 有效吗?
    • 是的。这将打印指向对象的地址(在本例中为val 的地址)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2019-09-29
      • 1970-01-01
      • 2016-12-05
      • 2011-04-30
      相关资源
      最近更新 更多