5、应用做参数我们知道实参的改变不影响形参,所以这种写法并不能改变值,因为此刻是 传值调用 :
按照之前 c 的写法,我们使用 传址调用 ,用指针修改:
但是学习引用之后,完全可以用引用修改:
x 和 y 分别是 a 和 b 的引用,对 x 和 y 进行修改,就是对 a 和 b 进行修改,所以值也被修改成功了。
调试一下:
它们的地址是完全相同的。而这里这里既不是传值调用,也不是传址调用,而是传引用调用。
思考:上面三个函数是否构成函数重载?构成,但无法调用。
根据函数名修饰规则,传值和传引用的是不一样的,比如会加上 r 做区分。
但是不能同时调用传值和传引用,因为有歧义,就会导致调用不明确 ,编译器并不知道调用哪个:
引用解决二级指针生涩难懂的问题 :
讲单链表时,我们写的由于是没有头结点的链表,所以修改时,需要二级指针,对于指针概念不清晰的小伙伴们可能比较难理解。
但是学了引用,就可以解决这个问题:
结构定义:
typedef structslistnode{ int data; struct slistnode* next;}sltnode;原代码:
void slistpushfront(sltnode** pphead, sltdatetype x){ sltnode* newnode = buylistnode(x); newnode->next = *pphead; *pphead = newnode;}// 调用sltnode* pilst = null;slistpushfront(&plist);修改后:
void slistpushfront(sltnode*& pphead, sltdatetype x) // 改{ sltnode* newnode = buylistnode(x); newnode->next = *pphead; *pphead = newnode;}// 调用sltnode* pilst = null;slistpushfront(plist); // 改修改之后的代码里的二级指针被替换成了引用。
而这里的意思就是给一级指针取了一个别名,传过来的是plist,而plist 是一个一级指针,所以会出现 * ,而这里就相当于 pphead 是 plist 的别名。而这里修改 pphead ,也就可以对 plist 完成修改。
但是有时候也会这么写 :
结构改造:
typedef structslistnode{ int data; struct slistnode* next;}sltnode, *psltnode;这里的意思就是将 struct slistnode* 类型重命名为 psltnode 。
代码:
void slistpushfront(psltnode& pphead, sltdatetype x) // 改{ psltnode newnode = buylistnode(x); newnode->next = pphead; pphead = newnode;}// 调用 psltnode plist = null;slistpushfront(plist);在 typedef 之后,psltnode 就是结构体指针,所以传参过去,只需要在形参那边用引用接收,随后进行操作,就可以达成目的。
而形参的改变影响实参的参数叫做输出型参数,对于输出型参数,使用引用就十分舒适。
如果了解引用,那么这一部分是相当好理解的,一些数据结构教科书上也是这么写的,但是如果不懂引用,甚至会觉得比二级指针还难以理解。
在我们学习了引用之后,之后也可以这么写代码,更加方便。
做返回值要搞清楚这一块,我们先进行些许铺垫。
int add(int a, int b){ int c = a + b; return c;}
int main(){ int ret = add(1, 2); cout << ret << endl; return 0;}这里看似很简单,就是把add函数计算结束的结果返回,但是这里包含了 传值返回 。
若从栈帧角度看,会先创建 main 函数的栈帧,里面就会有 call 指令,开始调用 add 函数。而 add 函数也会形成栈帧,而栈帧中也有两块小空间,用来接受参数,分别为 a 和 b,而里面的 c 则用来计算结果并返回。
而对于传值返回,返回的并不是 c ,而是返回的是 c 的拷贝。而这其中会有一个临时变量,返回的是临时变量(见函数栈帧)
如果返回的是 c 的话,由于 add 的函数栈帧已经销毁了,就会产生很多奇怪的问题。c 能不能取到都是未知,而这时都是非法访问,因为空间已经被归还给系统了,所以必定是c拷贝后的数据被返回。
中兴迎来转机 盘点中兴危局的始末
PCB电路板的腐蚀过程
国外程序员是怎样看待加班的
中国电信建成40余万个NB-IoT基站,物联网用户突破8000万
串扰的基础知识
c++引用详细解说2
信号隔离器接线图
华为具有改进的热性能的倒装芯片封装专利解析
gtek接近开关如何操作 gtek接近开关工作原理是什么
UDrone意念无人机体验 到底有多神奇
5G商用网络推出 沟通便捷加快了时代的进程
基于QuartusⅡ开发环境与VHDL语言的16路可调彩灯控制器的设计
谁再说美发店暴利,请把这篇文章甩到他脸上
一种基于毫米波雷达的导线弧垂监测
因无人机高通大疆联芯强强联合
集创新新力量,探生态新应用 | 毫米波雷达“居家智能”应用大赛火热进行时
英国在是否允许华为提供5G技术问题上面临艰难抉择
虹科分享 | 带您了解太赫兹成像技术及系统方案(下)
万用表的基本原理,The principles of multimeter
Linux I/O 接口的类型及处理流程