22.引用指针

  • 引用的本质就是两个变量名的地址是同一块内存,可以改变该地址指向的内容
  • 引用指针可以改变指针指向的地址(因为取地址就是指针变量的地址,地址改变,原指针指向的地址也变了),也可以改变指针指向的内容
  • 左值引用与右值引用
     1 //左值引用与右值引用
     2 void main1()
     3 {
     4     int a(4);
     5     int *p(new int(5));
     6     cout << a << endl;
     7     cout << *p << endl;
     8     //右值引用
     9     int &&rra(move(a));//右值引用,有内存实体就直接引用,没有就开辟内存
    10     rra = 1;
    11     cout << a << endl;
    12 
    13     //左值引用
    14     int &la(a);
    15     int *&lp(p);
    16     la = 3;
    17     *lp = 12;
    18     cout << a << endl;
    19     cout << *p << endl;
    20 
    21 
    22     cin.get();
    23 }
  • 一级指针引用改变指针的指向
     1 //引用一级指针
     2 int num1 = 10;
     3 int num2 = 20;
     4 //C++能用引用就别用指针
     5 //引用可以改变指针的地址也可以改变指针指向的地址或值
     6 void change(int *&rp)
     7 {
     8     rp = &num2;
     9 }
    10 
    11 
    12 void main2()
    13 {
    14     int *p = &num1;
    15     change(p);
    16 }
  • 引用二级指针
     1 //引用二级指针
     2 int data1 = 10;
     3 int data2 = 20;
     4 int *p = &data1;
     5 int *p2 = &data2;
     6 
     7 //引用传递的是变量的地址
     8 void changeit(int **&rpp)
     9 {
    10     //改变二级指针存储的地址
    11     //*rpp = &data2;
    12     //改变二级指针指向的地址
    13     rpp = &p2;
    14 }
  • 返回值是引用指针
     1 //返回的指针类型为char *类型的引用
     2 char * & get()
     3 {
     4     char *p = "hello";
     5     printf("&p=%p,,p=%p
    ", &p, p);
     6     return p;
     7 }
     8 
     9 void main()
    10 {
    11     char *&rp = get();//rp变量的地址就是p的地址,rp是存储的地址
    12                       //当rp变量的地址被回收,rp存储的地址就不能被读取
    13     printf("%p
    ", &rp);
    14     char *newp = get();//newp的地址是新创建的,并指向p,不会被回收
    15     printf("%p
    ", &newp);
    16     cin.get();
    17 }
原文地址:https://www.cnblogs.com/xiaochi/p/8544870.html