C++函数参数传入指针与引用区别


前言

在C++中,将指针或引用作为函数参数传递时,主要区别体现在语法、空值合法性、可修改性及安全性上。以下是具体分析及代码示例:


一、语法差异

  • 指针需要显式传递地址和解引用操作。

  • 引用直接操作变量,语法更简洁。

// 指针参数:需解引用
void modify_via_ptr(int* p) {
    *p = 10; 
}

// 引用参数:直接使用变量名
void modify_via_ref(int& r) {
    r = 20; 
}

int main() {
    int a = 0;
    modify_via_ptr(&a); // 需取地址
    modify_via_ref(a);  // 直接传变量
}

二、空值合法性

  • 指针可以为 nullptr,需检查有效性。
  • 引用必须绑定有效对象,不可为空。
void unsafe_ptr(int* p) {
    *p = 10; // 若 p 为 nullptr,程序崩溃!
}

void safe_ref(int& r) {
    r = 20; // 引用必须有效,无需检查
}

int main() {
    int x;
    unsafe_ptr(nullptr); // 危险!
    safe_ref(x);        // 安全
}

三、可修改性

  • 指针可重新指向其他内存。
  • 引用绑定后不可更改目标。
void redirect_ptr(int* p) {
    p = new int(30); // 仅修改局部指针副本
}

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

int main() {
    int a = 0;
    int* ptr = &a;
    redirect_ptr(ptr);  // a 仍为 0
    modify_ref(a);      // a 变为 40
}

四、安全性

  • 引用天然避免空指针问题,更安全。
  • 指针需额外检查空值。
void print_ref(const std::string& s) {
    std::cout << s; // 无需检查空值
}

void print_ptr(const std::string* s) {
    if (s) std::cout << *s; // 必须检查指针有效性
}

五、应用场景

  • 指针适合动态内存管理或需改变指向的场景。
  • 引用适合运算符重载、避免拷贝的场景。
// 指针用于动态内存
void allocate(int** p) {
    *p = new int(50); // 修改外部指针
}

// 引用用于避免拷贝
void process_large_data(const BigData& data) {
    // 无需深拷贝,直接操作原数据
}

总结

特性指针引用
语法需取地址 (&) 和解引用 (*)直接使用变量名
空值可为 nullptr必须绑定有效对象
可修改目标可以重新指向其他地址绑定后不可更改
安全性需手动检查空指针天然避免空值问题
典型用途动态内存、可选参数必须有效参数、运算符重载

根据需求选择:需空值或重定向时用指针;需安全简洁时用引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值