Friday, April 12, 2024

[C++] 指標與引用的區別

指標與引用的區別

變數 Abc = abd  給值就是進行拷貝,指的是將一塊記憶體上的資料複製到另一塊記憶體


對於 char、bool、int、float 等基本型別的資料,佔用記憶體往往只有幾個位元組,拷貝時非常快速


但是陣列、結構體、物件一系統資料的集合,資料的數量沒有限制,可能會消耗很多時間。

所以c/c++禁止在函式呼叫時直接傳遞陣列的內容,而是強制傳遞陣列指標

結構體和物件沒有這種限制,呼叫函式時即可以傳遞指標,可以直接傳遞內容,為了提高效率,建議傳遞指標。


reference

通常引用在於函數傳遞參數時,實參和形參繫結在一起,讓它們都指代同一份資料

但在 c++中,我們有一種指標更多便捷的傳遞聚合型別資料方式,就是 reference。

引用的定義用 & 取代了 *, 

Int &ab = cd;

引用必須在定義的同時初始化,並且以後也要從一而終,不能再引用其它資料,這有點類似於 const。

#include <iostream>
using namespace std;
int main() {
    int a = 99;
    int &r = a;
    cout << a << ", " << r << endl;
    cout << &a << ", " << &r << endl;
    return 0;
}

執行結果:
99, 99
0x28ff44, 0x28ff44

注意:引用在定義時需要新增 &,在使用時不能新增 &,使用時新增 & 表示取地址


如果讀者不希望通過引用來修改原始的資料,那麼可以在定義時新增 const 限制,形式為:

const type &name = value;

也可以是:

type const &name = value;

這種引用方式為常引用

C++引用作為函式引數

在定義或宣告函式時,我們可以將函式的形參指定為引用的形式,這樣在呼叫函式時就會將實參和形參繫結在一起,讓它們都指代同一份資料。如此一來,如果在函式體中修改了形參的資料,那麼實參的資料也會被修改,從而擁有“在函式內部影響函式外部資料”的效果

#include <iostream>
using namespace std;
void swap1(int a, int b);
void swap2(int *p1, int *p2);
void swap3(int &r1, int &r2);
int main() {
    int num1, num2;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap1(num1, num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap2(&num1, &num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap3(num1, num2);
    cout << num1 << " " << num2 << endl;
    return 0;
}
//直接傳遞引數內容
void swap1(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}
//傳遞指標
void swap2(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
//按引用傳參
void swap3(int &r1, int &r2) {
    int temp = r1;
    r1 = r2;
    r2 = temp;
}
  1. swap1() 直接傳遞引數的內容,不能達到交換兩個數的值的目的。對於 swap1() 來說,a、b 是形參,是作用範圍僅限於函式內部的區域性變數,它們有自己獨立的記憶體,和 num1、num2 指代的資料不一樣。呼叫函式時分別將 num1、num2 的值傳遞給 a、b,此後 num1、num2 和 a、b 再無任何關係,在 swap1() 內部修改 a、b 的值不會影響函式外部的 num1、num2,更不會改變 num1、num2 的值。



  1. swap2() 傳遞的是指標,能夠達到交換兩個數的值的目的。呼叫函式時,分別將 num1、num2 的指標傳遞給 p1、p2,此後 p1、p2 指向 a、b 所代表的資料,在函式內部可以通過指標間接地修改 a、b 的值。我們在《C語言指標變數作為函式引數》中也對比過第 1)、2) 中方式的區別。



No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能