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,所以输出00000004ptr + 1是偏移1个int长度后的地址,int占4字节,所以地址值加4得到0115FBF8ptr[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
相关产品推荐
相关产品推荐

