指针,栈和链表(提示:我发布内容有习题)
2025-09-23 16:15:01
发布于:浙江
一、指针:内存的"快递单号"
比喻:就像快递单号能找到包裹一样,指针是能找到内存数据的"号码牌"
基础要点:
&是"取地址"运算符(查单号)
int num = 10;
cout << # // 输出类似0x7ffe...(内存地址)
*有两种含义:
声明时:表示这是个指针变量
int* ptr; // ptr是个整型指针
使用时:表示"取包裹内容"
cout << *ptr; // 输出ptr指向的值
简单示例:
int main() {
int box = 888; // 一个装数字的盒子
int* courier = &box; // 快递员记下盒子地址
cout << "盒子里的值:" << *courier << endl; // 查看包裹
*courier = 999; // 修改盒子里的内容
cout << "新值:" << box; // 输出999
}
二、栈:叠盘子的小食堂
比喻:像食堂叠放的盘子,总是拿最上面的那个(后进先出)
特点:
自动管理(放盘子/拿盘子不用操心位置)
函数调用就用这个原理
可视化示例:
调用顺序: breakfast() → eat() → drinkCoffee()
调用栈:
┌─────────────┐
│ drinkCoffee │ ← 当前执行这里
├─────────────┤
│ eat │
├─────────────┤
│ breakfast │
└─────────────┘
简单代码:
#include <stack>
using namespace std;
int main() {
stack<string> plates;
plates.push("鱼香肉丝"); // 放盘子
plates.push("红烧肉");
plates.push("青菜");
while(!plates.empty()) {
cout << "吃掉:" << plates.top() << endl;
plates.pop(); // 拿最上面的盘子
}
// 输出顺序:青菜 → 红烧肉 → 鱼香肉丝
}
三、链表:小朋友手拉手
比喻:像幼儿园小朋友排队,每人记住下一个是谁
基本结构:
struct Child {
string name;
Child* next; // 牵着的手
};
创建队伍:
int main() {
Child* head = new Child{"小明"};
head->next = new Child{"小红"};
head->next->next = new Child{"小刚"};
// 遍历队伍
Child* current = head;
while(current != nullptr) {
cout << current->name << " → ";
current = current->next;
}
cout << "NULL" << endl;
// 输出:小明 → 小红 → 小刚 → NULL
}
对比数组:
数组 链表
插入速度 慢(要挪位置) 快(改牵手关系)
查找速度 快(直接跳转) 慢(要逐个找)
四、三者的关系小故事
指针是基础:没有"快递单号"(指针),就找不到小朋友(链表节点)
栈管理调用:函数A调用函数B时,系统用栈记住A的位置(就像书签)
链表动态生长:不像数组要预先定大小,链表可以随时让新小朋友加入
常见困惑解答
❓ 问:为什么有时表示类型有时表示取值?
💡 答:就像在数学中既表示乘号(使用时)又可能表示特殊符号(声明时),根据上下文理解
❓ 问:栈为什么不能随便取中间的盘子?
💡 答:就像叠起来的盘子,拿中间的会导致上面的盘子摔碎,不安全!
这里空空如也
有帮助,赞一个