引用和指针的区别

引用:

1,概念:引用不是新定义一个变量,而是给已存在的变量取了一个别名,引用和实体共用同一块内存空间
类型&引用变量名(对象名)=引用实体
2,特性: 引用在定义时必须初始化
一个变量可以有多个引用
引用一旦引用实体,就不能引用其他实体

3,常引用:

void TestConstRef() {
	const int a =10;
	//int &ra = a; //该语句编译时会出错,a为常量
	const int& ra = a;
	//int& b = 10; //该语句编译时会出错, b为常量
	const int& b = 10;
	double d = 12.34;
	//int& rd = d; //该语句编译时会出错,类型不同
	const int& rd = d;
}

4,应用场景:

作为函数的参数:<1>需要通过形参改变外部实参T&
<2>不需要通过形参改变外部实参

作为函数的返回值:离开函数作用域后,其栈上的空间已经还给系统,注意不能返回函数栈上的空间
只要返回值的生命周期不受函数控制(函数结束后不影响变量的生命周期)
1,全局变量
2,static类型的变量
3,返回引用类型的变量
5,传值,传引用的效率比较
以值作为参数或者返回值类型,在传参或返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参
或者返回变量的一份临时拷贝,因此用值作为参数或者返回值类型,效率非常低下的,尤其是当参数或者返回值类型
非常大时,效率更低;
通过比较发现:传值和指针作为函数返回值类型效率相差很大,指针效率较高,传指针和传引用的效率基本相当.

引用和指针除了在书写形式上有区别外
引用在底层实际上就是按照指针的方式进行处理的;(汇编代码可以看出)
实际上:引用类型的变量也有空间,空间中实际存放的是引用实体的地址

T&<=>T*const const T&<=>const T* const
1,引用在定义时必须初始化,指针没有要求;
2,引用在初始化时引用一个实体后,就不能引用其他实体,而指针可以在任何时候指向任何一个同类型的实体;
3,没有空引用,但是有空指针;
4,在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节);
5,引用自加即引用的实体加1,指针自加即指针的类型向后偏移一个类型大小;
6,有多级指针但没有多级引用;
7,访问实体方式不同,指针需要显式解引用,引用编译器自己处理;
8,引用比指针使用起来更加安全.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值