说起引用和指针,相信大多数人都或多或少的有些许疑问吧,小编来给大家小解一下,讲的不好请使劲拍砖,小编承受能力极强,不信你试试。
先谈一下为什么有了高效的指针还要引入引用呢?
有过学C语言的同学都知道指针的重要性,它高效灵活,但是实物都有两面性,高效灵活则意味着容易出错。对于一个指针,它所指向的对象是灵活的,他可以指向任何一个与它类型相匹配的对象,这一刻它指向对象1,下一刻就有可能指向另一个对象2,这就容易引发安全隐患,如将一个自己定义的指针指向一个系统对象,一旦你对该指针进行操作,就有可能引起系统崩溃,还有就是野指针和未初始化的指针都有安全隐患,为了解决在一定程度上弥补指针的缺点,就引入了指针,注意引用这一概念在C语言中使没有的,在C++、C#中有,其它语言有没有小编就不清楚了。
引用:在实际编程中引用主要用做函数的形式参数,它其实就是一个对象的别名,它在定义的时候必须要初始化,这一点与实际生活中给小伙伴起外号是一样的,你是看人(相当于对象)来起外号(相当于引用),而不是先想外号再找人,并且一旦初始化之后,该引用就只能指向所关联的对象了,不能再指向其它对象了,就像现实中的你只能有一个合法老婆一样,对引用的所有操作都相当于对所关联对象本身的操作。其中const 引用需要你关注。
对于非const引用,用于初始化引用的必须是一个与该引用同类型的对象,不能是一个常量
int a;
int &s=a; //ok
int &j=12; //error
对于const引用,则可以绑定到不同但相关的类型的对象或绑定到右值。
绑定到右值的情况如下:
int i=43;
const int &r=43; //合法
const int &r2=r+i; //合法
绑定到相关类型的对象如下:
double dval=3.14;
const int &ri=dval; //合法
其实编译器会把上述代码转换成如下形式的编码:
int temp=dval; //创建一个临时的变量
const int &ri=temp; //其实绑定到了一个临时变量对象上,对ri 的操作不会改变dval
指针:指针实际就是地址,是标识一块内存的一个标识,通过这个标识可以对所指向的内存中的数据进行操作,指针存储在对应类型的指针变量中,注意野指针和未初始化的指针会带来安全隐患,养成良好习惯,定义指针变量时要对其初始化。指针的用处用很多,需要多加学习。
总结一下指针与引用的区别:
1、引用定义的时候必须初始化,而指针不是必须的,但习惯上要进行初始化
2、引用一旦初始化之后,就只能指向初始化的对象,不能再另指向其他对象了,但指针可以
3、都可以通过自身来直接操作指向的对象