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

这段C代码的运行原理是什么?ptr指针赋值逻辑存疑

这段C代码的输出为什么是2 7?

先看原代码:

#include <stdio.h>

int main()
{
   char a[]={1,2,3,4,5,6,7};
   char *ptr =(char*)(&a+1);
   printf("%d %d \n",*(a+1),*(ptr-1));

    return 0;
}

一、*(a+1)的结果(2)很好理解

  • 数组名a在表达式中会自动转换成指向数组首元素的指针,也就是&a[0]。
  • 因为数组元素是char类型,a+1会向后偏移1个char的字节数,直接指向a[1]。
  • 解引用*(a+1)等价于a[1],也就是初始化时的第二个元素2。

二、*(ptr-1)的结果(7)是核心,关键搞懂&a+1的逻辑

这里最容易混淆的是数组地址和元素地址的区别:

  • &a取的是整个数组的地址,它的类型是char (*)[7](指向长度为7的char数组的指针),不是指向单个char的指针。
  • 指针加法规则是:偏移量 = 指针指向类型的大小 × 加数。所以&a+1会向后偏移整个数组的大小(7个char,共7字节),最终指向数组a末尾的下一个位置(这个位置不属于数组元素,但指针指向这里是合法的,只要不解引用)。
  • 接下来把这个指针强制转换成char*类型赋值给ptr,此时ptr是普通的char指针,指向数组最后一个元素的下一个字节。
  • ptr-1就是把char指针向前移动1个字节,刚好落到数组最后一个元素a[6]的位置,解引用后就是初始化时的7。

用内存布局辅助理解(假设数组起始地址为0x100):

地址存储值对应位置
0x1001a[0]
0x1012a[1]
.........
0x1067a[6](最后一个元素)
0x107未知&a+1指向的位置

ptr强制转换后指向0x107,ptr-1回到0x106,对应的值就是7。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:42