int、float、char等是系统已经定义好的数据类型,但是在处理较复杂的问题上,基本的数据类型并不能满足要求,但C语言允许用户根据需要自己建立一些数据类型,用来定义变量。
首先申明最简单的结构体struct Date
{
int month;
int day;
int year;
};
struct是结构体的关键字,不能省略。Date是结构体名,用来区分不同的结构体。
struct和Date共同组成结构体类型的名字。
month、day、year称为结构体成员。
struct Student
{
int num;
char name[20];
char sex;
int age;
struct Date birthday;
char addr[30];
};
上面只是对结构体的声明并没有定义结构体变量,所以内存中并没有为结构体变量分配空间,也无法对结构体变量赋值。
我们声明结构体是为了使用结构体变量实现我们需要的功能,仅仅申明结构体是没有任何作用的,定义结构体变量有如下三种方式:
struct Student student1,student2;
struct Student结构体类型名,student1,student2结构体变量名。
struct Student
{
int num;
char name[20];
char sex;
int age;
struct Date birthday;
char addr[30];
}student1,student2;
第二种方式与第一种方式的功能都是一样的,区别就是在声明结构体类型时已经想到了定义几个结构体变量以及结构体变量的名字。
如果后期需要增加该类型的结构体变量,可以用方式一继续增加变量,如下:
struct Student student3;
struct
{
int a;
char b;
float c;
}ABC,BCD;
这种类型只能定义两个变量即ABC和BCD,无法后续增加该结构体类型的结构体变量。这种方式搭配typedef关键字在嵌入式应用的非常多。
上面介绍了如何声明结构体类型和如何定义结构体变量,但实际使用中一定要对结构体变量赋值和初始化。
①在申明结构体类型时,定义变脸并对其付初值,如下:struct Student
{
int num;
char name[20];
char sex;
}student1={2021,“LiMing”,‘M’},student2={2021,“LiMei”,‘W’};
定义了两个变量并对其赋初值;
struct Student
{
int num;
char name[20];
char sex;
};
struct Student student1={2021,“LiMing”,‘M’};
struct Student student2={2021,“LiMei”,‘W’};
struct Student
{
int num;
char name[20];
char sex;
};
struct Student student1 = {.neme = “LiMing”};
struct Student student2 = {.neme = “LiMei”};
数值型的成员系统会初始化为0;
字符型的成员系统会初始化为‘ ’
指针型的成员系统会初始化为NULL;
student1.num = 2022;
student1.name = “WangMei”;
"."是成员运算符,它在所有运算符的优先级中是最高的,可以将student1.num看作成为一个变量。
下面是错误做法:
printf("%sn",student1);
正确的做法是将结构体每一个成员变量单独输出,如下:
printf("%dn",student1.num);
printf("%sn",student1.name);
printf("%cn",student1.sex);
struct Date
{
int month;
int day;
int year;
};
struct Student
{
int num;
char name[20];
char sex;
int age;
struct Date birthday;
char addr[30];
}student1,student2;



