C++ 中指針和引用的區別
C++ 引用與指針的比較
引用是 C++ 中的概念,初學者容易把引用和指針混淆一起。
一下程序中,n 是m的一個引用(reference),m 是被引用物(referent)。
int m;
int &n = m;
n 相當於 m 的別名(綽號),對 n 的任何操作就是對m的操作。
所以 n 既不是m的拷貝,也不是指向 m 的指針,其實n就是 m 它自己。
引用的規則:
- (1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。
- (2)不能有 NULL 引用,引用必須與合法的存儲單元關聯(指針則可以是 NULL)。
- (3)一旦引用被初始化,就不能改變引用的關係(指針則可以隨時改變所指的對象)。
以下示常式序中,k 被初始化為i的引用。
語句 k = j 並不能將 k 修改成為j的引用,只是把k的值改變成為 6。
由於 k 是 i 的引用,所以i的值也變成了 6。
int i = 5;
int j = 6;
int &k = i;
k = j; // k 和 i 的值都變成了 6;
引用的主要功能是傳遞函數的參數和返回值。
C++ 語言中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。
以下是"值傳遞"的示常式序。
由於 Func1 函數體內的 x 是外部變數 n 的一份拷貝,改變 x 的值不會影響 n, 所以 n 的值仍然是 0。
void Func1(int x)
{
x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0
以下是"指針傳遞"的示常式序。
由於 Func2 函數體內的 x 是指向外部變數 n 的指針,改變該指針的內容將導致 n 的值改變,所以 n 的值成為 10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10
以下是"引用傳遞"的示常式序。
由於 Func3 函數體內的 x 是外部變數 n 的引用,x 和 n 是同一個東西,改變 x 等於改變 n,所以 n 的值成為 10。
void Func3(int &x)
{
x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10
對比上述三個示常式序,會發現"引用傳遞"的性質象"指針傳遞",而書寫方式象"值傳遞"。
實際上"引用"可以做的任何事情"指針"也都能夠做,為什麼還要"引用"這東西?
答案是"用適當的工具做恰如其分的工作"。
指針能夠毫無約束地操作內存中的任何東西,儘管指針功能強大,但是非常危險。
如果的確只需要借用一下某個對象的"別名",那麼就用"引用",而不要用"指針",以免發生意外。
※Jenkins+RobotFramework持續集成測試-jenkins環境搭建
※Linux 常用基本命令之重定向
TAG:程序員小新人學習 |