一下都是网上的主要摘要,记录如下:
提问:
都说引用不占存储空间,可是这句话我不太理解,下面是我的一个测试例子:
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
说明了函数处理引用和指针实参上的不同,引用只是一个别名,并不会对引用形参重新分配内存单元,而只会对指针形参重新分配内存单元,产生了一份指针的副本