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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:27:41