资讯详情

资讯详情

鹏哥c语言90学习笔记-多结构体理解-结构体嵌套使用

摘要在 C 语言中typedef结构体自引用是链表、树等递归数据结构的常见需求但写法不当极易踩坑。本文梳理 3 个必知陷阱别名在声明结束前不可用、匿名结构体无法自引用、嵌套结构体初始化易出错并给出正确的struct 标签名写法与适用场景助你一次写对。1. 问题引入typedef 结构体中的自引用陷阱在 C 语言中使用typedef为结构体定义别名十分常见但有一个容易踩坑的地方在 typedef 声明尚未完成时不能直接使用别名作为成员类型。下面这段代码就是典型的错误写法typedefstruct{intdata;Node*next;// ❌ 问题就在这一行}Node;这段代码会编译报错原因在于typedef的别名Node要等到整个声明结束后才生效。而在结构体内部定义Node* next时编译器还不知道Node是什么类型自然无法通过编译。2. 正确写法使用 struct 关键字自引用正确的做法是在成员类型中使用完整的struct Node写法typedefstructNode{intdata;structNode*next;}Node;这里的关键区别是struct Node这个标签在typedef之前就已经存在所以结构体内部可以直接引用它。而Node只是typedef引入的别名在声明结束前不可用。3. 两种声明方式的等价性定义好之后struct Node和Node两种写法是等价的都可以用来声明变量structNoden1;Node n2;其中Node是typedef引入的别名struct Node是完整的结构体类型名。二者代表同一个类型只是写法不同。为了更直观地对比两种写法的差异下面用表格从「声明方式」「是否可用于自引用」「典型使用场景」三个维度进行梳理对比维度typedef struct Node { ... } Nodetypedef struct { ... } Node声明方式结构体带标签Nodetypedef为它引入别名Node匿名结构体typedef直接为整个结构体引入别名Node是否可用于自引用✅ 可以成员中使用struct Node* next即可❌ 不可以声明结束前别名Node尚不可用典型使用场景链表、树等需要自引用的递归数据结构普通结构体无需自引用仅作一次性类型定义简要说明带标签的写法typedef struct Node { ... } Node因为结构体标签Node在typedef之前就已存在所以结构体内部可以借助struct Node完成自引用而匿名写法typedef struct { ... } Node在声明结束前别名Node尚未生效无法在成员中引用自身因此只适合不需要自引用的普通结构体。上图展示了结构体在内存中的布局方式可以看出成员在内存中按声明顺序依次排列。4. 综合案例结构体的嵌套使用结构体不仅可以自引用还可以嵌套其他结构体作为成员。下面这个综合案例演示了嵌套结构体的用法#includestdio.hstructpoint{intx;inty;}p1{2,3};structscore{intn;charch;};structStu{charname[20];intage;structscores;};intmain(){structpointp2{3,4};structStus1{zhangsan,20,{100,q}};printf(%s %d %d %c,s1.name,s1.age,s1.s.n,s1.s.ch);return0;}在这个例子中struct Stu嵌套了struct score作为成员s。初始化时使用{100,q}为嵌套结构体赋值输出结果为zhangsan 20 100 q5. 易错点小结typedef 别名在声明结束前不可用结构体内部自引用时必须使用struct 标签名写法。struct Node与Node等价前者是完整类型名后者是 typedef 别名二者可以混用。嵌套结构体初始化嵌套成员需要使用{}包裹进行初始化如{100,q}。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →