1 指针
- 指针是一种存储地址的变量
- 在指针变量的生命周期种可以先后指向不同的对象
- 指针变量初始化时,可以不用赋初值(会拥有一个不确定的值),但是尽量赋值nullptr
2 引用
- 引用就是给一个变量(对象)起一个别名
- 绑定:引用初始化就需要赋值,然后引用就会永远跟这个对象绑定在一起
- 引用本身不是对象
- 引用的底层实现:
(1)在底层实现中,引用所占用的内存空间大小通常与指针相同。也就是说,当定义一个引用时,底层实现可能会为其分配与指针相同大小的内存空间,用于存储该引用所引用的变量的内存地址。
(2)从内存空间的角度来看,虽然引用本身不会占用额外的内存,但它可能会包含一个指向已经分配了内存空间的变量的指针,所以其底层实现可能会占用与指针相同大小的内存空间。
(3)例子:
int a = 100;
int& b = a; // 定义一个整型引用b,它的值等于a的内存地址
在上面的代码中,引用b在底层实现上其实被视为一个指向a的指针,当在程序中使用b时,底层的实现会自动解引用它,并使用a的值。
3 指针与引用的区别
(1)相同点:
- 访问变量。指针和引用都可以用于访问和操作变量的值。
- 在函数之间传递参数。指针和引用都可以被用来传递参数到函数中。
- 本质上都是地址。指针和引用本质上都是变量的地址。
- 修改变量的值。指针和引用都可以被用来修改变量的值。
(2)不同点:
-
操作方式不同:指针可以进行指针运算,可以通过指针加减来访问不同内存地址上的数据。而引用则不支持指针运算,只能通过其别名来访问数据。
-
空指针
指针可以是空指针(nullptr或NULL),可以用来表示指针不指向任何内存地址。而引用则必须在定义时进行初始化,并且必须引用一个已经存在的对象或变量,所以引用不会成为空引用。 -
引用更安全
由于引用必须在定义时进行初始化,并且无法让引用的对象更换,所以它有更好的类型安全,不会发生空指针引用或越界访问等问题。 -
内存管理
在指针中,需要程序员手动的进行内存管理,如动态内存申请,内存释放等操作。如果管理不当,就容易导致内存泄漏等问题。而引用则不需要进行内存管理,因为引用仅仅是一个别名。但是,在指针中也可以使用智能指针等方式来辅助管理内存,提高内存处理的安全性。 -
为函数参数
当作为函数参数时,引用会直接对传递进来的变量进行修改,而对于指针,则需要对指向指针变量的地址进行操作,例如对指针本身赋值、修改指针指向的对象等操作。