當前位置:
首頁 > 知識 > C++ 中指針和引用的區別

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

對比上述三個示常式序,會發現"引用傳遞"的性質象"指針傳遞",而書寫方式象"值傳遞"。

實際上"引用"可以做的任何事情"指針"也都能夠做,為什麼還要"引用"這東西?

答案是"用適當的工具做恰如其分的工作"。

指針能夠毫無約束地操作內存中的任何東西,儘管指針功能強大,但是非常危險。

如果的確只需要借用一下某個對象的"別名",那麼就用"引用",而不要用"指針",以免發生意外。

C++ 中指針和引用的區別

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Jenkins+RobotFramework持續集成測試-jenkins環境搭建
Linux 常用基本命令之重定向

TAG:程序員小新人學習 |