为何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**(二级指针,专门用来存储指针的地址)。
具体解析:
- 当执行
int* ptrptr = ptr;时,ptr里存储的是var的地址(&var),这个值被直接赋值给了同是一级指针的ptrptr。这意味着ptrptr和ptr指向了同一个内存位置——也就是var的地址。 - 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
相关产品推荐
相关产品推荐

