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

来源:互联网 发布:pe软件 编辑:程序博客网 时间:2024/06/05 08:43

【引用】,就是一个变量的别名(连内存都不分配)。 引用是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 指 取地址
【对象存在时,&就是取地址;不存在时,&就是在定义引用】

  

 

声明/定义的时候,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条款 )
原创粉丝点击