一)结构体的定义
结构体是由若干个成员组成的数据集合,每个成员可以具有不同的数据类型。结构体的定义形式如下:
struct 结构体名 {
成员列表
};
(二)结构体变量的定义和初始化
- 定义结构体变量的方式:
- 先定义结构体类型,再定义结构体变量,例如:
struct Student stu1;
- 在定义结构体类型的同时定义结构体变量,例如:
struct Student {
int id;
char name[20];
float score;
} stu2;
- 直接定义结构体变量,例如:
struct {
int id;
char name[20];
float score;
} stu3;
- 初始化结构体变量:可以在定义时进行初始化
(三)结构体成员的访问
结构体成员的访问可以通过点运算符(.
)或箭头运算符(->
)来实现。如果是结构体变量,使用点运算符;如果是结构体指针,使用箭头运算符。
四)结构体数组
结构体数组是由结构体类型的元素组成的数组。
可以通过循环遍历结构体数组来访问每个结构体元素的成员。
(五)结构体指针
结构体指针是指向结构体变量的指针。可以通过结构体指针来访问结构体变量的成员。例如:
(六)结构体与函数
结构体可以作为函数的参数传递给函数,也可以作为函数的返回值。
struct Student stu4 = {1001, "Tom", 90.5};
(七)指向结构体类型数据的指针
一、主要内容
- 定义:
- 首先需要定义结构体类型,然后才能定义指向该结构体类型的指针。例如:
struct Student {
int id;
char name[20];
float score;
};
struct Student *ptr;
在上述代码中,先定义了一个名为Student
的结构体,然后定义了一个指向Student
结构体的指针ptr
。
2.初始化:可以通过将结构体变量的地址赋给指针来进行初始化
指向结构体类型数据的指针可以作为函数的参数,传递结构体的地址,从而在函数内部修改结构体的成员值。
3.访问结构体成员:
使用指针访问结构体成员时,需要使用箭头运算符->
4.指针的移动和遍历:可以通过指针的移动来遍历结构体数组或链表等数据结构。例如,如果有一个结构体数组,可以通过指针的递增来依次访问数组中的每个元素。
5.作为函数参数:
指向结构体类型数据的指针可以作为函数的参数,传递结构体的地址,从而在函数内部修改结构体的成员值。
二、注意事项
-
内存管理:
- 在使用指向结构体类型数据的指针时,需要注意内存的管理,确保指针指向的结构体变量在使用时是有效的,避免出现野指针的情况。
- 当不再需要使用指针时,应及时释放内存,以避免内存泄漏。
-
类型匹配:
- 指针的类型必须与结构体的类型匹配,否则可能会导致编译错误或运行时错误。
- 在进行指针运算时,要注意指针的移动步长应该与结构体的大小相匹配。
-
指针的赋值和传递:
- 当将一个指针赋值给另一个指针时,实际上是复制了指针的值,即两个指针指向同一个结构体变量。如果对其中一个指针所指向的结构体进行修改,另一个指针也会看到这些修改。
- 在将指针作为函数参数传递时,实际上是传递了结构体的地址,函数内部对结构体的修改会影响到原始的结构体变量。
-
结构体的大小:
结构体的大小可能会因为字节对齐等原因而大于其成员变量的总大小。在使用指针操作结构体时,需要注意结构体的实际大小。 -
边界检查:
在使用指针遍历结构体数组或链表等数据结构时,要注意边界检查,避免指针越界访问。
(八)、用指针处理链表
一、链表的概念
链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以动态地增长或缩短,适用于需要频繁插入和删除元素的场景。
二、链表的基本操作
-
创建链表:
- 从空链表开始,逐个添加节点。每个节点通过动态内存分配来创建,并将其链接到链表中。
-
插入节点:
- 在链表的指定位置插入一个新节点。需要找到插入位置的前一个节点,然后修改指针,将新节点插入到链表中。
-
删除节点:
- 删除链表中的指定节点。需要找到要删除的节点的前一个节点,然后修改指针,将该节点从链表中移除,并释放其占用的内存。
-
遍历链表:
- 通过指针从链表的头节点开始,依次访问每个节点,直到到达链表的末尾。
三、用指针处理链表的步骤
定义链表节点结构体:
在这个结构体中,data
用于存储节点的数据,next
是指向下一个节点的指针
创建链表:
在这个函数中,我们使用malloc
函数动态分配内存来创建新节点,并将数据存储在节点中。然后,根据链表是否为空,将新节点插入到链表的头部或尾部。
插入节点:
在函数中,根据指定的位置将新节点插入到链表中。如果位置为1,则将新节点插入到链表的头部;否则,找到指定位置的前一个节点,将新节点插入到该节点的后面。
删除节点:
将没用的那个节点删掉。