c++中的指针与引用

引用:不是定义一个变量,而是给已经存在的变量取一个别名,所以引用一定要初始化
定义的格式:类型& 引用名=已定义过的变量名

引用的特点:1.变量可以有多个别名
                    2.引用必须要初始化
                    3.一个引用不可为多个变量,并且不可变
                    4.在引用是可以加限制,但不能少限制

一个例子:
int a=100;
int &b=a;
int &c=a;
int c=10;
b=c;//简单的赋值动作
&:引用


2.
const int& a=0;
const int& b=a;
常量具有常性,所以在引用是必须要要匹配,使用const修饰
引用的时候类型必须匹配

3.引用的应用
0.用引用做形参, const引用传参时不能被改变(我们在传参时尽量使用const,保证变量不能被修改值)(从一而终)
1.用引用做返回值的时候,若为值返回,为临时变量返回,所以返回值的引用需加const, 用引用返回的时候不开辟临时空间
我们可以看一个栗子 ,分别是用引用做返回值和参数的时候

首先是做返回值的时候

我们可以看到当引用返回值得时候,我们在调用完第一个Add函数在之后,函数栈桢销毁,而ret代表的是哪个函数返回值的那块空间的引用,即使那块栈桢已经被销毁,但是那块空间的的别名ret依旧存在,它依然是那块空间得别名,当我们第二次调用Add函数的时刚好在刚刚已经销毁的那块空间上又建立了一个栈桢,而返回值刚好还是ret引用的那块空间,所以当我们执行完第二个Add函数的时候,ret的值就会改变,而且当我们调用完第二个Add函数之后,我们又会发现,ret的值又改变了,变成了一个随机数,,因为刚刚的栈桢又被销毁了,编译器给上面置了一个随机值,标记此块空间无用

总的一句, 就是将这个结果的地址通过临时变量传给main函数中的ret

引用做参数的时候

此时我们又发现ret没有变,因为我们只是将这两个参数的别名传进函数,然后进行计算之后
将结果的值通过临时变量(寄存器)传给main函数中的ret
所以ret不会变

所以不要返回一个临时变量的引用,但是如果不是临时变量,那么尽量用引用,可以节省空间

4.
指针和引用的区别:
指针的大小字节和编译器的位数有关
在语法上,引用不开辟空间,指针开辟空间
引用必须初始化,指针可以不用初始化
引用不能变,指针可以变
引用相对于指针更安全,指针相对于引用来说更灵活


我们一定要明白,引用不开辟空间知识相对于语法而言,但其实我们对底层而言,编译器要实现这个引用,其实还是需要开辟空间的的来保存这个引用所指向空间的地址

猜你喜欢

转载自blog.csdn.net/qq_36767247/article/details/79571567