当前位置: 首页 > news >正文

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++ 高手几乎把数组和指针当成一家人来看待。这将是进入数据结构和算法世界的重要一步!🚂


http://www.jsqmd.com/news/1092134/

相关文章:

  • 特殊上位机权限管理方案
  • AI插件开发实战:基于JS脚本的Illustrator色标生成器设计与实现
  • Matlab2020b 从零到一:一份详尽的个人安装与避坑指南
  • 今天发现采用360下载wps比网页版快多了,下载的是同一个版本。-但是重新安装了wps,还是有些卡顿,稍微好了一丢丢,这个到底什么原因?
  • 三角洲S10裂变新赛季上线[特殊字符]Mac玩家再也不用错过核电站新图!
  • SMUDebugTool完全指南:专业级AMD Ryzen处理器硬件调试工具深度解析
  • C# CAD二次开发消息提示技巧
  • 如何免费解锁Wand专业版:告别订阅费的终极指南
  • 抖音无水印下载器:三步免费保存高清视频的完整指南
  • TUSB4020B评估模块拆解:从电源设计到信号完整性,打造稳定USB集线器
  • 【技巧揭秘】告别LaTeX插图虚线阴影:从Visio到PDF的完美转换链
  • 开发了一个浏览器新标签页,欢迎大家体验
  • 如何通过R3nzSkin项目掌握游戏内存修改技术:5个实战应用场景解析
  • 从习题到实战:TCP拥塞控制与窗口机制深度解析
  • LangGraph 架构避坑:智能体职责拆分与流式回调透传机制剖析
  • WindTerm高效配置与个性化调优指南
  • d2s-editor:暗黑破坏神2存档编辑器的3分钟终极指南
  • 启鸣AI赋能大学课堂,西班牙访学团沉浸式体验天立智慧教学
  • Free Spire.XLS for Python 免费库实现。
  • 德州仪器Value Soundbar参考设计:基于PCM3070与MSP430的音频系统开发实战
  • 【RV1103/RV1106】基于Buildroot定制蓝牙文件系统:从依赖解析到实战排错
  • 在博客设置 页脚HTML代码 贴入如下代码
  • Dataify 跨境电商数据采集全攻略实战
  • 最新毕设选题- 大数据篇
  • 私钥登录ssh服务器
  • 再见,期待下次相遇
  • CEPH分布式存储应用实践——分布式存储简介与CEPH分布式存储
  • 在 Azure AI Search 里,英文检索有时会卡在一个很小的词形差异上:文档里是 brief,搜索 briefs 却搜不到。
  • 深度把玩劳力士3235机芯的老哥,先放大50倍看看这组表盘序列号的防伪公差
  • XCOM 2模组管理革命:AML启动器终极指南 - 告别混乱,拥抱秩序