【呜】如果要教你定义一个结构体

1、结构体三要素:struct、{}、“;”

  1. struct,不然怎么叫结构体;
  2. “{}”,里面要包含结构体要定义的东西
  3. C语言语句结束离不开“;”

按理有这些就可以定义结构体了。

2、经常把我们搞迷惑的2个位置

位置1:通常叫tag

位置2:有typedef时是声明,没有typedef时是定义的变量 

3、结构体的整体思维

我们是如何定义一个变量的?先写int,告诉编译器我们要用的类型和位宽(int),然后告诉编译器我们定义了一个变量名(本质是内存)x,最后我们完成赋值。

int x = 1;

那我们要怎么定义一个结构体变量?——找到现在谁能替代int就可以。

图1. 最基础版结构的使用

4、结构体声明

如果结构体成员有100多行,怎么办?像图1这样去定义每个结构体吗?代码会爆炸。所以,把结构体提前在外进行声明,并且你要找个名字在位置1上来替代这个结构体,比如Node,可以理解为指代了{...}这一部分。

因此,此时图1就可以转换为图2的定义

图2. 使用Node作为Tag来指代结构体

问:能否只用Node,不用struct Node?

答:不行,会报错,编译器不认识Node,只认识struct Node

图3. 编译器不认识Node

问2:如果没有位置1,行不行?

答:行,那就是匿名结构体。匿名结构体要套在别的聚合(结构体/联合体)类型中,才对

问3:如果只有位置2呢?

答:相当于在main函数外定义了一个名字叫x的全局结构体变量。

5、就是不想写struct 有什么招?—— typedef

图4. 最简版

使用typedef之后,把阴影部分,找了个替身MyNode,来代替了整个结构体。就像是int一样,找了个替身MyInt。替身和真主,都能同时起作用。

问题:下图Node t3,用的是哪个Node?

图5. 我是哪个Node?

答:用的是绿色框。因为同如果是红色的Node,报错将会同“unknown type name 'Node'; use 'struct' keyword to refer to the type”一样。但是此时,编译器能找到一个名叫Node的替身,它是合法的。那就用它吧。

6、我是声明/替身还是定义?

图6. x是定义,MyNode是typedef对某类型的声明

7、我可以嵌套我自己吗?(自引用)

答:自己包含自己不行(红圈是错的),因为编译器一定要到这个“;”,才能构建出结构体。否则,并不知道要分配多大内存呀。

图7. 错误示例

但是可以用指针,因为指针的位宽总是确定的。同样也不能用typedef定义的替身,因为编译器是一行一行扫描的,并不认识你最后的“替身”是谁。 

图8.通过指针自引用,且只能用struct + tag(位置1)
  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值