文章目录
一、引用的概念
当我们在校园学数据结构时,是否会发现看着熟悉但又不懂的符号
是否会发现为啥看不懂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;
};
因为引用无法改变指向,链表的前后指针都应该指向前后节点或空
假如需要删除中间结点,里面所存的指针是需要改变然后再释放那个结点的
这里的关键点在于改变指针所指方向
如果是引用,因为应用无法改变指向,所以引用在这里无法替代指针的存在
引用无法替代指针最关键的点就是无法改变指向
三、引用与指针的区别
引用与指针的区别:
野指针容易出现,野引用不容易出现,但还是有可能出现,例如:
函数调用中返回局部变量的引用,引用就是那片空间的别名
但函数开辟的栈帧会销毁,局部变量的空间也就归内存了
还返回那片空间的别名,再继续使用,这种情况就是野引用了
可能那个值还在,也可能改变了,但怎么说也是非法访问
杜绝出现野引用
引用比指针更方便简洁一点,所以引用也很常用
总结
引用的存在简化了一些指针,虽说不如指针可以改变指向灵活,但更方便简洁了
引用如同指针的延伸,少了点规矩
以上就是引用的总结,数据结构应该能看明白一点了,如有差误,请谅解