c++指標傳遞與引用傳遞

yuanyulinyi發表於2024-10-07

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. 可讀性和簡潔性

指標傳遞

  • 可讀性:指標傳遞需要顯式地使用解引用運算子,這可能會使程式碼稍微複雜一些,尤其是對於初學者來說。

引用傳遞

  • 簡潔性:引用傳遞更加簡潔和直觀,程式碼更容易理解和維護。

總結

  • 指標傳遞:適用於需要靈活地重新繫結物件或需要顯式檢查空指標的場景。
  • 引用傳遞:適用於需要保證引數非空且希望程式碼更簡潔、更安全的場景。

相關文章