指针与数组转换问题及指针支持[]操作的原理咨询
指针[]操作与数组-指针转换的问题解答
核心结论
- 不存在指针到数组的隐式转换,只有数组在多数语境下会自动转换为指向首元素的指针(比如赋值给指针变量、参与算术运算时)。
- 指针可以使用
[]下标运算符,是因为C++标准将[]定义为指针算术加解引用的语法糖,并非指针被转换成了数组。
代码示例分析
#include<iostream> using namespace std; int main() { int arr[10]; arr[3] = 10; int* p = arr; cout << p[3]; return 0; }
arr[3] = 10:数组名arr在这里隐式转换为指向首元素的int*指针,arr[3]等价于*(arr + 3),本质是通过指针算术访问内存中的第4个元素(下标从0开始)。int* p = arr:这里触发数组到指针的隐式转换,p成为指向arr首元素的指针。cout << p[3]:对于指针p,p[3]完全等价于*(p + 3),通过指针算术偏移3个int大小的内存,解引用后得到的就是arr[3]的值,所以输出10。
官方标准依据
C++标准的**[expr.sub]**(下标表达式)章节明确规定:
表达式
E1[E2]的语义等价于*(E1 + E2),其中:
- 若
E1是数组类型,则会先隐式转换为指向该数组首元素的指针;E2必须是整数类型(或可转换为整数的类型)。
这条规则同时适用于数组名和指针类型的E1,这就是指针能使用[]操作的根本原因。
内容的提问来源于stack exchange,提问作者mingyEx
相关产品推荐
相关产品推荐

