小学生学C++编程语法知识(C++函数 :7、指针传递)

小学生学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 ↓ a

2、指针变量 p 保存的是地址。

它不是数字10。

它保存的是:

"去哪里找a"。


第七幕:为什么*p能修改变量?

1、继续画图:

p ↓ 1000 ↓ a 10

如果:

*p = 100;

什么意思?

就是:

顺着地址。

找到真正变量。

修改。


于是:

a 100

所以:

输出:

100

2、一句话总结:

指针不是数据。

指针保存的是数据在哪里。


第八幕:引用 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 3

2、同学们画图:

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

同学们解释下:

为什么:

第一次没变?

第二次变了?

第三次也变了?

同学们请画出这三张图。


本课总结

今天,我们学习了函数参数的第三种方式——指针传递。请同学们记住五句话:

  1. 指针传递传递的是地址,而不是数据本身。

  2. &a表示获取变量a的地址。

  3. int *p表示p是一个保存整数地址的指针。

  4. *p表示根据地址找到真正的数据并进行操作。

  5. 指针传递和引用传递都能修改原变量,但实现方式不同。


🌟 数据传递模型:

值传递

实参 │ │(复制) ▼ 形参

引用传递

实参 ▲ │ ▼ 形参(别名)

指针传递

实参 │ │(取地址) ▼ 指针参数 │ │(解引用) ▼ 原变量

同学们最终明白了:三种方式数据是怎样进行传递的。