C++中*(数组指针+i)输出元素值而非地址,原因是什么?
理清C++指针的几个核心点
首先先给你吃个定心丸:你的基础理解是对的!
- 普通指针(比如
int*)存储的是一块内存的地址,指向的是该地址上的数据; - 二级指针(比如
int**)存储的是另一个指针变量的内存地址,简单说就是“指针的指针”。
接下来咱们拆解你的代码疑惑:
你的代码到底在做什么?
先看这段定义:
int* TestMas = new int[10] { 1,2,3,4,5,6,7,8,9 };
这里TestMas是一个int*类型的指针,它指向的是你动态分配的数组的第一个元素的内存地址(等价于&TestMas[0])。
然后看循环里的*(TestMas+i):
在C++中,指针的算术运算会自动适配指向类型的大小。比如TestMas是int*,int通常占4字节,那么TestMas+i实际上是计算出数组第i个元素的地址(TestMas的原始地址 + i * sizeof(int))。而*是解引用操作符,作用是取出该地址上存储的具体值——所以*(TestMas+i)完全等价于数组下标访问TestMas[i],自然输出的是数组的元素值,而不是地址。
如何输出数组元素的地址?
如果想打印每个元素的地址,你只需要直接使用TestMas+i(或者&TestMas[i]),并且用printf的%p格式符(专门用于打印地址):
for (size_t i = 0; i < 10; i++) { printf("%p\t", TestMas+i); }
关于你提到的&解引用报错的问题
你说尝试用&解引用报错,大概率是写法出了问题:
- 如果是想取元素的地址,
&TestMas[i]或者&*(TestMas+i)都是合法的(后者里*和&会抵消,结果和前者一样); - 如果是想取指针
TestMas本身的地址,那就是二级指针的范畴了,比如:int** pTestMas = &TestMas; // 此时*pTestMas就是TestMas的值(数组首地址),**pTestMas就是第一个元素的值1
如果你的报错是因为直接对*(TestMas+i)做了错误的操作,比如多嵌套了&,可以检查下语法是否符合指针的层级逻辑。
内容的提问来源于stack exchange,提问作者Raitis
相关产品推荐
相关产品推荐

