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

指针初始化/解引用:两段C代码的语法差异及解析

数组指针与普通int指针的差异及解引用说明

先明确两段代码的核心逻辑差异:

1. 指针类型的本质区别

  • int(*a)[5]:这是指向包含5个int元素的数组的指针(俗称数组指针)。它的指向对象是整个数组,而非单个int元素。
  • int *y:这是指向单个int元素的指针(普通int指针)。它的指向对象是数组里的某一个int值。

再看初始化逻辑:

  • 第一段中a = &b:数组b的类型是int[5],&b取的是整个数组的地址,这个地址的类型正好是int(*)[5],和a的类型完全匹配,赋值合法。
  • 第二段中int *y = b:C语言里,数组名b会自动隐式转换为指向数组首元素的指针(即&b[0]),类型是int*,和y的类型匹配,因此y最终指向b[0]的地址。

2. 解引用操作的逻辑解析

第一段的*(*a+i)

分解执行步骤:

  1. a是指向数组b的指针,*a对数组指针解引用后得到数组b本身,此时数组名b会再次隐式转换为指向首元素的指针(int*类型,指向b[0])。
  2. *a + i:首元素指针向后偏移i个int的内存大小,得到b[i]的地址。
  3. 外层的*解引用该地址,最终拿到b[i]的值,循环中依次输出1、2、3、4、5。

第二段的*y+i

这里要注意运算符优先级:*的优先级高于+,实际执行顺序是:

  1. *y解引用y,拿到y指向的b[0]的值(即1)。
  2. 将该值与循环变量i相加,得到1+i。恰好你的数组b元素是1,2,3,4,5,1+i刚好等于b[i],所以输出结果和第一段一致——这是巧合,如果数组元素不是从1开始的连续值,两段输出会完全不同。

如果想让第二段逻辑和第一段完全对应(直接取b[i]),应该写成*(y+i):先让y偏移i个位置,再解引用拿到b[i]的值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:50:47