引用

学过C应该都知道指针,刚开始学习指针的时候,都会觉得指针很难,学完了指针才发现指针就是保存的地址。指针十分不安全,使用的不恰当,就会使程序出错!C++里面提出了“引用”代替指针,提高程序的安全性。下面来讲讲什么是引用。

一、引用的定义

引用不是新定义一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间

引用的声明方法:类型标识符 &引用变量名=引用实体;(如int &ra = a)

二、引用与指针的联系与区别

相同点:底层的实现方式相同,都是按照指针的方式来实现的
不同点:
1)引用在定义时必须初始化,指针没有要求
2)一旦一个引用被初始化为一个指向一个对象,就不能再指向其他对象(引用不可以改变指向,对一个对象”至死不渝”),而指针可以在任何时候指向任何一个同类型对象
3)没有NULL引用(引用为空——对象都不存在,怎么可能有别名!这也是引用必须初始化的原因),但是有NULL指针
4)在sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址*空间所占字节个数
5)引用自加改变变量的内容,指针自加改变了指针的指向 (说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。)
6) 有多级指针,但是没有多级引用
7)指针需要手动寻址,引用通过编译器实现寻址
8)引用比指针使用起来更安全(由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。)
9)声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必
言而总之——它们的这些差别都可以归结为”指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。”
引用的使用:1.实现两个数的交换
这里写图片描述
这里写图片描述
结论:
1)可以看出引用在函数传参的时候,只需要传变量名过去,函数形参用引用即可。而指针在传参的时候,必须传变量的地址过去,否则不能改变变量的值。
2)引用没有分配内存空间,所以访问函数形参就是访问引用的变量,是直接访问。而指针分配了内存空间用来保存变量的地址,需要通过保存的地址找到指向的变量,是间接访问。
2. 函数返回引用
这里写图片描述

结果如下:
这里写图片描述
3.自增
这里写图片描述

运行结果:
这里写图片描述
解释如下:
对ref的++操作是直接反应到所指变量之上,对引用变量ref重新赋值”ref=j,并不会改变ref的指向,它仍然指向的是i,而不是j。理所当然,这时对ref进行++操作不会影响到j。而这些换做是指针的话,情况大不相同,请自行实验。
4.特别之处const
const对指针和引用的限定是有差别的,如下:
1)常量指针:指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。”const int* pointer=&a”告诉编译器,*pointer是常量,不能将*pointer作为左值进行操作。
定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作规定性。
2)常量引用:指向常量的引用,在引用定义语句的类型前加const,表示指向的对象是常量。也跟指针一样不能利用引用对指向的变量进行重新赋值操作。
“int* const pointer=&b”告诉编译器,pointer是常量,不能作为左值进行操作,但是允许修改间接访问值,即*pointer可以修改。
在指针定义语句的指针名前加const,表示指针本身是常量。在定义指针常量时必须初始化!而这是引用天生具来的属性,不用再引用指针定义语句的引用名前加const。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值