C++指针与引用的区别详解
C++中指针和引用都是间接操作内存的机制,但它们在语法、功能和使用场景上有显著区别。从初始化、可修改指向、空值、访问操作、内存管理、多级间接指向、sizeof等方面进行说明。
1、定义与本质
指针.
变量存储的是另一个变量的内存地址,通过解引用(*)操作符访问目标值。
int a = 10;
int *p = &a; // p存储a的地址
引用
是目标变量的别名,直接绑定到目标变量,没有独立的内存空间
int a = 10)
int &r = a, //r是a的别名
2.初始化
指针
可以不初始化(但可能成为野指针)。可以指向空值(nullptr)。
int *p1;
//未初始化(危险!)
int *p2:= nullptr;//空指针
引用
必须初始化且不可更改为绑定其他对象。不能绑定空值。
int a = 10;
int &rl = a;// 正确
// int &r2;// 错误:必须初始化
3.可修改性
指针
可以修改指向的地址。
int a = 10,b = 20:
int *p = &a;
p = &b;//修改指针指向b
引用
一旦绑定对象,无法更改。
int a= 10,b = 20;
int &r = a;
//r=b; //实际是赋值操作:a =b
4.空值(Nullability)
指针
可以指向空值(nullptr)。
int *p = nullptr; // 合法
引用
必须绑定有效对象,不能为空
// int &r = nullptr;// 错误!
5.操作符
·指针
使用 *解引用访问目标值。
支持指针算术运算(如 ++,--)。
int arr[3]={1,2,3};
int *p = arr;
cout << *(p + 1);// 输出2(等价于arr[1])
引用
直接使用引用名访问目标值。不支持算术运算。
int a = 10;
int &r = a;
cout <<r;// 输出10
6.参数传递
指针.
传递地址,函数内需解引用修改值。
void increment(int *p){(*p)++;}
int a = 10;
increment(&a);//a变为11
引用
直接操作原变量,语法更简洁
void increment(int &r){r++;}
int a = 10;
increment(a);// a变为11
7.内存管理
指针.
可动态分配内存(new/delete)。
int *p = new int(10);
delete p;//必须手动释放内存
引用
不能直接管理动态内存,但可绑定到动态分配的对象。
int *p = new int(10);
int &r = *p; // r绑定到*p
delete p; //r变为悬空引用(危险!)
8.多级间接访问
指针
支持多级指针(如 int **pp)
int a = 10;
int *p = &ar
int **pp = &p; // 指向指针的指针
引用
.不支持多级引用,但可绑定到指针,
int a = 10;
int *p = &a;
int *&rp = p;// 引用绑定到指针
9.sizeof 行为
指针
返回指针本身的大小(如 4或8字节)。
int *p;
cout << sizeof(p);//输出4(32位系统)或8(64位)
引用
返回目标对象的大小。
int a = 10;
int &r = a;
cout << sizeof(r);// 输出4(假设int为4字节)
10.适用场景
指针
动态内存管理,
需要指向不同对象或空值的情况,
实现数据结构(如链表、树)。
引用
函数参数传递(避免拷贝)。。
运算符重载(如operator=)
返回值优化(链式调用)。
