zoukankan      html  css  js  c++  java
  • 详解C++中指针和引用的区别

    一、指针和引用的本质

    (1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址。因此,指针的大小不会像其他变量一样变化,
    只跟当前平台相关——不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要32bit就可以存下,
    所以sizeof(pointer)的大小是4字节。64位平台下,32位就不够用了,要想内存地址能够都一一表示,
    就需要64bit(但是目前应该没有这么大的内存吧?),因此sizeof(pointer)是8。
    引用的本质是“变量的别名”,就是给变量又重新起了一个名字,既然是“别名”,那么就一定要有本体。

    (2)可以有const指针,但是没有const引用;

    const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量

    double dval = 3.14159;
    
    //下3行仅对const引用是合法的
    const int &ir = 1024;
    const int &ir2 =dval;
    const double &dr = dval + 1.0;
    

    引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,
    编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。

    double dval = 23;
    const int &ri =dval;
    
    编译器将其转换为:
    int tmp = dval; // double -> int
    const int &ri = tmp;
    

    (3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

    (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
    根据声明和初始化时二者的区别,指针在声明周期内随时可能会为Null,所以使用时一定要做检查, 防止出现空指针、野指针的情况;
    而引用只要初始化了,在哪里都可以直接使用,再也不用担心它会不会为空什么的了。

    (5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
    指针因为自己存的是一个内存地址,既然可以存初始化(或者赋值)的地址,那么在指针生命周期内就可以存其他的地址,
    只要你是同一类型(不同类型这个对应的类型偏移不一样)的变量,对于指针都OK。

    引用作为一个变量AA的别名,在它的整个生命周期内,它只能“从一而终”,
    始终是第一次初始化它的那个变量的别名,在这期间任何对它的操作,都等同于对变量AA的操作。

    (6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

    (7)指针和引用的自增(++)运算意义不一样;

    二、指针和引用作为函数参数进行传递时的区别

    1. 指针作为参数进行传递:

    用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,
    因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的

    void swap(int *a,int *b)
    {
      int temp=*a;
      *a=*b;
      *b=temp;
    }
    
    int main(void)
    {
      int a=1,b=2;
      swap(&a,&b);
      cout<<a<<" "<<b<<endl;
      return 0;
    }
    
    1. 将引用作为函数的参数进行传递
      引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,
      因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
    void test(int &a)
    {
      cout<< &a << " " << a << endl;
    }
    
    int main(void)
    {
        int a=1;
        cout<< &a << " " << a << endl;
        test(a);
        return 0;
    }
    

    参考:
    详解C++中指针和引用的区别
    c++中指针和引用的区别

    作者:yusq77

    -------------------------------------------

    Wish you all the best and good health in 2021.

  • 相关阅读:
    Vsftpd 3.0.2 正式版发布
    Putdb WebBuilder 6.5 正式版本发布
    SoaBox 1.1.6 GA 发布,SOA 模拟环境
    pynag 0.4.6 发布,Nagios配置和插件管理
    Percona Playback 0.4,MySQL 负荷回放工具
    xombrero 1.3.1 发布,微型 Web 浏览器
    Hypertable 0.9.6.4 发布,分布式数据库
    libmemcached 1.0.11 发布
    CryptoHeaven 3.7 发布,安全邮件解决方案
    Android Activity生命周期
  • 原文地址:https://www.cnblogs.com/yusq77/p/13860781.html
Copyright © 2011-2022 走看看