引用与指针的关系

C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
示例代码:
int main()
{
	int a = 0;
	int* p = &a;//取地址
	*p = 1;//解引用赋值

	int& ra = a;//引用,取别名
	ra = 2;

	return 0;
}

表层解释:

如果我们看看底层的汇编语言呢? 

(mov)把 "," 右边的值move到左边;

(l e a)取 "," 右边的地址,放到左边eax(寄存器);

所以:其实引用的本质还是指针,不过我们最好以表层来将他们区分开来。 

引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

示例代码:

int main()
{
	int& a = 1;//不可行,会报错
	//error C2440: “初始化”: 无法从“int”转换为“int &”
	int* pa = 100;//C语言可以,C++会报错,所以,尽量初始化
	return 0;
}
引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。

示例代码: 

int main()
{
	int a = 0;
	int& ra = a;
	ra = b;//error C2065: “b”: 未声明的标识符
	//上面这相当于赋值,不能再引⽤其他对象
	return 0;
}
引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
#include<iostream>
//由于栈的销毁,会出现类似野指针
//野引用
int& func()
{
	int a = 0;
	return a;//返回他的引用
}
//间接的空引用
int main()
{
	int* ptr = NULL;
	int& rb = *ptr;
	rb++;
	return 0;
}

文章短短,其实是对C++入门(点这里哈)的引用知识的补充~~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值