1、语法上
指针:指针是一个变量,存储了另一个变量的内存地址。指针的声明需要在类型前加上星号 *。
引用:引用是另一个变量的别名,它在声明时必须初始化,并且一旦初始化,就不能更改引用的对象。引用的声明需要在类型前加上 &。
2、定义上
指针:int *a;
引用:int& a_1 = a;
3、改变指向
指针:可以任意改变指向方向
引用:一旦初始化,就不能更改引用的对象
4、初始化
指针:可以初始化为NULL,也可以不初始化
引用:声明时必须初始化
5、使用场景
指针:适用于需要动态内存分配、多级间接访问、复杂的内存管理等情况。
引用:适用于函数参数传递、返回值、作为别名使用等场景,尤其是在不需要改变引用对象的情况下。
6、函数参数传递
指针:可以通过指针实现按地址传递,允许函数修改实参的值,也可以传递 nullptr 。
引用:通过引用传递参数可以允许函数修改实参的值,但不允许传递空引用。
7、安全性
指针:指针操作更加复杂,容易出错,如空指针解引用、野指针等。
引用:引用更安全,因为它们总是指向一个有效的对象,并且不能被重新赋值。
8、自增运算意义不同
p++之后指向a后面的内存,s++相当于a++。