一、结构体类型定义

构造结构体类型
struct 结构体类型名
{
成员1的定义;
成员2的定义;
……
成员n的定义;
};
例如:
struct student
{
int name;
int age;
char sex;
int a[3];
};
1、定义成员的方式与定义普通变量的方式一样
2、成员列表必须用一对花括号括起
3、结构体名可以省略

二、定义结构体变量

第一种:先定义结构体类型名;再定义结构体变量
main()
{
struct student
{
int name;
int age;
char sex;
int s[3];
};/类型定义/
struct student stu1,stu2,st[10];/变量定义/
第二种:在定义结构体类型的同时可以定义结构体变量
struct student
{
int name;
int age;
char sex;
int s[3];
}stu1,stu2,st[10];
第三种:类型、变量同时定义、类型名student可以省略
struct
{
int sn;
int age;
char sex;
int s[3];
int*p;
}stu1,stu2,st[25];

三、结构体变量的初始化及引用

1、在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,
来进行对结构体变量的初始化。
若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋0。
2、结构体变量不能整体引用,只能引用它的成员。(同数组;相似)
引用结构体成员的方式:
结构体变量名.成员名
其中(.)为成员运算符
printf(“a1=%d,%s,%f”,a1); 错误
printf(“a1=%d,%s,%f”,a1.a,a1.b,a1.c);
结构体变量在内存中占用字节数为各成员占用字节数总和。

四、指向结构体数据类型的指针

1、指向结构体变量的指针
可以用指针变量指向结构的变量也可能用指针变量指向结构体变量中的成员
指针变量的类型必须与它所指向变量的类型相同
当指针变量指向结构体变量时,对指针变量加1则跳过整个结构体而不是跳过一个成员
struct student
{
int num;
char name[20];
char sex;
float score;
};//构造类型
struct student aa={2021,”jilili”,’M’,88.8};//赋初值
struct studentp=&aa;
char
q=aa.name;
intr=&aa.num;
引用aa中成员的方式有三种:
aa.num
(
p).num
p->num

aa.score
(p).score
p->score
2、指向结构体数组的指针
struct student
{
int num;
char name[20];
char sex;
float score;
};//构造类型
struct student stu[3]={
{2009,”da”,’M’,66.6},
{2019,”cong”,’M’,100},
{2021,”ming”,’W’,88.8}
};//赋初值
struct student
p=stu;
引用cong的方法
(*(p+1)).name
(p+1)->name
stu[1].name
(1)用结构体变量的成员作为实参,与普通变量作为实参的用法一样。
(2)用结构体变量作为实参时,要求形参必须是同一结构体类型的变量,
传递后形参与实参各对应成员值是一样的。
(3)也可以用结构体类型的地址作为实参,要求形参必须是同一结构体类型的指针变量或数组。
只要是地址传递,则可以通过形参来改变实参的值。

五、共用体类型

共用体中的所有成员公用同一段内存,起始地址一样。
格式:
union共用体名
{
成员列表;
};
1、成员列表为定义该共用体的成员,成员定义的方式与普通变量的方式一样。
2、成员列表必须用一对花括号括起。
3、共用体名可以省略。
共用体变量的定义:
1、先定义类型,再定义变量。
2、定义类型的同时,定义变量。
3、直接定义变量。
共用体类型变量的所有成员都共用同一段内存
共用体类型变量所占的字节等于该共用体类型占用字节数最多的成员所占的字节数

六、typedef

用typedef定义新类型名
在编程中可以用typedef定义新的类型名来代替已有的类型名格式:
typedef 已有类型名 新的类型名;
typedef int INTEGER;
以后在定义变量时int和INTEGER是等价的
1、typedef可用于定义各种类型名但不能定义变量
typedef语句最后的标识符必定是一个类型名而不是变量名
2、typedef只能对已经存在的类型新增一个别名,不是创造新类型