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

C语言中对任意指针使用索引运算符的实际作用是什么?

索引运算符对指针的操作逻辑

C语言中[]下标运算符的语义是固定的:对于指针ptr和整数n,ptr[n]完全等价于 *(ptr + n),执行两步操作:

  • 先做指针偏移:根据指针指向的数据类型长度,计算ptr + n对应的偏移后地址
  • 再做解引用操作:读取偏移后地址中存储的对应类型的值

结果差异原因

你出现预期偏差的核心是混淆了「偏移后的地址本身」和「偏移后地址存储的值」:你以为ptr[n]等价于ptr + n,但实际上ptr + n只是第一步得到的地址,ptr[n]是第二步解引用后拿到的存储值,二者完全不同。

对应你的运行结果逐行解释:

  • ptr输出的是指针本身的值,也就是变量x的内存地址0115FBF4,符合预期
  • ptr[0]等价于*(ptr + 0) = *ptr,也就是取出x的值4,所以输出00000004
  • ptr + 1是偏移1个int长度后的地址,int占4字节,所以地址值加4得到0115FBF8
  • ptr[1]等价于*(ptr + 1),是读取地址0115FBF8中存储的值,但这个地址不属于你合法申请的内存(你只定义了单个int变量x,仅占ptr指向的4字节空间),属于越界访问的未定义行为,你看到的CCCCCCCC是Debug模式下编译器对未分配栈空间的填充标记,不同运行环境可能输出完全不同的结果
  • ptr + 5是偏移5个int长度后的地址,计算得0115FBF4 + 5*4 = 0115FC08,和输出一致
  • ptr[5]是读取偏移后地址的存储值,同样是越界访问的未定义行为,输出00000001没有实际意义。

额外提醒:只有当指针指向的是长度至少为n+1的同类型数组时,访问ptr[n]才是合法的,否则均属于未定义行为,程序行为不受保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:11