一下都是網上的主要摘要,記錄如下:
提問:
都說引用不佔存儲空間,可是這句話我不太理解,下面是我的一個測試例子:
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++沒有規定引用的底層實現,所以編譯器實現時,可以爲引用分配空間,也可以不分配空間~~~不過大數多編譯器用指針來實現。但並不代表會爲它分配空間。
以下面程序爲例:
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
說明了函數處理引用和指針實參上的不同,引用只是一個別名,並不會對引用形參重新分配內存單元,而只會對指針形參重新分配內存單元,產生了一份指針的副本