指针和引用详细比较

指针和引用

 1概念:从c的角度上分析,指针和引用在本质上是一 样,但是在c++中推荐使用引用
 通过引用和指针都可以改变函数的参数,但是在c++中使用引用可以减少函数的开销,

 实参的值在函数的引用过程中可以进行改变。

也可以理解引用某种意义上是安全的指针。

 注意1:函数的引用中主意函数上下的类型一致
  本此重点分析引用
 1>引用即别名, 类型&引用名=变量名
 2>常引用 (万能引用) const
 3>注意关注函数的左值,右值:函数赋值 左加加  左减减
  int func(void){
   int a=100;
   return ;//返回值是一个右值,是由系统自行处理的
   }
   func()=200;//error 因为常数做了左值
 这个时候加上(const)就可以避免实参的修改,而且const可以进行左值和右值的转换
 2:引用型函数的返回值
   1>可以将函数的返回值声明为引用,避免返回值带来的开销
   2>一个函数的返回值类型被声明为引用,那么函数的返回值可以是一个左值
   3>为了避免函数外部函数的修改被引用的目标,可以加上const常属性
 eg:const int &fun(void)//可以进行引用但是代码可读性差
    int foo(void){
    static int  a=100;
    return  a;//返回值是一个右值,最后内存空间会被释放  
   }
   int main(){
   foo()=200;//error 返回值是一个右值
   }
   /*尽量不使用返回局部变量的引用,因为引用的局部变量的内存会在函数返回的时
   被释放*/
   但是当返回的是静态变量,全局变量,成员变量,他们的内存分配不会被释放
 3:引用和指针的比较
   3.1 本质分析:
    int d=1;
    int &r=d;//引用
    int *const a=&d;//指针
    r<==>*a
   注意:引用的本质就是指针
  3.2 指针的定义不做初始化,但是引用必须进行初始化(指针常量除外)
   初始化的指针仍然是可以进行改变的
   eg:  int a=3,b=10;
    int *m;
    int &r;
      m= &a;
    m= &b;
    int &r=a;
      r=b;//不是修改引用的目标,而是对r进行赋值。间接的就会改变ad的值
  3.3 可以定义指针的指针,不可以定义引用的指针
     int a=100;
      int *b;
    int **r=&b;//二级指针
        
    int &m=r;
    int &*rq=&m;//error 引用指针是错误的  引用是实际不分地址的
  3.4 可以定义指针的引用
       int a=100;
    int *m=&a;
    int*&ra=&a<==>int *&ra=m;//指针的引用

    int  &r=a;
    int  &&ra=r;//错误的 &ra是右值(常量)对常量的引用是违规的
        int  &rm=r;这个就是起一个别名
  3.5 可以指针数组,但是不可以进行引用数组,但是可以定义数组的引用
     int a=1,b=2,c=3;
    int *arr[3]={&a,&b,&c};//指针数组
    int &arr[3]={a,b,c};//error
        
    int arr[3]={1,2,3};
    int (&rarr)=arr;//rarr称为数组引用
 3.6 和指针函数一样,也允许函数的引用,语法和指针是一样的
       void foo(int a,int b)
    int main(){
        void (*pfoo)(int ,int)=func;
    pfoo(10.20);
      //定义和使用函数引用
        void (&rfunc)(int ,int )=func;
        rfunc(10,20);
        }
























  
发布了34 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xuxudeta/article/details/78137827
今日推荐