C++中的引用与指针之间的神秘关系

一、引用的概念

当我们在校园学数据结构时,是否会发现看着熟悉但又不懂的符号
是否会发现为啥看不懂SqLInit(SL& ps);函数中的符号 ‘ & ’
没错,除了在C中是按位与操作符与取地址操作符外,在C++中拓展有引用的作用

1.为啥要有引用

祖师爷觉得在一些场景指针的使用有点绕、复杂
开发语言的人都绕了,我们学习的语言的就更麻烦了
所以祖师爷在C++上加入了引用,用于在一些场景简化指针

2.引用的定义和引用的内涵

一)引用定义如下:

类型& 引用变量名(对象名) = 引用实体;
例如:
int a = 0;
int& b = a;

注意:定义引用的类型要和引用实体的类型一样
如上a的类型是int(整型),而定义的引用变量b也是int(整型)

和指针有点像,先&和名称结合说明是引用变量,然后前面的类型就是指向的类型
当然这样说指向有点抽象,可以适当用定义指针的过程看待

二)引用的内涵:

如何看待引用呢?可以把引用当成别名
引用不是定义一个新变量,而是给变量取一个别名,变量和引用用同一片空间
假设定义的变量名字叫萧炎,建立一个引用叫萧火火指向萧炎,那萧火火也是萧炎

int 萧炎;
int& 萧火火 = 萧炎;
int& 消炎药 = 萧炎;
int& 侥幸哥 = 萧火火;

名字共用的是同一个人,不可能起个别名人就变了吧
可以看到,在原变量上起别名是那片空间,也应该有在别名上再起一个别名也是那片空间
也就是,在原变量上创建引用是那片空间,在引用上再建立引用也是那片空间

三)引用的简单使用:

int a = 0;
int& b = a;
b = 20;
最终结果a = 20;

在这里插入图片描述
引用只能在只能在函数内当变量的别名吗?不!它还能在函数形参列表里面使用
例如:
在这里插入图片描述
而实参传递那边只需要传变量名就行了,不像指针需要传地址

Swap(x,y);

有人会想到这是传值还是传址,本质是传址,只不过函数里面的xy就是外面那个的别名,可以直接使用
如此过来,你是否能细数了解数据结构里面的函数的引用了呢?

二、引用是否能替换指针

引用在C++里无法替代指针,引用最初思维是为了简化复杂的指针
引用相对于指针更简洁,没有繁琐的多层引用,也没有什么取地址解引用

1.引用小概念

当然讲这些之前要了解一点点引用的限制:

1、引用无法改变指向
2、引用必须得初始化
3、引用无法嵌套多层

如下:

int a = 10;
int b = 20;
int& c = a;
c = b;

如果可以改变指向,那c是b的引用呢,还是应该把b的值赋值给c
这里就产生歧义,所以当加上引用无法改变指向,这里就明了了
为啥这样,因为引用是为了简化指针的复杂,祖师爷就没有以替代指针的想法出发

2.为啥引用无法替代指针?

例如以下:

struct ListNode
{
	struct ListNode* prev;
	struct ListNode* next;
	int val;
};

因为引用无法改变指向,链表的前后指针都应该指向前后节点或空
在这里插入图片描述
假如需要删除中间结点,里面所存的指针是需要改变然后再释放那个结点的
这里的关键点在于改变指针所指方向
如果是引用,因为应用无法改变指向,所以引用在这里无法替代指针的存在
引用无法替代指针最关键的点就是无法改变指向

三、引用与指针的区别

引用与指针的区别:
在这里插入图片描述
野指针容易出现,野引用不容易出现,但还是有可能出现,例如:
在这里插入图片描述

函数调用中返回局部变量的引用,引用就是那片空间的别名
但函数开辟的栈帧会销毁,局部变量的空间也就归内存了
还返回那片空间的别名,再继续使用,这种情况就是野引用了
可能那个值还在,也可能改变了,但怎么说也是非法访问
杜绝出现野引用

引用比指针更方便简洁一点,所以引用也很常用

总结

引用的存在简化了一些指针,虽说不如指针可以改变指向灵活,但更方便简洁了
引用如同指针的延伸,少了点规矩
以上就是引用的总结,数据结构应该能看明白一点了,如有差误,请谅解
在这里插入图片描述

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值