引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法:型別識別符號 &引用名=目標變數名;
引用最大的好處就是提高函式效率以及節省空間;
值傳遞 (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];
實際應用對比
1 #include "stdafx.h"這裡因為編譯器忽略了為任何陣列形參指定長度,所以會造成陣列記憶體越界問題。2 #include3 using namespace std;
4 void printvalues(const int ia[10])
5 10 }
11 12 int main()
13 ;
15 printvalues(j);
16 return 0;
17 }
而且,陣列有二個特性,影響作用在陣列上的函式:一是不能複製陣列,二是使用陣列名時, 陣列名會自動指向其第乙個元素的指標。因為不能複製,所以無法編寫使用陣列型別的形參,陣列會自動轉化為指標。
我們驗證下,將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"結果顯示,與pass by pointer方法結果一致,但是這裡有乙個缺陷,這裡面 int (&ia)[2],編譯器要檢查陣列實參和形參的大小。擴充套件性太差!#includeusing namespace std;
void printvalues( int (&ia)[2])}
int main()
; printvalues(j);
return 0;
}
#include "stdafx.h"#includeusing namespace std;
templatevoid printvalues( t (&ia)[n])
}int main()
; printvalues(j);
return 0;
}
c 對陣列的引用
所謂陣列引用,即指向陣列的引用 如 int a 10 int b 10 a 如果寫成 int a 10 int b a 將會報錯 cannot convert from int 10 to int 或許你會說在陣列名不就是指向這個陣列的乙個指標嗎?題中a是int 型別的,b是指向int 的引用,按理...
c 對陣列的引用
c和c 中有乙個 陣列降價 問題。include void test char arr 100 int main std cout sizeof arr std endl 輸出 100 test arr return 0 這段 的輸出是1004 對於同樣的arr,乙個輸出100,另乙個輸出4。是因為...
c 中陣列的引用
在c 裡,陣列也是可以引用的。如下 1 char str1 abcde 2char str2 6 str1 解讀第二句 括號的優先順序最高,str2 首先與 相結合,表明 str2 是乙個引用。接著 str2 與右邊的 6 結合,表明str2是陣列的引用,且陣列中有6個元素。最後 str2 6 與左...