在 《C++ Primer 第四版》的第七章中,講到了經過引用傳遞數組,和其餘類型同樣,數組形參可聲明爲數組的引用。若是形參是數組的引用,編譯器不會將數組實參轉化爲指針,而 是傳遞數組的引用自己。在這種狀況下,數組大小成爲形參與實參類型的一部分,編譯器檢查數組實參的大小與形參的大小是否匹配。html
#include <iostream> using namespace std; void output(int (&a)[5]) { for(int i = 0; i < 5; i++) cout<<a[i]<<endl; } int main() { int a[5]={0}; output(a); getchar(); return 0; }
輸出結果爲:ios
也能夠在函數中直接聲明一個對數組的引用:數組
#include <iostream> using namespace std; int main() { int a[5]={0}; int (&b)[5] = a; for(int i = 0; i < 5; i++) cout<<b[i]<<endl; cout<<sizeof(b); getchar(); return 0; }
輸出結果爲:函數
從運行結果中能夠看到b的大小和數組a的大小同樣,也爲20。優化
可見數組的引用一樣能夠看作是數組的一個別名。spa
但若是將上面代碼中的 int (&b)[5] = a; 改成 int &b[5] = a;則編譯沒法經過,由於聲明瞭一個引用數組。即使你將引用數組b中的每個元素b[i]看作對a[i]的引用,而後對每個元素進行初始化,也是錯誤的:.net
int &b[5] = {a[0],a[1],a[3],a[3],a[4]};指針
一句話,你能夠建立對數組的引用,但你不能建立一個元素都是引用的數組。code
附:引用佔用內存空間嗎?摘自http://topic.csdn.net/u/20090604/10/4d7d6b83-8477-4817-8bd0-b4c3e6df8e20.htmlhtm
引用是在彙編代碼中是如何實現的,這要看編譯器的實現,不過大數多編譯器用指針來實現。但並不代碼會爲它分配空間。
如下面程序爲例:
int ia =1; int &ib = ia ; int ic = 2 ; printf("%p\n",&ia) ; printf("%p\n",&ib) ; printf("%p\n",&ic) ;
經編譯器後,能夠轉換成以下的代碼:
int ia =1; int *ib = &ia ; //ib由引用變成指針 int ic = 2 ; printf("%p\n",&ia) ; printf("%p\n",ib) ; //引用取地址=>指針自己就是地址 printf("%p\n",&ic) ;
這裏爲ib分配了一個空間,但由ib這個指針很特殊,在定義的時候必定要有初始化,這就爲它的優化提供了很好的依據。
上面的代碼徹底能夠變成下面這樣:
最後這個代碼就沒有爲引用分配空間…… 若是標準沒有規定這些行爲,不一樣的編譯器會有不一樣的行爲。
再看一下指針的引用代碼
int m_value = 1; void func(int *&p) { p = &m_value; // 也能夠根據你的需求分配內存 p = new int; *p = 5; } int main(int argc, char *argv[]) { int n = 2; int *pn = &n; cout << *pn << endl; func(pn); cout << *pn <<endl; return 0; }
看一下func(int *&p)方法