指针和引用到底有啥不一样?别再傻傻分不清啦!


指针和引用在C++中都是用于间接访问内存地址的方式,但它们之间存在一些关键的区别,理解这些区别对于编写正确的代码非常重要。

首先,指针是变量,它们可以存储任何类型的地址,包括其他指针。指针可以重新赋值指向不同的对象,也可以被设置为`nullptr`,表示不指向任何有效的对象。例如:

```cpp

int a = 10;

int ptr = &a; // ptr指向a的地址

ptr = nullptr; // ptr不再指向任何对象

```

其次,引用是变量的别名,一旦被初始化后,就不能再被指向其他对象。引用必须被初始化,并且一旦初始化后,就不能被设置为`nullptr`。例如:

```cpp

int a = 10;

int &ref = a; // ref是a的别名

// ref = nullptr; // 这是不允许的,引用必须始终指向一个有效的对象

```

此外,指针可以指向数组或动态分配的内存,而引用不能。指针需要使用`new`和`delete`来管理动态内存,而引用则不需要。例如:

```cpp

int arr = new int[5]; // 动态分配数组

delete[] arr; // 释放动态分配的内存

int a = 10;

int &ref = a; // 引用不需要管理内存

```

最后,指针可以有多级间接,即指针的指针(`int ptrPtr`),而引用不支持这种多级间接。例如:

```cpp

int a = 10;

int ptr = &a;

int ptrPtr = &ptr; // 指针的指针

int &ref = a;

// int &&refRef = &ref; // 这是不允许的,引用不能有多级间接

```

总结来说,指针是灵活但易出错的概念,需要小心管理内存和避免悬空指针。引用是安全的别名,一旦初始化后就不能改变,适用于需要常量引用的场景。理解这些区别有助于在编写代码时做出正确的选择。