结构体
结构体类型的定义
结构体也是一种数据类型,比如下面代码里的 student 就是 struct 结构体型变量:
struct student//srtuct是结构体的关键字,student是定义的结构体名;
{
int num;
char name[20];
char sex;
int age;
float score;//对各个成员一一进行类型声明;
};//不要忽略最后的分号;
注意点:
- 类型和变量是不同的概念,定义变量后系统会分配内存空间,而定义类型就不会;
- 结构体的成员也可以是结构体类型,即结构体可以嵌套,可以嵌套引用;
结构体类型变量的定义
先定义结构体类型再定义变量
对上面已定义的一个结构体 struct student ,可以用它来定义变量:
//只定义结构体变量:
struct student stud1,stud2;
student stud3,stud4;
//既定义变量又初始化:
struct student stud1={202210,"张明",'M',18,100};
上面定义的变量 stud1 等都具有struct student 类型的结构,都含有其相应的各个成员;
在定义结构体类型的同时定义变量
struct student stud1,stud2;
student stud3,stud4;
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
}stud1,stud2;
这样在结构体成员声明的后面紧跟变量,定义了两个struct student 类型的变量stud1和stud2,作为程序的全局变量,可以被程序的其他文件所使用;
直接定义结构体类型变量
struct//这种定义方式不出现结构体的类型名;
{
int num;
char name[20];
char sex;
int age;
float score;
}stud1,stud2;
结构体类型变量及其成员的引用
用小数点连接结构体变量名和其一成员名来作为一个可操作的变量,可以对其进行赋值,运算等等操作:
stud1.num=202210;
stud1.name[0]="张明";
stud1.sex='M';
stud1.score=100;
同类型的结构体变量之间可以直接用赋值号相互赋值,其效果等同于各个成员的依次赋值;
但要注意,不能将结构体变量作为一个整体进行输入输出,只能将其成员分别进行输入输出;
结构体数组
一个结构体变量可以存储一组数据,而一个结构体数组则可以存储多组数据,其初始化方法和普通数组一样,只是其中成员的数据类型可以不同;
共用体
共用体类型及其变量的定义
定义的方式和结构体一模一样,只是将关键字换成共用体 union ;
但二者含义大不相同,结构体变量每个成员分别占有自己的内存单元,而共用体变量所占的内存长度是所有成员中最长成员所占的长度;
共用体类型变量的引用
和结构体相同,引用依然是使用小数点,依然不能整体输入输出;
共用体数据类型的特点
同一内存段可以用来存放类型不同的成员,但一次只能存一个,存完一个若再存一个,原来的就被踢走了;
共用体变量的起始地址和其各成员的起始地址都是同一地址;
若在定义公用体变量的时候对它初始化赋值,那么只允许有一个数赋值给第一个成员;
可以定义共用体数组;
共用体的存在,一是为了节省空间,二是为了一些特殊的应用;
枚举类型
枚举类型的定义
枚举类型的关键字是 enum ,其定义的格式如下:
//enum 枚举类型名 {枚举常量列表};
enum day {Sun,Mon,Tue,Wed,Thu,Fri,Sat};
其中每个枚举常量是一个用标识符表示的整型常量;
默认第一个整型常量的值为1,第二个的值为2,以此类推;
可以在定义的时候对枚举常量显式赋值,比如 Sum=1 ,则接下来的常量就从2开始往后依次递增;
枚举类型变量的定义
枚举变量的定义格式如下:
//enum 枚举类型名 枚举变量名列表;
enum day day1,day2,day3,day4,day5;
week week1,week2,week3,week4,week5;
//枚举类型的定义可以和枚举变量的定义一起写:
enum day {a,b,c,d} day1,day2,day3,day4;