You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ptrptr[0]返回var的值而非指针ptr的内存地址?

为什么ptrptr[0]返回的是var的值而非ptr的地址?

先看你写的代码:

#include <stdio.h>

void pointers()
{
    int var = 20;
    int* ptr;
    ptr = &var;

    int *ptrptr = ptr;

    printf("Value at ptrptr[0] = %d \n", ptrptr[0]);
}

// Driver program
int main()
{
    pointers();
    return 0;
}

输出:

Value at ptrptr[0] = 20

问题核心是**ptrptr的类型定义错误**:

你想要让ptrptr存储ptr的内存地址,但你把它定义成了int*(一级指针),而非int**(二级指针,专门用来存储指针的地址)。

具体解析:

  1. 当执行int* ptrptr = ptr;时,ptr里存储的是var的地址(&var),这个值被直接赋值给了同是一级指针的ptrptr。这意味着ptrptr和ptr指向了同一个内存位置——也就是var的地址。
  2. C语言中,ptrptr[0]等价于*(ptrptr + 0),本质是取ptrptr指向地址里的内容,自然就是var的值20。

正确存储ptr地址的写法:

把ptrptr定义为二级指针,修改代码如下:

#include <stdio.h>

void pointers()
{
    int var = 20;
    int* ptr = &var;

    // 定义为二级指针,存储ptr的地址
    int **ptrptr = &ptr;

    // 打印ptr的地址(ptrptr指向的内容)
    printf("Address of ptr = %p \n", *ptrptr);
    // 打印var的地址(ptr存储的内容)
    printf("Address of var = %p \n", ptr);
    // 打印var的值(通过二级指针访问)
    printf("Value of var = %d \n", **ptrptr);
}

int main()
{
    pointers();
    return 0;
}

此时ptrptr[0]等价于*ptrptr,也就是ptr存储的var的地址(打印时需用%p格式符);若要通过ptrptr访问var的值,则需要用**ptrptr。

内容的提问来源于stack exchange,提问作者Dylan Dijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:36:30