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

C语言结构体数组自赋值及指针运算逻辑疑问

C语言代码疑问解答

问题1:struct uu a[3] = {{5,a+2}, {8, a+1}, {11,a}};的初始化逻辑

C语言中,数组名a是代表数组首地址的常量,类型为struct uu *,编译阶段就已经确定了它对应的内存地址,不需要等所有元素初始化完成才可用。初始化时按顺序给每个元素的成员赋值:

  • a[0].x赋值为5,a[0].p赋值为a+2(等价于&a[2],指向数组的第三个元素)
  • a[1].x赋值为8,a[1].p赋值为a+1(等价于&a[1],指向元素自身)
  • a[2].x赋值为11,a[2].p赋值为a(等价于&a[0],指向数组的第一个元素)

初始化完成后三个元素的p成员形成了循环指向的链表结构,第一个循环输出结果为11 8 5。

问题2:指针运算修改指向的逻辑

C语言的指针加减运算的步长由指针指向的类型大小决定:struct uu *类型的指针每加减1,实际内存地址偏移量为sizeof(struct uu)字节,刚好对应数组中一个元素的长度。

我们以修改前的指向为基础逐行分析:

  • a[0].p原来指向a[2](值为a+2),执行a[0].p--后,步长减1,值变为a+1,指向a[1]
  • a[1].p原来指向a[1](值为a+1),执行a[1].p++后,步长加1,值变为a+2,指向a[2]
  • a[2].p原来指向a[0](值为a),执行a[2].p += 2后,步长加2,值变为a+2,指向a[2]

修改完成后第二个循环输出结果为8 11 11。

补充:后续fun调用的逻辑

fun参数是值传递,传入a[0]后形参d是a[0]的拷贝,修改d不会影响原a[0]:d.x = 5*3=15,d.p=NULL,返回值赋值给a[1]后,a[1].x变为15、a[1].p变为NULL,第三个循环输出5 15后触发break终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:03