Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11069
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-23 09:56
文章分类

全部博文(4)

文章存档

2014年(4)

我的朋友

分类: C/C++

2014-09-05 11:23:13

      度娘的百科上是这么定义引用的:引用就是某一变量(目标)的一个别名,对引用的操作与对该变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。int a,&ra=a; a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;
      引用是怎么实现的呢,看一小段代码:
 int main(){
        int a = 4;
        int &b = a;
        
        b=7;
        return 0;
 }
      编译后,该段程序的汇编代码如下:
   0000000000000000
:
   0: 55                    push   %rbp
   1: 48 89 e5              mov    %rsp,%rbp
   4: c7 45 f4 04 00 00 00  movl   $0x4,-0xc(%rbp)   -------变量a在栈中的地址-0xc(%rbp),内容存数值4
   b: 48 8d 45 f4           lea    -0xc(%rbp),%rax         
   f: 48 89 45 f8           mov    %rax,-0x8(%rbp)       -------引用b在栈中的地址-0x8(%rbp),内容存储了变量a的地址
  13: 48 8b 45 f8           mov    -0x8(%rbp),%rax
  17: c7 00 07 00 00 00     movl   $0x7,(%rax)        --------b=7,实际上是将-0x8(%rbp)的内容转换为地址,数值7存放到该地址
  1d: b8 00 00 00 00        mov    $0x0,%eax
  22: 5d                    pop    %rbp
  23: c3                    retq   
      由上可见,其实对引用变量存放了被引用变量的地址,对引用变量的操作,其实就是对被引用变量的地址的操作。看到这里是不是有似曾相识的感觉,有点类似于指针概念。修改程序如下:
int main(){
        int a = 4;
        int &b = a;
        int *c = &a;
        b=7;
        *c=8;
        return 0;
 }
    编译后:

0000000000000000

:
   0: 55                    push   %rbp
   1: 48 89 e5              mov    %rsp,%rbp
   4: c7 45 ec 04 00 00 00  movl   $0x4,-0x14(%rbp)
   b: 48 8d 45 ec           lea    -0x14(%rbp),%rax
   f: 48 89 45 f0           mov    %rax,-0x10(%rbp)     -----&b=a
  13: 48 8d 45 ec           lea    -0x14(%rbp),%rax
  17: 48 89 45 f8           mov    %rax,-0x8(%rbp)     -----c=&a
  1b: 48 8b 45 f0           mov    -0x10(%rbp),%rax
  1f: c7 00 07 00 00 00     movl   $0x7,(%rax)         ----b=7
  25: 48 8b 45 f8           mov    -0x8(%rbp),%rax
  29: c7 00 08 00 00 00     movl   $0x8,(%rax)        ----*c=8
  2f: b8 00 00 00 00        mov    $0x0,%eax
  34: 5d                    pop    %rbp
  35: c3                    retq  

       引用b存放了变量a的地址,指针c也存放了a的地址,但是通过b可以直接对a修改,而通过指针c必须解引用后才能对a修改。度娘里有这么一段说明,对引用求地址,就是对目标求地址,修改代码
int main(){
        int a = 4;
        int &b = a;
        int *c = &a;
        b=7;
        c=&b;
        return 0;
 }
    编译后
0000000000000000

:
   0: 55                    push   %rbp
   1: 48 89 e5              mov    %rsp,%rbp
   4: c7 45 ec 04 00 00 00  movl   $0x4,-0x14(%rbp)
   b: 48 8d 45 ec           lea    -0x14(%rbp),%rax
   f: 48 89 45 f0           mov    %rax,-0x10(%rbp)
  13: 48 8d 45 ec           lea    -0x14(%rbp),%rax
  17: 48 89 45 f8           mov    %rax,-0x8(%rbp)
  1b: 48 8b 45 f0           mov    -0x10(%rbp),%rax
  1f: c7 00 07 00 00 00     movl   $0x7,(%rax)
  25: 48 8b 45 f0           mov    -0x10(%rbp),%rax 
  29: 48 89 45 f8           mov    %rax,-0x8(%rbp)    -----c=&b
  2d: b8 00 00 00 00        mov    $0x0,%eax
  32: 5d                    pop    %rbp
  33: c3                    retq  

阅读(391) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~