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

指针与数组转换问题及指针支持[]操作的原理咨询

指针[]操作与数组-指针转换的问题解答

核心结论

  • 不存在指针到数组的隐式转换,只有数组在多数语境下会自动转换为指向首元素的指针(比如赋值给指针变量、参与算术运算时)。
  • 指针可以使用[]下标运算符,是因为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),其中:

  1. 若E1是数组类型,则会先隐式转换为指向该数组首元素的指针;
  2. E2必须是整数类型(或可转换为整数的类型)。

这条规则同时适用于数组名和指针类型的E1,这就是指针能使用[]操作的根本原因。

内容的提问来源于stack exchange,提问作者mingyEx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:05:18