C 傳遞引用與傳指標 傳值的區別

2021-09-05 13:02:26 字數 1917 閱讀 1175

引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法:型別識別符號 &引用名=目標變數名;

引用最大的好處就是提高函式效率以及節省空間;

值傳遞 (pass by value),指標傳遞(pass by pointer),當發生函式呼叫時,需要給形參分配儲存單元、當傳遞是物件時,要呼叫拷貝建構函式。

而且指標最後析構時,要處理記憶體釋放問題。

引用傳遞(pass by refenrence),在記憶體中沒有產生形參。效率大大提高!也不用處理指標的析構問題。

通過以上分析,我們設計程式時在形參中資料較為複雜時(比如以物件作為引數),應該盡量使用引用,少利用指標與值傳遞。

引用只能是"某一"變數的乙個別名;具有一經定義就不可更改性;

int a = 10;

int b = 20;

int &c = a; //給變數a定義乙個別名c;且c只能是a變數的別名;(如int &c = b 與 c = b; //錯誤)

陣列的引用

int a[10] =;

int &b = (&a)[10];

實際應用對比

#include "stdafx.h"

#includeusing namespace std;

void printvalues(const int ia[10])

}int main()

; printvalues(j);

return 0;

}

這裡因為編譯器忽略了為任何陣列形參指定長度,所以會造成陣列記憶體越界問題。

而且,陣列有二個特性,影響作用在陣列上的函式:一是不能複製陣列,二是使用陣列名時, 陣列名會自動指向其第乙個元素的指標。因為不能複製,所以無法編寫使用陣列型別的形參,陣列會自動轉化為指標。

我們驗證下,將void printvalues(const int ia[10])改為 void printvalues(const int *ia),結果與上圖一致,這裡就不貼了。

那麼怎麼解決這個問題呢?

#include "stdafx.h"

#includeusing namespace std;

void printvalues(const int *ia,int size)}

int main()

; printvalues(j,sizeof(j)/sizeof(*j));

return 0;

}

此方法雖然可以解決問題,但並不是我們需要的,這部分**看不出來區別,但工程龐大後,使用引用要比指標高效,所以我們還是要利用引用的特性來解決這個問題。

將陣列形參可宣告為陣列的引用,如果形參是陣列的引用,編譯器會傳遞陣列的引用本身

我們再修改下**:如下

#include "stdafx.h"

#includeusing namespace std;

void printvalues( int (&ia)[2])}

int main()

; printvalues(j);

return 0;

}

結果顯示,與pass by pointer方法結果一致,但是這裡有乙個缺陷,這裡面 int (&ia)[2],編譯器要檢查陣列實參和形參的大小。擴充套件性太差!

#include "stdafx.h"

#includeusing namespace std;

templatevoid printvalues( t (&ia)[n])

}int main()

; printvalues(j);

return 0;

}

原文:

C 的傳值 傳引用 傳指標的區別

參考文章 相同點 都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 而引用則是某塊記憶體的別名。不同點 指標是乙個實體,而引用僅是個別名 引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 指標可以 見異思遷 引用沒有const,指標有const,const的指標不可變...

C 中傳值,傳指標,傳引用的區別

自 當呼叫函式時,傳遞的引數有傳值 傳指標 傳引用這三種形式。直接傳值是直接開闢了乙個跟主函式實參一樣的空間 位址不一樣 裡面存放了了跟實參一樣大小的值,就相當於數值大小相同但是位置不同。你在這個呼叫函式裡使用這個一樣大小的值,完全不影響主函式實參的值。就好比主函式的空間就是一棟樓,裡面的乙個房間裡...

傳值和傳引用 傳指標的區別

傳值,是把實參的值賦值給行參,那麼對行參的修改,不會影響實參的值 傳位址,是傳值的一種特殊方式,只是他傳遞的是位址,不是普通的如 int,那麼傳位址以後,實參和行參都 指向同乙個物件 傳引用,真正的以位址的方式傳遞引數,傳遞以後,行參和實參 都是同乙個物件 只是他們名字不同而已,對行參的修改將影響實...