在 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链表的功能

单链表的基本操作包括:创建链表、插入节点、删除节点、遍历链表、销毁链表等。

四、指针、结构体与链表的关联总结

指针、结构体与链表三者并非孤立存在,而是紧密关联、层层递进的关系:​

  1. 结构体为链表提供节点模板:链表的节点需要同时存储数据和指针,结构体的 "多成员组合" 特性恰好满足这一需求,定义出包含 "数据域" 和 "指针域" 的节点结构。
  1. 指针为链表提供节点连接方式:链表的节点通过指针域(如next)连接,形成链式结构,实现节点的动态访问与操作。​
  1. 三者结合实现灵活数据存储:通过结构体定义节点类型,通过指针实现节点间的连接与操作,最终构成链表,解决了数组固定大小、插入删除效率低的问题。

更多推荐