c++之引用详解
文章目录
引用概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。
#include <iostream>
using namespace std;
int main()
{
int a = 0;
int& b = a;//引用
a++;
printf("&a = %p,a = %d\n", &a, a);
b++;
printf("&b = %p,b = %d\n", &b, b);
return 0;
}
可以看出b就是a,他们公用一块内存空间!
- 但是引用是要初始化的!
#include <iostream> using namespace std; int main() { int&a;//这样是会直接报错! }
一旦引用了某个实体后就不能再修改了!
#include <iostream> using namespace std; int main() { int a =10; int b = 100; int&c = a; c = b;//这个是赋值,因为一旦引用一个实体,就再也不能引用其他实体 //所以c的地址仍然与a相同! printf("a = %p\n",&a); printf("a = %p\n",&b); printf("a = %p\n",&c); }
因为引用无法替换!这就导致了引用在c++中是无法完全代替指针的!
引用在实际当中的价值
做参数!
//可用于减少拷贝次数!
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}//这种就叫做输出型参数!就是说我的参数在里面进行修改,然后还要传回来!
BTNode* BinarYTreeCreat(BTDataType* a,int* pi);//此处的pi就可以使用 引用来代替!
//可以用于简化二级指针!
typedef struct ListNode
{
int val;
struct ListNode* next;
}LTNode,*PTNode;
void SlistPushBack(LTNode** phead, int val);//这是最原始的链表插入,因为要改变头所以要引入二级指针!
void SlistPushBack(LTNode*& phead, int val);//这是对原本的基础上进行改进,使用引用代替二级指针!
void SlistPushBack(PTNode& phead, int val);//这是最后的优化版本!
用引用参数的好处!
- 引用做参数,可以减少拷贝次数,正常情况下,我们无论传什么类型的变量,都一定要进行一份拷贝,无非是拷贝大小的区别而已!即使是指针类型,也要对该指针进行一次临时拷贝!然后通过该指针找到我们要的变量的内存位置!但是我们如果使用引用作为参数,就相当于直接对于我们要操作的变量本身进行读写操作!不需要进行任何的拷贝操作!可以更好的节约性能!
- 增加代码可读性!一般我们要对二级,乃至更高级的指针本身进行操作我们就要使用比它高一级的指针存储它的地址!这样其实会增加对代码阅读的难度!使用引用我们就可以直观的知道,我们到底操作的是什么类型!
做返回值
int&