在现实生活中,对具体对象进行描述的时候,发现是比较复杂的,对象一般是由不同的类型组合在一起。例如:描述一个人的时候,习惯性会描述他的姓名,年龄,联系方式等。这些不同类型的数据互相联系在一起,就组成了一个有机的整体。在C语言中,如果想表示这个有机的整体,就要用到一种新的数据类型——
结构体(
struct
)。
一、结构体类型的声明
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
结构体的声明
struct tag {
成员列表;
}变量列表;
// struct 结构体关键字
// tag 结构体标签
// struct tag 结构体类型
比如描述学生,学生包括:
姓名
+
出生年月
+
性别
+
学号
这
4
项信息,这里只能使用结构体来描述了。
/*
描述学生:姓名
+
出生年月
+
性别
+
学号
学生
---->
是一个复杂对象
描述复杂对象
----
》结构体
-----
》自己定义的数据类型
*/
创建结构体类型
struct Student {
char name[50];// "张三"
char birthday[50]; // "1996-09-19"
int gender; // 1
char id[100]; // "20200102"
};
结构体成员的类型
结构体成员可以是普通变量,数组,指针,甚至是其它的结构体。
二、结构体变量及初始化
使用结构体类型,创建该类型对应的结构体变量
struct Student {
char name[50];
char birthday[50];
int gender;
char id[100];
}stu1,stu2,stu3;
// stu1,stu2.stu3 全局的结构体变量(不建议使用)
// 在函数内部使用结构体类型声明的变量是局部的结构体变量
void fun(){
struct Student stu;
......
}
特殊的声明
在声明结构体的时候,可以不完全声明。
//typedef struct Student {
typedef struct {
char name[50];// "张三"
char birthday[50]; // "1996-09-19"
int gender; // 1
char id[100]; // "20200102"
}Stu;
// 可以使用别名定义变量并初始化
Stu student = {"张三","1996-09-19",1,"20200102"};
三、结构体的自引用
在结构体中包含一个类型为该结构体本身的成员是否可以?
struct Node {
int ele;
struct Node next;
};
是否可行?
(不可行)
如果可以,那
sizeof(struct Node)
是多少?
(正确的自引用方式)
struct Node {
int ele;
struct Node* next; // 存放结构体指针类型的变量
};
四、结构体成员访问
打印学生的学号和姓名,使用
.
操作符(结构成员访问操作符)
保存
stu
变量的地址
利用
*[
解引用操作符
]
打印学号和姓名
上面的操作明显过于复杂,
C
语言中提供了箭头
(->)
,可以通过指针直接找到结构体变量的成员
typedef struct
Ele
{
int
ele
;
struct
Ele
*
next
;
}
Node
;
printf
(
"%s\n"
,
stu
.
id
);
printf
(
"%s\n"
,
stu
.
name
);
struct
Student
*
p_stu
= &
stu
;
printf
(
"%s\n"
, (
*
p_stu
).
id
);
printf
(
"%s\n"
, (
*
p_stu
).
name
);