引用 与 取地址 以及指针的关系

【引用】,就是一个变量的别名(连内存都不分配)。 引用是C++里定义的(C没有,&只是取地址操作)。

               可以看成是一个 const 指针 (指针地址不可变,指向的内容可变)。

 

【指针】,就是一个变量,是一个占用四字节的变量(32位机上),与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。

 

 

引用 与 指针 的区别:

  1. 引用必须在声明的同时初始化(且非NULL)                                                      而指针不必。
  2. 引用不可改变(是谁的别名就是谁),引用所指对象的值可以改变。                          指针随便改(指针的值,指针所指对象的值)
  3. 引用不分配内存                                                                                       指针在声明时就要分配

结论:对于   int& a;   引用实际是一种隐式指针,是方便编程而引入的,识别由编译器支持。     /*   其实引用&是一个能自动被编译器逆向引用的常量型指针

【两大作用】: /*  作为函数的参数,用于提高效率(如常量入参,返回类的成员变量的值)、返回数据...

                   /*   简化代码,使代码易读。   比如: 要使用 a->b->c->d->e->f->g,g是一个多重嵌套类中的一个整数成员,书写很麻烦,也容易错。 
                   /*                                           这时int   &z   =a->b->c->d->e->f->g; 

                   /*                                           以后直接使用z,因为他们的存贮单元本来一致,所以也根本没有效率的损失。

【引用】与【取地址】:

只有 在”变量 声明/定义“ 或 ”函数 声明/定义“ 中,      &var 代表引用。

在表达式中,                                                        &var 指 取地址
【对象存在时,&就是取地址;不存在时,&就是在定义引用】

[cpp]  view plain copy
  1. void func(int& var)    //传引用  
  2. {var=5;}  
  3. void func2(int* var)   //传指针  
  4. {*var=1;}             
  5.   
  6. main()  
  7. {  
  8.   int a=1000;  
  9.   int& ref = a;        // 在声明中,&是引用  
  10.   intconst ptr = &a; // 在表达式中,就是个取地址操作  
  11.     
  12.   func(a);             // a传引用,得a=5  
  13.   func(ref);           // 效果同上,ref就是a的别名  
  14.   func(*ptr);          // 效果同上,ptr指向a,*ptr等同于a的引用(这里是const指针)  
  15.   func(&a);            // Error , 不是声明/定义中,&a代表地址,现在func()要一个引用(即一个变量),而不是地址  
  16.   
  17.   func2(&a);           // OK. a=1;  func2 要一个指针,就是要一个地址。  
  18.   func2(ptr);          // OK.同上  
  19. }  
  

 

声明/定义的时候,int& var 就是通知编译器,这个参数是”传引用方式“传递。

用的时候 func(a) 就是在 传引用 调用了! 不是说func(&a)叫传引用!!!  //经常误解

 

 

 

 

 

 

 

【*和& 相互对偶】:

 两个作用:      1。  声明指针   2。 解引用

 两个作用:      1。 声明引用    2。 取地址 


使用 引用 的几个注意事项:

  1. 为了简化代码使用引用时,要注意内存泄露。比如 Class& ref = *ptr;也许这个的引用可以使你感觉更舒服的使用Class: 
    /*                      如ref.function();       而不必 (*ptr).function();   或ptr->function();                
    /*                     可是相比之下,一个严重的问题来了:内存泄露..
    /*                     因为引用不像指针那样明显:你很可能忘记:delete &mcref;
  2. 自定义类型中的成员变量 如果有引用 , 拷贝赋值时,编译器会拒绝。 因为不能用一个引用给另一个引用赋值(就是说,不能让引用改指向不同对象  //effective C++ 05条款 )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值