指標與引用的區別
變數 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;
}
swap1() 直接傳遞引數的內容,不能達到交換兩個數的值的目的。對於 swap1() 來說,a、b 是形參,是作用範圍僅限於函式內部的區域性變數,它們有自己獨立的記憶體,和 num1、num2 指代的資料不一樣。呼叫函式時分別將 num1、num2 的值傳遞給 a、b,此後 num1、num2 和 a、b 再無任何關係,在 swap1() 內部修改 a、b 的值不會影響函式外部的 num1、num2,更不會改變 num1、num2 的值。
swap2() 傳遞的是指標,能夠達到交換兩個數的值的目的。呼叫函式時,分別將 num1、num2 的指標傳遞給 p1、p2,此後 p1、p2 指向 a、b 所代表的資料,在函式內部可以通過指標間接地修改 a、b 的值。我們在《C語言指標變數作為函式引數》中也對比過第 1)、2) 中方式的區別。