指针初始化/解引用:两段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)
分解执行步骤:
a是指向数组b的指针,*a对数组指针解引用后得到数组b本身,此时数组名b会再次隐式转换为指向首元素的指针(int*类型,指向b[0])。*a + i:首元素指针向后偏移i个int的内存大小,得到b[i]的地址。- 外层的
*解引用该地址,最终拿到b[i]的值,循环中依次输出1、2、3、4、5。
第二段的*y+i
这里要注意运算符优先级:*的优先级高于+,实际执行顺序是:
*y解引用y,拿到y指向的b[0]的值(即1)。- 将该值与循环变量
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
相关产品推荐
相关产品推荐

