C++中访问「数组指针」的元素值为何无需使用解引用运算符*
下标运算符
[]的内置语义是规则核心 - 首先要明确:C里的下标运算符
[]从来不是数组的专属语法,它的原生定义就是作用于指针类型的。按照C标准的硬性规定,任意表达式x[y],完全等价于*(x + y),不存在任何额外的隐式转换或特殊逻辑。 - 这也就解释了你代码里的运行结果:
pointer是指向val数组首元素的double*类型指针,当你写下pointer[n]时,语法层面已经自动完成了「指针偏移+解引用」的全流程,根本不需要手动加*运算符。
对应到你代码里的逐行等价转换
把你写的三个下标表达式完全展开,就能看到内置的解引用动作:
pointer[0]→ 展开为*(pointer + 0)→ 等价于*pointer,直接取指针指向的首元素值-3.1415pointer[1]→ 展开为*(pointer + 1)→ 指针向后偏移1个double类型所占的内存长度,再解引用取值,对应数组第二个元素6.2430pointer[2]→ 展开为*(pointer + 2)→ 指针向后偏移2个double类型的内存长度,再解引用取值,对应数组第三个元素37
常见认知误区澄清
很多人误以为“只有数组才能用[]访问元素”,本质是搞反了语法的实现顺序:
- 数组名在绝大多数表达式场景下,会自动退化为指向数组首元素的指针,所以你写
val[i]的时候,底层走的逻辑和指针用[]是完全一致的——先把val转成&val[0]类型的指针,再按*(val + i)的规则运算,从来没有针对数组的特殊下标逻辑。 - 如果你手动在
pointer[i]前面再加*,比如写成*pointer[0],反而是完全错误的:因为[]的运算符优先级高于*,代码会先算出pointer[0]得到一个double类型的数值,再尝试对这个普通数值做解引用,直接触发类型不匹配的编译错误。 - 顺着
x[y] ≡ *(x+y)的等价规则,其实0[pointer]和pointer[0]的运行效果完全一致,这不是什么语法黑科技,只是加法交换律的自然推导结果。
内容的提问来源于stack exchange,提问作者Imahn
相关产品推荐
相关产品推荐

