C语言中的结构体、共用体以及枚举类型
一、结构体
1、概述
为什么需要结构体?
在实际问题中,一组数据可能包含多种数据类型,比如描述一名学生时,需要用char类型的姓名,char或者int数据类型的学号,float类型的分数,等等,
结构体可以有效的解决这类问题。
实质
结构体本质上还是一种数据类型,它包含若干个“成员”,每个成员可以是不同数据类型的,基本数据类型或者构造数据类型。结构体有利于程序的阅读
理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。
定义结构体的一般形式:
struct 结构名
{
成员列表
};
成员列表由若干个成员组成,都是该结构体的组成部分,对于每个成员都需要进行类型说明,其形式为:类型说明符 成员名
2、定义结构体变量
(1)先声明结构体类型再定义变量名
struct student student1,student2;
(2)在声明结构体类型时同时定义变量
这种形式的定义的一般形式为:
struct 结构体名
{
成员列表
}变量名表列;
(3)直接定义结构体类型变量
一般形式为
struct
{
成员表列
}变量名表列;
//结构体名是可有可无的
3、结构体变量的引用
##注意:
(1)不能将一个结构体变量作为一个整体进行输入输出。
(2)如果成员本身也是一个结构体类型,则需要使用成员运算符一级一级地找到最低一级的成员。
(3)结构体变量的成员一样可以像普通变量进行各种运算。
引用结构体变量中的成员的方式为:
结构体变量名.成员名
由上面形式可以直接对结构体变量中的成员进行赋值。
4、结构体变量的初始化
struct 结构体名
{
成员表列
}结构体变量1,结构体变量2 = {...};
结构体变量1 = {... };
5、结构体数组
概念:即数组的每个元素都是结构体类型。
struct 结构体名
{
成员表列
}数组名[];
或者struct 结构体名 数组名[] ;
初始化:数组名[] = { ...};
6、指向结构体类型数据的指针
概念:结构体变量的指针就是该结构体变量所占据的内存段的起始地址。
结构指针变量说明形式一般为:
struct 结构名 *指针变量名;
指针变量名 = & 结构体变量名 // 指针变量赋值
将一个结构体变量的值传递给另一个函数:
(1)用结构体便变量的成员作参数
(2)用结构体变量作实参
(3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址给形参。
7、用指针处理链表
二、共用体
概念:使几个不同的变量共同占用一段内存的结构称为“共用体”类型的结构。
区别:结构体的各个成员占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占有内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存,
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来的成员的值覆盖掉。
定义共用体类型变量的一般形式:
union 共用体名
{
成员表列
}变量表列;
共用体首先定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。
共用体类型数据的特点
同一个内存段可以用来存放几种不同类型的成员,但在一瞬时只能存放其中一种,而不是同时存放几种。
共同体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
不能对共用体变量名赋值,也不能引用变量名来得到一个值,也不能在定义共用体变量时对它初始化
不能把共用体变量作为函数参数,也不能使函数返回共用体变量,但是可以使用指向共用体变量的指针
共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。
三、枚举类型
推荐学习:
枚举类型enum详解——C语言 - 蓝海人 - 博客园 (cnblogs.com)
原文:https://www.cnblogs.com/1013a/p/14979652.html