c++指针传递与引用传递

c 不支持引用传递的!
在 C++中,指针传递和引用传递是两种常用的参数传递方式,它们各自有不同的特点和适用场景。下面是两者之间的主要区别:

1. 语法和使用

指针传递

  • 定义和调用:函数参数是一个指针类型,调用时需要传递变量的地址。
  • 解引用:在函数内部需要使用解引用操作符 * 来访问指针指向的值。
  • 示例
    void modifyValuePointer(int *p) {
        *p = 20;  // 修改指针所指向的值
    }
    
    int main() {
        int value = 10;
        modifyValuePointer(&value);  // 传递变量的地址
        return 0;
    }
    

引用传递(引用的本质在c++内部实现是一个指针常量.

  • 定义和调用:函数参数是一个引用类型,调用时直接传递变量本身。
  • 直接使用:在函数内部可以直接使用引用变量,就像操作原始变量一样。
  • 示例
    void modifyValueReference(int &ref) {
        //int& ref = value; 
        //自动转换为 int* const ref = &value; 
        //指针常量是指针指向不可改,指针指向的值可以更改,这也说明为什么引用不可更改
        
        ref = 20;  // 直接修改引用绑定的对象
    }
    
    int main() {
        int value = 10;
        modifyValueReference(value);  // 直接传递变量
        return 0;
    }
    

2. 安全性

指针传递

  • 空指针:指针可以是 nullptr,因此在使用指针之前需要检查是否为 nullptr,以避免未定义行为。
  • 示例
    void modifyValuePointer(int *p) {
        if (p != nullptr) {
            *p = 20;
        } else {
            std::cerr << "Error: Null pointer" << std::endl;
        }
    }
    

引用传递

  • 不能为空:引用必须绑定到一个有效的对象,不能是 nullptr,因此不需要进行空指针检查。
  • 示例
    void modifyValueReference(int &ref) {
        ref = 20;  // 不需要检查空指针
    }
    

3. 可变性

指针传递

  • 重新绑定:指针可以在函数内部重新指向其他对象。
  • 示例
    void changePointer(int *p, int *q) {
        p = q;  // 只改变局部变量 p 的值,不影响调用者
    }
    
    int main() {
        int a = 10, b = 20;
        int *ptr = &a;
        changePointer(ptr, &b);  // ptr 仍然指向 a
        return 0;
    }
    

引用传递

  • 不可重新绑定:引用一旦绑定到某个对象后,就不能重新绑定到其他对象。
  • 示例
    void changeReference(int &ref, int &otherRef) {
        // ref = otherRef;  // 这只是修改了 ref 绑定的对象的值,不是重新绑定引用
    }
    
    int main() {
        int a = 10, b = 20;
        int &ref = a;
        changeReference(ref, b);  // ref 仍然绑定到 a
        return 0;
    }
    

4. 性能

指针传递

  • 额外开销:指针传递可能需要额外的解引用操作,这可能会带来一些性能开销。

引用传递

  • 优化:编译器通常会对引用进行优化,使得引用传递的性能与直接传递变量相同或接近。

5. 可读性和简洁性

指针传递

  • 可读性:指针传递需要显式地使用解引用操作符,这可能会使代码稍微复杂一些,尤其是对于初学者来说。

引用传递

  • 简洁性:引用传递更加简洁和直观,代码更容易理解和维护。

总结

  • 指针传递:适用于需要灵活地重新绑定对象或需要显式检查空指针的场景。
  • 引用传递:适用于需要保证参数非空且希望代码更简洁、更安全的场景。
posted @ 2024-10-07 11:45  yuanyulinyi  阅读(25)  评论(0编辑  收藏  举报