指针和引用是否分配存储单元的简易理解

来源:互联网 发布:linux dd命令详解 编辑:程序博客网 时间:2024/05/22 06:40

一下都是网上的主要摘要,记录如下:

 提问:

都说引用不占存储空间,可是这句话我不太理解,下面是我的一个测试例子:
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

说明了函数处理引用和指针实参上的不同,引用只是一个别名,并不会对引用形参重新分配内存单元,而只会对指针形参重新分配内存单元,产生了一份指针的副本





  

0 0
原创粉丝点击