引用 的本质探究

//引用的意义:
/*(1):引用作为其他变量的别名而存在,因此可以在一些场合可以替代指针。
   int swap1(int &a,int &b)                    int swap2(int *a,int *b)
   {                                           {
       int t=a;                                    int t=*a; 
       a=b;                                        *a=*b;
       b=t;                                        *b=t;
       return 0;                                   return 0;
    }                                                }*/
//(2):引用相对于指针来说具有更好的可持续性和实用性
 //引用本质思考:
//思考一:C++编译器在背后做了什么工作 
#include<iostream>
using namespace std; 
//1::单独定义引用时,必须初始化,说明很像一个常量。 
int main01()
{
    //const int c1;//单独定义时候必须初始化
    int a=10;
    int &b=a;//从这一点来讲B很像一个常量。 
    printf("a:%d\n",a);
    printf("b:%d\n",b);
    printf("&a:%d\n",&a);
    printf("&b:%d\n",&b); //==>说明a和b就是同一块内存空间的门牌号 
    cout<<"hello"<<endl;
    return 0;
 } 
 //2:请问下面结构体有没有分配内存?也就是问普通引用有自己的内存空间吗? 
 struct teacher
 {
     char name[64];
     int age;
     int  &a;
     int  &b;
 }; 
 int main02()
 {
     printf("sizeof(teacher):%d\n",sizeof(teacher)); //得出的结果是88,意思就是int &a和int &b都占了8个内存、 
     cout<<"hello"<<endl;
     return 0;
  }
  /*3:引用的本质:
  (1):引用在 C++的内部实现是一个指针 ,type &name<==>type *const name
   void func(int &a)                          void func(int *const a)
  {                                           {
      a=5;                                        *a=5;
  }                                  }
  (2):C++编译器在编译过程中使用常指针作为引用的内部实现,因此信用所占用的内存空间大小与指针相同。
  (3):从使用的角度引用会让人误会只是一个别名,没有自己的存储空间,合适C++为了实用性而做出的细节隐藏 。 */
  void modify1(int &a1)
  {
      a1=100;
  }
  void modify2(int * const a1)
  {
      *a1=200;//*实参的地址,去间接的修改实参的值。 
  }
  int main03()
  {
      int a=10;
      modify1(a);//指向这个函数调用的时候,我们程序员不需要取a的地址,C++编译器已经给我们取好了。 
      a=10;
      modify2(&a);//如果是指针,需要我们程序员手工的取实参的地址。 
      cout<<"hello"<<endl;
      return 0;
  }
  /*间接赋值(*p)成立的三个条件:
  (a)定义两个变量,(通常一个形参,一个实参)
  (b)建立关系,实参取地址赋给形参指针。
  (c)*p形参去简介修改实参的值*/
 void modify3()
 {
     *p=200;//3:间接修改实参的值 
 }
 int main()
 {
     int a=10;
     int *p=NULL;//1:定义两个变量。 
     p=&a;
     *p=100;
     modify3(&a);//2:建立关联 
     cout<<"hello"<<endl;
  } 
  //可以123放在一个函数,可以12放在一个,3独放在一个,就是函数,可以1放在一个23放在一个,这就是引用。
 /*引用结论:
 (1)引用在实现上,只不过是吧,间接赋值成立的三个条件的后两步合二为一。
 当实参传给形参引用的时候,只不过是C++编译器帮我们程序员手工的取了一个实参的地址,传给了形参引用(常量指针)
 (2)当我们使用引用的语法的时候,我们不去关心编译器引用是怎么做的,
      当我们分析奇怪的语法现象的时候,我们才去考虑C++编译器是怎么做的。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值