目录引用的定义引用的作用①可以作为函数的形参从而形参的改变影响实参②可以省去拷贝这个环节从而增加运行效率③传值返回与传引用返回引用的定义什么是引用呢直接一点就是给一个变量起别名比如这个变量叫A然后通过引用给这个A变量起一个别名B此时A是这个变量B也是这个变量格式int BA可以看到这个图片给A起了一个别名BB改变A也随着改变这里强调一点变量的别名是生生世世都只是这个变量的别名永远不会改变那么我们用引用只是为了给变量起别名吗就没其他的作用吗?引用的作用①可以作为函数的形参从而形参的改变影响实参传值调用和传址调用的区别是看是否会影响实参我们在C语言的学习中传址调用一直都是用指针来完成但是指针调用一直都是一个硬骨头很难去熟练掌握一级指针还好但是要是涉及二级指针的话就会感觉非常困难而在C中根据引用的特性我们可以很好的用引用来替代指针首先的就是用引用作为自定义函数的参数通过形参的改变影响实参#includeiostream using namespace std; void Swap(int a, int b) { int tmp a; a b; b tmp; } int main() { int x 10; int y 20; Swap(x, y); cout x y endl; return 0; }我们可以用一张图来理解x和a都是10这个变量的名字y和b都是20这个变量的名字。②可以省去拷贝这个环节从而增加运行效率在传参的时候有时我们会传一些比较大的变量比如传结构体这种大的变量如果是传值调用在运行的时候编译器需要先把整个结构体拷贝一份而一个结构体有时候都是几百个字节就会导致运行效率不高的问题。在C语言中我们常常会采用传结构体指针地址的方法来增加运行效率但是传地址的时候在自定义函数也要创建一个指针变量在32位操作系统是4个字节在64位操作系统是8个字节虽然相对于结构体本身来讲会小很多但是仍然需要创建内存并且有时我们在调用的时候需要使用二级指针非常的复杂难以理解就比如在链表的插入像这个链表的插入需要使用二级指针并且在插入函数里面也要用解引用操作符就会很麻烦就是很容易搞混。我们现在使用引用来解决这个问题Node*的意思是可以给结构体指针变量取别名phead就是head的一个别名由于phead只是一个别名所以phead和head是一样的改变phead就可以改变head。然后我们用图片的方式来理解一下③传值返回与传引用返回首先说一下传值返回和传引用返回完全就是两个概念两套规则不存在怎么去对比着理解而是记住就行传值返回返回的是一个临时变量且该变量具有常性即值不能被修改这就是传值返回出现了报错但要是使用传引用掉用呢可以看到不仅没报错反而实现了我们这段代码的目的我来讲讲为什么可以这样写呢因为这个是传引用返回返回的是arr[i]的别名假设别名是int tmp在funck(arr, i) 1;这一段中是别名tmp进行计算那别名计算原变量也会跟着改变所以传引用返回返回的是别名而非返回寄存器中的数据。而有一种情况是无法使用传引用返回的就是当返回的变量随着函数栈帧的销毁而销毁的时候这时候就不能用传引用返回否则会造成野引用的效果。为什么之前可以用传引用返回呢这是因为之前传引用返回的函数栈帧虽然销毁了但是原数组还在内存空间里面呢但是这个传引用返回函数栈帧销毁之后原a变量就不存在了所以不能传引用返回
创建C++最深情的变量——引用
目录引用的定义引用的作用①可以作为函数的形参从而形参的改变影响实参②可以省去拷贝这个环节从而增加运行效率③传值返回与传引用返回引用的定义什么是引用呢直接一点就是给一个变量起别名比如这个变量叫A然后通过引用给这个A变量起一个别名B此时A是这个变量B也是这个变量格式int BA可以看到这个图片给A起了一个别名BB改变A也随着改变这里强调一点变量的别名是生生世世都只是这个变量的别名永远不会改变那么我们用引用只是为了给变量起别名吗就没其他的作用吗?引用的作用①可以作为函数的形参从而形参的改变影响实参传值调用和传址调用的区别是看是否会影响实参我们在C语言的学习中传址调用一直都是用指针来完成但是指针调用一直都是一个硬骨头很难去熟练掌握一级指针还好但是要是涉及二级指针的话就会感觉非常困难而在C中根据引用的特性我们可以很好的用引用来替代指针首先的就是用引用作为自定义函数的参数通过形参的改变影响实参#includeiostream using namespace std; void Swap(int a, int b) { int tmp a; a b; b tmp; } int main() { int x 10; int y 20; Swap(x, y); cout x y endl; return 0; }我们可以用一张图来理解x和a都是10这个变量的名字y和b都是20这个变量的名字。②可以省去拷贝这个环节从而增加运行效率在传参的时候有时我们会传一些比较大的变量比如传结构体这种大的变量如果是传值调用在运行的时候编译器需要先把整个结构体拷贝一份而一个结构体有时候都是几百个字节就会导致运行效率不高的问题。在C语言中我们常常会采用传结构体指针地址的方法来增加运行效率但是传地址的时候在自定义函数也要创建一个指针变量在32位操作系统是4个字节在64位操作系统是8个字节虽然相对于结构体本身来讲会小很多但是仍然需要创建内存并且有时我们在调用的时候需要使用二级指针非常的复杂难以理解就比如在链表的插入像这个链表的插入需要使用二级指针并且在插入函数里面也要用解引用操作符就会很麻烦就是很容易搞混。我们现在使用引用来解决这个问题Node*的意思是可以给结构体指针变量取别名phead就是head的一个别名由于phead只是一个别名所以phead和head是一样的改变phead就可以改变head。然后我们用图片的方式来理解一下③传值返回与传引用返回首先说一下传值返回和传引用返回完全就是两个概念两套规则不存在怎么去对比着理解而是记住就行传值返回返回的是一个临时变量且该变量具有常性即值不能被修改这就是传值返回出现了报错但要是使用传引用掉用呢可以看到不仅没报错反而实现了我们这段代码的目的我来讲讲为什么可以这样写呢因为这个是传引用返回返回的是arr[i]的别名假设别名是int tmp在funck(arr, i) 1;这一段中是别名tmp进行计算那别名计算原变量也会跟着改变所以传引用返回返回的是别名而非返回寄存器中的数据。而有一种情况是无法使用传引用返回的就是当返回的变量随着函数栈帧的销毁而销毁的时候这时候就不能用传引用返回否则会造成野引用的效果。为什么之前可以用传引用返回呢这是因为之前传引用返回的函数栈帧虽然销毁了但是原数组还在内存空间里面呢但是这个传引用返回函数栈帧销毁之后原a变量就不存在了所以不能传引用返回