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
相关产品推荐
相关产品推荐

