面试题(3)引用与指针的区别

在概念上来看,引用就是一个“别名”,不会给他分配空间,和其引用的实体共用一个空间。

在底层实现上,引用就是指针。

虽然引用的定义是不会给他分配空间,但是在现在大多数的编译器当中,都会给引用分配空间。

但其实引用在底层实现上实际上是有空间的。(可以自己用代码检查一下)

 

int main() {
	int a = 1;

	int& ra = a;
	ra = 2;//用引用

	int* qa = &a;
	*qa = 3;//用指针
	return 0;
}

我们可以看一下引用和指针的汇编代码,如下。

是一模一样的。

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA562x5L-e5a2m57yW56iL,size_20,color_FFFFFF,t_70,g_se,x_16 

 

不同点:

1,可以有多级指针,但是不可以有多级引用。

2,引用比指针更加安全。(由于不存在空引用,并且引用一旦被初始化为指向一个对象,他就不能被改变为指向另一个对象的引用,因此引用很安全。对于指针来说,他可以随时指向其他的对象,并且可以不被初始化,或者为NULL,所以不安全。const指针虽然不可以改变指向,但仍然存在空指针,并且有可能产生野指针,就是多个指针指向一块内存,free掉一个指针之后,其他指针就变成野指针)

3,引用在定义时候必须初始化,指针却没有要求。

4,没有NULL引用,但是可以有空指针

5,引用自加即引用的实体增加1,指针自加即是指针向后偏移一个类型大小。

6,引用在初始化以后引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体

7,在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占四个字节)。

8,访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值