指針和引用是否分配存儲單元的簡易理解

一下都是網上的主要摘要,記錄如下:

 提問:

都說引用不佔存儲空間,可是這句話我不太理解,下面是我的一個測試例子:
int ia =1;
int &ib = ia ;
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",&ib) ;
printf("%p\n",&ic) ;


可是輸出的是:


0012FF64
0012FF64
0012FF5C


也就是ia和ic之間隔了8個字節,這不說明引用ib也佔了內存空間嗎??如果不佔內存空間,ia,ic之間不是應該只隔4字節的嗎?
請高人指點~


結論:

   c++沒有規定引用的底層實現,所以編譯器實現時,可以爲引用分配空間,也可以不分配空間~~~不過大數多編譯器用指針來實現。但並不代表會爲它分配空間。

以下面程序爲例:

 

C/C++ code
 
int ia =1;
int *ib = &ia ;    //ib由引用變成指針
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",ib) ;  //引用取地址=>指針本身就是地址
printf("%p\n",&ic) ; 

這裏爲ib分配了一個空間,但由ib這個指針很特殊,在定義的時候一定要有初始化,這就爲它的優化提供了很好的依據。也就是說,引用和指針一樣佔4個字節(和int一樣) ,引用其實就是加了一些限制的指針,這裏爲他分配了ib變量分配了4字節。


上面的代碼完全可以變成下面這樣:


int ia =1;

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


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


以下是我對 “引用和指針傳遞函數的參數” 個人的理解,以下面程序爲例:

    int i = 5;
    int *k = &i;
    int &x = i;
    printf("%p\n",&k);

    testA(k);  

    printf("%p\n",&x);
    testB(x);


void testA(int* p)
{
    printf("%p\n",&p);
}

void testB(int& p)
{
    printf("%p\n",&p);
}


輸出如下:

  0x001ef4bc

  0x001ef3d8

  0x001ef4c8

  0x001ef4c8

說明了函數處理引用和指針實參上的不同,引用只是一個別名,並不會對引用形參重新分配內存單元,而只會對指針形參重新分配內存單元,產生了一份指針的副本





  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章