GESP4级C++考试语法知识(一、指针(9、指针与函数调用)

GESP4级C++考试语法知识(一、指针(9、指针与函数调用)


第九课《神奇的复制魔法——为什么函数里的变量不会改变?》


🎯 本课目标

1、经过前面的学习,我们已经知道:

✅ 指针可以找到变量

int age = 10; int *p = &age;

✅ 可以通过指针修改变量

*p = 20;

2、那么今天,我们终于要学习:

为什么指针会被发明出来?


3、很多同学第一次学习函数时,都会遇到一个奇怪的问题。

(1)例如:

#include <iostream> using namespace std; void change(int x) { x = 100; } int main() { int age = 10; change(age); cout << age; return 0; }

(2)很多同学认为输出:

100

(3)结果真正输出却是:

10

(4)为什么?

今天,我们就来揭开这个秘密。


第一章 故事开始——神奇的复制魔法

1、数据王国里。

国王有一颗宝石:

age

里面放着:

10

2、有一天。

国王请魔法师帮忙:

👑

"请帮我把宝石改成100!"

魔法师说:

"没问题!"

于是。

魔法师挥了一下魔法棒。


3、大家以为:

国王的宝石会变。

可是……

真正发生的是:

魔法师变出来了一颗:

一模一样的新宝石!


4、原来:

国王的宝石:

age = 10

魔法师得到的是:

x = 10

注意!

这是:

另一颗宝石。


5、所以。

魔法师修改:

x = 100

国王那颗:

还是:

10

6、国王笑着说:

这是函数神奇的复制魔法!


第二章 第一个实验

1、来看程序。

#include <iostream> using namespace std; void change(int x) { x = 100; } int main() { int age = 10; change(age); cout << age << endl; }

2、很多同学认为:

age ↓ change() ↓ 变100

3、其实。

真正发生的是:


(1)第一步:

age = 10;

(2)第二步:

调用:

change(age);

计算机偷偷复制了一份。

变成:

x = 10;

于是。

内存变成:

age = 10 x = 10

注意:

这是:

两个变量!


(3)第三步:

函数里面:

x = 100;

变成:

age = 10 x = 100

(4)函数结束。

x

消失了。

最后:

age = 10

一点都没有变。


第三章 为什么要复制?

很多同学会问:

汉克老师。

为什么计算机这么麻烦?

为什么不直接修改原来的变量?

老师举一个生活中的例子。


第四章 借作业本

1、假设:

小明有一本作业。

老师让小红检查。

有两种方法。


2、第一种。

把:

原来的作业

交给小红。

万一:

小红写错了。

怎么办?

整本作业都改坏了。


3、第二种。

老师先:

复印一份。

交给小红。

小红怎么写。

都不会影响原件。

是不是更安全?

所以:

普通函数参数。

采用:

复制。


第五章 一张图彻底理解

1、开始:

int age = 10;

内存:

┌──────────┐ │ age =10 │ └──────────┘

2、调用:

change(age);

计算机:

偷偷复制:

┌──────────┐ │ age =10 │ └──────────┘ ┌──────────┐ │ x =10 │ └──────────┘

函数里面:

x = 100;

变成:

┌──────────┐ │ age =10 │ └──────────┘ ┌──────────┐ │ x =100 │ └──────────┘

3、函数结束。

x

消失。

只剩:

age =10

第六章 指针登场

1、汉克老师说:

如果。

你就是想修改:

真正的变量。

怎么办?


2、这时候。

邮递员小P来了!

他说:

"不需要复制变量。"

"把地址给我!"


3、于是。

程序变成:

void change(int *p) { *p = 100; }

调用:

change(&age);

这里发生了什么?


第七章 指针没有复制宝石

1、开始:

age =10

地址:

1001

2、调用:

change(&age);

函数收到的是:

p ↓ 1001

3、注意。

这次没有复制:

10

复制的是:

地址1001

4、所以:

函数里面:

*p =100;

其实就是:

跑到:

1001号房间。

把:

10

改成:

100

5、于是。

真正的变量。

发生变化。


第八章 完整程序

#include <iostream> using namespace std; void change(int *p) { *p = 100; } int main() { int age = 10; change(&age); cout << age << endl; return 0; }

输出:

100

终于成功了!


第九章 两种方式对比

1、第一种

普通参数。

void change(int x) { x =100; }

特点:

复制变量。


修改:

复制品。


原变量:

不会变。


2、第二种

指针参数。

void change(int *p) { *p =100; }

特点:

复制地址。


修改:

真正的数据。


原变量:

会改变。


第十章 一个有趣的比喻

1、假设:

有个宝贝在:

幸福路100号

2、第一种:

(1)汉克老师给你:

"这是宝贝的照片。"

你在照片上进行修改。

宝贝会变化吗?


(2)不会。

照片只是:

复制品。


3、第二种。

(1)汉克老师给你:

"这是宝贝存放地址。"


(2)你直接去了宝贝存放地点。

是不是:

真正拿到了宝贝?在修改,宝贝是不是真的发生变化了?

指针就是给你的:

存宝贝的地址。


第十一章 课堂挑战

第一题

void f(int x) { x =20; } int main() { int a =5; f(a); cout<<a; }

输出:

5

第二题

void f(int *p) { *p =20; } int main() { int a =5; f(&a); cout<<a; }

输出:

20

第三题

void add(int x) { x++; } int main() { int n=8; add(n); cout<<n; }

输出:

8

第四题

void add(int *p) { (*p)++; } int main() { int n=8; add(&n); cout<<n; }

输出:

9

第十二章 本课一张图

1、普通参数:

age ↓ 复制 ↓ x ↓ 修改x

真正变量:

没有变化。


2、指针参数:

age ↑ 地址 ↓ p ↓ 修改*p

真正变量:

发生变化。


第十三章 本课总结

1、今天,我们终于知道了:

为什么会有指针!


2、因为,普通函数。

采用:

值传递(复制变量)

所以:

修改的是:

副本。


3、而,指针。

采用:

地址传递(传递地址)

所以:

修改的是:

真正的数据。


4、两种传递方式对比

普通参数指针参数
传递数据传递地址
会复制变量不复制变量
修改副本修改原变量
原变量不变原变量会变

🌟 本课口诀

函数参数有两家,

一种复制一种查。

普通参数复制值,

改来改去是假它。

指针参数传地址,

沿着门牌找到家。

修改星号真数据,

原来变量跟着变!


🎮 课后挑战——魔法师到底改了谁?

请同学们认真分析下面两段程序。

第一段:

void change(int x) { x = 50; } int main() { int num = 10; change(num); cout << num; }

输出是多少?

答案:

10

因为修改的是副本x


第二段:

void change(int *p) { *p = 50; } int main() { int num = 10; change(&num); cout << num; }

输出是多少?

答案:

50

因为p保存的是num的地址,*p = 50修改的是num自己。


🚀 下节预告

下一课,我们将学习指针经典、也是实用的应用之一:

《排队的小火车——指针与数组》

你将发现一个惊人的秘密:

int a[5];

为什么:

a

本身就是一个地址?

为什么:

a[3]

可以写成:

*(a + 3)

学完这一课,你将真正理解数组和指针之间的关系,也会明白为什么很多 C++ 高手几乎把数组和指针当成一家人来看待。这将是进入数据结构和算法世界的重要一步!🚂