开发者

C++左值引用与指针的区别及说明

目录
  • C++左值引用与指针的区别
    • 很多朋友遇到过这个问题
    • 先从定义说起
    • 看看下面的例子
    • 通过上面的例子得到如下结论
  • 总结

    C++左值引用与指针的区别

    很多朋友遇到过这个问题

    左值引用与指针有哪些区别?

    脑子里闪过很多答案,但大部分都是各自的定义,真要说他们两个有什么区别,有的时候还这是说不上来。

    本文针对这个问题进行归纳总结,希望对大家有所帮助。

    先从定义说起

    • 左值引用:左值引用是一个别名,只能绑定左值,对左值引用的访问与访问左值是相同的
    • 指针:指针是一个变量,这个变量在内存中存在真是的物理地址,该变量内的存储的是一个内存地址,访问指针变量对应的内容需要配合解访问符*

    看看下面的例子

    void rreftTest(int&& ref)
    {
        std::cout<<"ref = "<<ref<<std::endl;
    }
    int mhttp://www.devze.comain(int argc, char *argv[])
    {
        cout<<endl;
    
        int x = 42;
        int& ref = x;
        int* ptr = &x;
        int&& rref = 4;
    
        // 输出地址
        std::cout << "x的地址: " << &x << std::endl;
        std::cout << "ref的地址: " << &ref << std::endl;
        std::cout << "ptr的地址: " <&tJeQXglt; &ptr << std::endl;
        std::cout << "ptr指向的地址: " << ptr << std::endl;
        std::cout << "rref指向的地址: " << rref << std::endl;
        std::cout << "rref指向的地址: " << &rref << std::endl;
        rreftTest(rref);
    
        // 输出大小
        std::cout << "引用的大小: " << sizeof(ref) << std::endl;  // 与int相同
        std::cout << "指针的大小: " << sizeof(ptr) << std::endl;  // 通常是4或8字节
    
        return 0;
    }
    
    //输出如下所示编程客栈javascript
    x的地址: 0x63fdbc
    ref的地址: 0x63fdbc
    ptr的地址:: 0x63fdb0
    ptr指向的地址: 0x63fdbc
    rref指向的地址: 4
    rref指向的地址: 0x63fdec
    引用的大小: 4
    指针的大小: 8

    通过上面的例子得到如下结论

    1. 左值引用不占用额外内存空间,它的地址与引用的左值地址相同;指针则不同,指针需要额外的内存空间来存储地址
    2. 引用必须在定义时初始化;指针变量可以不在定义时初始化
    3. 引用初始化绑定左值后,无法再重新绑定左值;指针则可以
    4. 不存在引用的引用,指针则可以

    具体的例证程序如下:

    //初始化
    void initializationDifference() {
        int x = 42;
        
        // 引用必须在声明时初始化
        int& ref = x;  // 正确
        int& ref2;     // 错误!引用必须初始化
        
        // 指针可以后续初始化
        int*http://www.devze.com ptr;      // 正确
        ptr = &x;      // 正确
    }
    
    void rebindingTest() {
        int x = 42;
        int y = 24;
        
        // 引用一旦绑定就不能改变
        int& ref = x;
        ref = y;    // 这是赋值操作,不是重新绑定
        
        // 指针可以随时改变指向
        int* ptr = &x;
        ptr = &y;   // 改变指针指向
    }
    //重复引用
    void multiLevelTest() {
        int x = 42;
        
        // 不存在引用的引用
        // int& & ref;  // 错误!
        
        // 可以有多级指针
        int* ptr = &x;
        int** pptr = &ptr;  // 正确
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜