结构体、枚举和共用体
本文将分别讲述C语言中关于结构体、枚举和共用体的相关知识。
用typedef说明一种新类型名
1.一般形式:typedef 类型名 标识符;
其中,”类型名”一定是在此语句之前已有定义的类型标识符。”标识符”是一个用户定义标识符,用来标识新的类型名。
2.typedef语句作用:用”标识符”来代表已存在的”类型名”,并没有产生新的数据类型,因此原有的类型名依然有效。
3.声明一个新的类型名的具体步骤:
①先按定义变量的写法写出定义的主体(如: float a;)
②将变量名换成新类型名(如 将a换为FLO)
③在最左边加上关键字typedef(如 typedef float FLO)
④然后可以用新类型名去定义其他变量 (如: FLO b;)
结构体数据类型
结构体用来存放一组不同类型的数据。
1.一般形式为:
1 | struct 结构体名{ |
2.结构体类型说明形式:
1 | struct 结构体标识名{ |
说明:
①”结构体标识名”和”结构体成员名表”都必须是合法的用户定义标识符。
②每一个”结构体成员名表”中都可以含有多个同类型的成员名,它们之间以逗号分隔。
③结构体类型说明中”类型名1”~”类型名n”,不仅可以是简单数据类型,也可以是某种结构体类型。当结构体说明中又包含结构体时,称为结构体的嵌套。
④ANSIC 标准规定结构体至多允许嵌套15层,并且允许内嵌结构体成员名与外层成员名相同。
结构体类型变量的定义
先声明结构体类型再定义变量名
如已定义了一个结构体类型 struct time ,可以如下定义:
1 | struct time time1,time2; |
time1和time2为struct time 类型变量,即它们都具有struct time 类型的结构。
在声明类型的同时定义变量
其一般形式为:
1 | struct 结构体名{ |
直接定义结构体类型变量
一般形式:
1 | struct { |
结构体变量的引用
引用结构体变量时应注意:
●结构体变量不能作为一个整体而对其进行任何操作,只能对结构体变量中的各个成员分别进行输入和输出等操作。结构体变量中的成员用以下方式引用: 结构体变量名.成员名
●如果结构体的某个成员本身又是一个结构体类型,则可以使用若干个成员运算符”.”,一级一级地找到最低的一级成员,只能对最低一级的成员进行赋值或存取运算。
●结构体变量的初始化,是指逐个对结构体变量的各个成员进行初始化的过程。
结构体数组
所谓结构体数组,是指数组中的每一个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体。
1.一般形式:
1 | struct 结构体变量名{ |
2.结构体数组的初始值应顺序地放在一对花括号中。
结构体指针(指向结构体的指针)
当一个指针变量指向结构体时,我们就称它为结构体指针。
结构体指针定义形式的一般形:
struct 结构体名 *变量名;
获取结构体成员
通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName 或 pointer->memberName
指向结构体数组的指针
结构体数组及其元素也可用指针指向。在使用指针变量指向结构体数组时,只要把该结构体数组中的每个元素当做普通的结构体变量使用即可。
用结构体变量和指向结构体的指针作为函数参数
●将一个结构体变量的成员作为实参传递给主调函数。
●用结构体变量作为一个整体实参
●C语言允许结构体变量的地址作为实参传递,这时对应形参应是一个基类型相同的结构体类型的指针。
▲结构体变量名代表整个集合本身,作为函数参数时传递整个集合,也就是所有成员,而非像数组一样被编译器转换为指针。若成员体较多,则开销大,影响效率。最好的办法是使用结构体指针,由实参向形参传递地址,效率高。
程序示列
计算全班学生的总成绩,平均成绩和以及140分以下的人数。
1 |
|
运行结果:
sum=707.50
average=141.50
num_140=2
枚举类型
C语言提供的枚举(Enum)类型,能够列出一个标识符的所有可能性。
枚举的一般形式为:
enum typeName{valueName1,valueName2,valueName3,…};
如: enum week{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};
说明: 枚举值默认从0开始,往后逐个加1(递增),即Mon、Tues、…Sun对应值分别为0、1…6。
枚举值也可指定 如:
enum week{Mon=1,Tues=2,Wed=3,Thurs=4,Fri=5,Sat=6,Sun=7};
或:
enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun};
共用体
共用体是一种类似结构体的构造数据类型,也包含了多个成员数据。
它的一般形式为:
1 | union 共用体名{ |
说明:
共用体有时也被称为联合或者联合体,这也是Union的本意。
共用体与结构体的区别在于:结构体的各个成员会占用不同的内存,相互之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的总和(成员之间可能会有缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
版权声明
Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。
本文永久链接:https://scholargeek.github.io/2018/02/18/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A09/