數組的引用與引用數組 、指針的引用

在 《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這個指針很特殊,在定義的時候必定要有初始化,這就爲它的優化提供了很好的依據。
上面的代碼徹底能夠變成下面這樣:

 

  1. int ia =1;  
  2. //int &ib = ia ; 編譯只需記住ib是ia的引用,不須要分配空間  
  3. int ic = 2 ;  
  4. printf("%p\n",&ia) ;  
  5. printf("%p\n",&ia) ; //原來是printf("%p\n",&ib) ;ib即ia(引用定義),故直接用ia來替換  
  6. printf("%p\n",&ic) ;   

最後這個代碼就沒有爲引用分配空間…… 若是標準沒有規定這些行爲,不一樣的編譯器會有不一樣的行爲。

指針的引用

再看一下指針的引用代碼

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)方法

  • p:  是指針的引用,main()方法裏的 *pn
  • *p:是main()方法裏的pn指向的內容。
相關文章
相關標籤/搜索