深入理解 C++:指针、结构体与链表的核心概念与实践
在 C++ 编程中,指针、结构体和链表是构建复杂数据结构与高效算法的基石。无论是操作系统底层开发,还是高性能应用程序设计,这三者的灵活运用都至关重要。
一、指针:C++ 的 "内存指南针"
指针是 C++ 中最具代表性的特性之一,它本质上是一个存储内存地址的变量。如果把内存比作一座大楼,那么指针就像是房间的门牌号,通过它我们可以直接找到并操作对应的 "房间"(内存单元)。
1.1 指针的基本定义与使用
指针的定义格式为:数据类型 *指针变量名;,其中*是指针声明符,用于表明该变量是指针类型。例如:
// 定义一个指向int类型的指针p
int *p;
// 定义一个int类型变量a,并赋值为10
int a = 10;
// 将变量a的内存地址赋值给指针p(&是取地址符)
p = &a;
通过指针访问变量值时,需要使用解引用运算符*:
// 通过指针修改变量a的值
*p = 20;
printf=("%d",a);//输出值为20
1.2 指针的核心特性
- 空指针:指向 NULL(或 nullptr,C++11 后推荐使用)的指针,表明指针不指向任何有效内存,例如int *p = nullptr;,避免野指针(指向无效内存的指针)带来的风险。
- 指针的指针:即二级指针,用于存储指针变量的地址,格式为数据类型 **指针变量名。例如:
int a = 10; int *p = &a; int **pp = &p; // pp是二级指针,指向指针p -
指针与数组:数组名本质上是一个指向数组首元素的常量指针。例如int arr[5] = {1,2,3,4,5};,arr等价于&arr[0],通过*(arr+i)可以访问数组的第 i 个元素(与arr[i]效果相同)。
二、结构体:自定义数据类型的 "拼图工具"
C++ 中的基本数据类型(如 int、float、char)无法满足复杂场景的需求,而结构体(struct)允许我们将不同类型的数据组合在一起,定义出符合实际需求的自定义数据类型。
2.1 结构体的定义与使用
结构体的定义格式为:
struct 结构体名 {
数据类型 成员变量1;
数据类型 成员变量2;
// ... 更多成员变量
};
例如,定义一个表示 "学生" 的结构体:
// 定义Student结构体
struct Student {
// 成员变量:学号、姓名、年龄、成绩
int id;
string name;
int age;
float score;
};
使用结构体时,需要先创建结构体变量(即结构体实例),再通过点运算符. 访问成员变量:
// 创建结构体变量stu1
Student stu1;
// 给stu1的成员变量赋值
stu1.id = 2024001;
stu1.name = "张三";
stu1.age = 18;
stu1.score = 92.5;
2.2 结构体的进阶用法
结构体数组:存储多个结构体变量的数组,例如:
// 定义结构体数组,存储3个学生信息
Student students[3] = {stu1,stu2,stu3};
结构体指针:指向结构体变量的指针,通过箭头运算符-> 访问成员变量,例如:
Student stu;
Student *p = &stu; // 定义结构体指针p,指向stu
p->id=2024001;
p->name="张三";
p->age=18;
p->score=92.5;
小结:
其实学过java的朋友能发现,这其实就是面对对象编程,结构体这个概念与java当中的类有许多的相似之处。
三、链表:基于指针与结构体的 "动态数据链"
链表是一种常见的线性数据结构,它由多个节点组成,每个节点包含 "数据域"(存储数据)和 "指针域"(存储下一个节点的地址)。与数组相比,链表的优势在于动态扩容(无需预先指定大小)和高效插入 / 删除(无需移动大量元素)。
3.1 链表的节点结构
链表的节点通常通过结构体定义,包含数据域和指针域(指向同类型节点的指针)。以存储 int 类型数据的单链表为例:
// 定义链表节点结构体
struct ListNode {
int data; // 数据域:存储节点数据
ListNode *next; // 指针域:指向后一个节点的指针
};
3.2链表的功能
单链表的基本操作包括:创建链表、插入节点、删除节点、遍历链表、销毁链表等。
四、指针、结构体与链表的关联总结
指针、结构体与链表三者并非孤立存在,而是紧密关联、层层递进的关系:
- 结构体为链表提供节点模板:链表的节点需要同时存储数据和指针,结构体的 "多成员组合" 特性恰好满足这一需求,定义出包含 "数据域" 和 "指针域" 的节点结构。
- 指针为链表提供节点连接方式:链表的节点通过指针域(如next)连接,形成链式结构,实现节点的动态访问与操作。
- 三者结合实现灵活数据存储:通过结构体定义节点类型,通过指针实现节点间的连接与操作,最终构成链表,解决了数组固定大小、插入删除效率低的问题。
更多推荐
所有评论(0)