一.自定义数据类型:
C语言允许程序员自己定义符合实际需要的数据类型,一旦这些类型被定义后,
则可以和基础类型一样使用;
1. 结构体类型:
作用: 用于存储多个不同类型的数据;简单来说,就是将多个不同基础类型的数据
组织成一个完整的类型
1.1 定义格式:
struct 结构体名
{
成员列表;
};
注意事项: 1. struct 和 结构体名 共同代表结构体类型
2. 结构体可以嵌套定义,
例子: struct student
{
int num;
char name[20];
char sex;
int age;
float score;
int char addr[30];
struct birth
{
int year;
int month;
int day;
}birthday;
};
1.2 结构体变量定义:
1) 结构体类型定义完成后,利用该类型定义变量:
struct 类型名 变量列表;
例如: struct student stu1,stu2;
2) 定义结构体类型的同时定义变量;
struct 结构体名
{
成员列表;
}变量列表;
例子:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2;
num = 890; error
stu1.num = 8090; success
3) 定义无名结构体类型的同时定义变量;
struct
{
成员列表;
}变量列表;
无名结构体只能在定义时定义变量,此外我们就无法再次根据 结构体类型 去定义其他变量了
因为结构体是无名的,则相当于也就没有类型了;
4) 也可以定义结构体数组,指针变量;
struct 类型名 数组名[数组大小];
struct 类型名 *指针名;
注意事项: 1. 结构体其实相当于一个数组,只是说结构体中存放的数据类型可以不同;
2. 结构体变量不能整体访问,但同类型的结构体变量可以相互赋值;
3. 结构体变量是不能直接使用运算符: + - * / < > == 等
1.3 结构体成员的访问:
结构体变量名.成员名
结构体指针名 -> 成员名
1.4 结构体变量的初始化
结构体变量可以在定义的同时初始化;
struct student
{
int num;
char name[20];
char sex;
};
1) 给全部成员赋初值:
例子:
struct student stu = {10067,"peter",'M'};
2) 给部分成员赋初值:(未被初始化的成员,如果是数值类型,则初始化为0,字符类型,初始化为'\0')
例子:
struct student stu = {10067};
3) 给指定成员赋初值(未被初始化的成员,如果是数值类型,则初始化为0,字符类型,初始化为'\0')
例子:
struct student stu = {
.name = "lucy";
};
1.4 结构体数组和指针变量
1.5 结构体求大小
规则 1.成员按照自身的对齐值对齐:如果不在对齐边界,编译器会在加上填充字节
2.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会
在最末一个成员之后加上填充字节(trailing padding)