boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

引用和指针有什么区别 两种间接访问方式对比


avatar
站长 2025年8月15日 4

指针是存储地址的变量,可重新赋值和为空,支持算术运算;引用是变量别名,必须初始化且不可重绑定,更安全简洁,常用于函数参数和操作符重载。

引用和指针有什么区别 两种间接访问方式对比

引用和指针都能实现间接访问变量,但它们在语法、使用方式和底层机制上有明显不同。理解这些差异有助于写出更安全、高效的C++代码。

定义与初始化

指针是一个变量,存储的是另一个变量的内存地址。它可以被声明后不立即初始化,也可以在程序运行过程中指向不同的对象。

int a = 10;
int* ptr = &a; // 指针指向a的地址
ptr = nullptr; // 可以被设为空或重新赋值

引用是某个已存在变量的别名,必须在声明时初始化,且一旦绑定就不能再指向其他变量。

int a = 10;
int& ref = a; // ref是a的别名
// ref = b; // 错误:不能重新绑定引用

内存与操作方式

指针本身有独立的内存空间,存储的是地址值。你可以对指针进行算术运算(如ptr++),也可以有多级指针(如int**)。

int arr[5] = {1,2,3,4,5};
int* p = arr;
p++; // 指向下一个元素

引用不占用额外的“对象级”内存概念(编译器通常用指针实现引用,但对程序员透明),不能进行算术操作,也不支持多级引用(虽然有引用的引用,但会被折叠)。

int& r = a;
// r++; // 操作的是a的值,不是地址移动

空值与安全性

指针可以为空(nullptr),这在函数返回失败或可选对象时非常有用,但也带来了空指针解引用的风险。

int* ptr = nullptr;
if (ptr) { /* 安全检查 */ }

引用必须绑定到一个有效对象,不能为“空”。一旦引用被创建,它就始终有效(前提是原对象未销毁)。这使得引用更安全,但前提是初始化正确。

int& badRef = *static_cast(nullptr); // 危险,未定义行为

作为函数参数的使用

指针传参明确表示可以修改或为空,常用于C风格接口。

void func(int* p) {
if (p) *p = 20;
}

引用传参更简洁,常用于C++中的输出参数或避免拷贝大对象。

void func(int& r) {
r = 20; // 直接修改原变量
}

引用还能用于实现操作符重载(如operator

基本上就这些。引用更安全、简洁,适合大多数间接访问场景;指针更灵活,适合动态内存、数组操作和可选对象处理。选择哪种方式,取决于具体需求和代码风格。



评论(已关闭)

评论已关闭