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很多同学认为输出1003结果真正输出却是104为什么今天我们就来揭开这个秘密。第一章 故事开始——神奇的复制魔法1、数据王国里。国王有一颗宝石age里面放着102、有一天。国王请魔法师帮忙请帮我把宝石改成100魔法师说没问题于是。魔法师挥了一下魔法棒。✨3、大家以为国王的宝石会变。可是……真正发生的是魔法师变出来了一颗一模一样的新宝石4、原来国王的宝石age 10魔法师得到的是x 10注意这是另一颗宝石。5、所以。魔法师修改x 100国王那颗还是106、国王笑着说这是函数神奇的复制魔法第二章 第一个实验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() ↓ 变1003、其实。真正发生的是1第一步age 10;2第二步调用change(age);计算机偷偷复制了一份。变成x 10;于是。内存变成age 10 x 10注意这是两个变量3第三步函数里面x 100;变成age 10 x 1004函数结束。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地址10012、调用change(age);函数收到的是p ↓ 10013、注意。这次没有复制10复制的是地址10014、所以函数里面*p 100;其实就是跑到1001号房间。把10改成1005、于是。真正的变量。发生变化。第八章 完整程序#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); couta; }输出5第二题void f(int *p) { *p 20; } int main() { int a 5; f(a); couta; }输出20第三题void add(int x) { x; } int main() { int n8; add(n); coutn; }输出8第四题void add(int *p) { (*p); } int main() { int n8; add(n); coutn; }输出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 高手几乎把数组和指针当成一家人来看待。这将是进入数据结构和算法世界的重要一步