小学生学C++编程语法知识(C++函数 :7、指针传递)
C++函数 第七课
《神奇的遥控器——指针传递(Pointer Passing)》
本课学习目标
学完本课,同学们能够:
✅ 理解为什么函数还需要指针传递
✅ 理解指针传递就是"传地址"
✅ 掌握指针作为函数参数的写法
✅ 理解*和&在函数参数中的作用
✅ 能区分值传递、引用传递和指针传递
第一幕:程序王国的新难题
1、上一节课。
我们已经学会了:
引用传递。
2、画图:
a ↑ ↓ x修改:
x = 100;其实就是:
a = 100;3、既然:
引用已经可以修改变量。
为什么C++还要有:
指针传递?
是不是:
多此一举?
4、国王笑着说:
"当然不是!"
今天。
我们学习另一种魔法。
第二幕:电视遥控器的秘密
1、国王拿出一个电视。
问大家:
如果:
我们要换频道。
是不是:
要把电视搬过来?
当然不用。
我们只需要:
遥控器。
2、遥控器里面有什么?
不是电视。
而是:
电视的位置。
3、画图:
遥控器 ↓ 电视地址 ↓ 电视程序也是一样。
有时候。
函数不需要整个变量。
它只需要:
变量所在的位置(地址)。
第三幕:地址是什么?
1、程序王国有很多房子。
100号房 ↓ 小明 200号房 ↓ 小红 300号房 ↓ 小刚2、如果想找小明。
需要:
名字?
还是:
地址?
当然:
地址更准确。
3、变量也都有自己的地址。
例如:
int a = 10;它在内存里就像住在一间房子里。
第四幕:复习&—— 取地址
1、前面的指针课程已经学过:
int a = 10; cout << &a;这里:
&a不是引用。
而是:
取地址。
得到:
变量住在哪里。
2、我们发现:
同样是
&,位置不同,意义不同!
| 写法 | 含义 |
|---|---|
int &x | 引用(别名) |
&a | 取地址 |
这是同学们开始,容易混淆的地方。
第五幕:认识指针参数
看代码:
#include <iostream> using namespace std; void change(int *p) { *p = 100; } int main() { int a = 10; change(&a); cout << a << endl; return 0; }运行:
100为什么?
第六幕:到底发生了什么?
1、画图:
main a 10 地址:1000调用:
change(&a);其实就是:
把1000送进去 ↓ p = 1000于是:
p ↓ 1000 ↓ a2、指针变量 p 保存的是地址。
它不是数字10。
它保存的是:
"去哪里找a"。
第七幕:为什么*p能修改变量?
1、继续画图:
p ↓ 1000 ↓ a 10如果:
*p = 100;什么意思?
就是:
顺着地址。
找到真正变量。
修改。
于是:
a 100所以:
输出:
1002、一句话总结:
指针不是数据。
指针保存的是数据在哪里。
第八幕:引用 VS 指针
1、分别画两张图。
(1)引用:
a ↑ ↓ x(2)指针:
p ↓ a(3)引用:
直接就是另一个名字。
(4)指针:
先找到地址。
再找到变量。
(5)引用:
像:
双胞胎名字。
(6)指针:
像:
家庭住址。
第九幕:经典案例——交换两个数字(指针版)
1、看代码:
#include <iostream> using namespace std; void swap(int *a,int *b) { int t = *a; *a = *b; *b = t; } int main() { int x = 3; int y = 8; swap(&x,&y); cout << x << " " << y << endl; return 0; }输出:
8 32、同学们画图:
a ↓ x 3 b ↓ y 8交换的是:
真正变量。
不是副本。
第十幕:为什么指针调用要写&?
1、为什么是:
swap(&x,&y);不是:
swap(x,y);2、因为:
函数需要的是:
地址。
不是:
数字。
3、函数传参要求:
int *就必须要送:
地址。
第十一幕:什么时候用指针?
1、已经有引用,为什么还学指针?
因为:
很多地方。
只能使用指针。
2、例如:
① 动态内存
② 链表
③ 二叉树
④ 图
⑤ C语言接口
等等
3、所以,指针:
不是为了替代引用。
而是:
解决引用做不到的问题。
第十二幕:三种参数传递大总结
1、画整张大图。
(1)值传递:
a ↓ 复制 ↓ x特点:
复制。
不能修改原变量。
(2)引用传递:
a ↑ ↓ x特点:
同一个变量。
修改成功。
(3)指针传递:
p ↓ 地址 ↓ a特点:
传地址。
通过地址修改变量。
2、总结口诀:
值传递——送副本。
引用传递——换名字。
指针传递——给地址。
第十三幕:课堂综合案例
#include <iostream> using namespace std; void add1(int x) { x++; } void add2(int &x) { x++; } void add3(int *x) { (*x)++; } int main() { int n = 10; add1(n); cout << n << endl; add2(n); cout << n << endl; add3(&n); cout << n << endl; return 0; }运行结果:
10 11 12同学们解释下:
为什么:
第一次没变?
第二次变了?
第三次也变了?
同学们请画出这三张图。
本课总结
今天,我们学习了函数参数的第三种方式——指针传递。请同学们记住五句话:
指针传递传递的是地址,而不是数据本身。
&a表示获取变量a的地址。int *p表示p是一个保存整数地址的指针。*p表示根据地址找到真正的数据并进行操作。指针传递和引用传递都能修改原变量,但实现方式不同。
🌟 数据传递模型:
值传递
实参 │ │(复制) ▼ 形参引用传递
实参 ▲ │ ▼ 形参(别名)指针传递
实参 │ │(取地址) ▼ 指针参数 │ │(解引用) ▼ 原变量同学们最终明白了:三种方式数据是怎样进行传递的。