文章目录
指针和引用的区别和作用
定义
- 指针:指针是一个变量,其值为指向对象的内存地址,而不是值本身。
- 引用:可以理解为对象的别名,是另外一个变量的直接别名,用于创建一个已存在变量的另一个名字。
cpp
int a = 10; // 变量 a 存储了值 10
int &ref = a; // ref 是变量 a 的引用
int b = 20; // 变量 b 存储了值 20
ref = b; // 这实际上是将 b 的值赋给 a
区别
- 是否初始化
- 指针可以不初始化,但是最好初始化。
- 防止未定义行为:未初始化的指针可能指向任意内存地址。
- 如果不知道指向什么,可以将其指向
nullptr
,。
- 引用必须初始化,不能初始化为空对象,初始化之后不能改变 。
- 从引用是对象的别名角度理解,如果初始化为空对象,本身就没有意义。
- 原因:引用底层是通过指针实现的。当声明一个引用时编译器底层会创建一个指向原对象的指针,并在之后的操作中使用这个指针来访为对象。但是这个指针是隐式的,对程序员不可见,一旦这个指针被初始化(即引用被绑定到一个对象),编译器没有提供机制来更改这个指针的值。
例如,开始的代码中
- 指针可以不初始化,但是最好初始化。
cpp
int &ref = a;// 这里ref直接引用的a的地址,注意ref本身没有内存地址。
ref = b; // 这里可以直接将a的值改为20,也就是将a所代表的那块内存中存储的值改为20
ref = &b; // 错误,ref引用了a,不可改变。
对于a占据的内存,ref是他的别名(底层有编译器指针实现的),而由于地址不可变性,因此在编译完成到整个生命周期这个a的地址和ref都是不可改变的。符号表?
- 是否能为空
- 指针可以为空
- 引用不可以为空
- 是否直接操作对象
- 指针间接操作对象
指针存储了对象的地址,对指针操作不会直接改变这个对象,要通过指针变量对所指向的对象间接操作。例如,*解地址引用。 - 引用直接操作对象
- 指针间接操作对象
- 是否是对象
- 指针是对象
指针有地址,可以有指针的指针 - 引用不是对象
引用没有地址。
- 指针是对象
作用
-
指针:
- 传参,避免对象数据的复制,尤其是大型数据结构的时候。
- 多态,通过指针可以找到子类
- 代码复用
-
引用
- 传参,避免对象数据的复制
- 函数返回值