当前位置: 首页 > news >正文

左值引用与指针的区别

很多朋友遇到过这个问题:左值引用与指针有哪些区别?脑子里闪过很多答案,但大部分都是各自的定义,真要说他们两个有什么区别,有的时候还这是说不上来。本文针对这个问题进行归纳总结,希望对大家有所帮助。

先从定义说起:

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

看看下面的例子:

void rreftTest(int&& ref)
{
    std::cout<<"ref = "<<ref<<std::endl;
}
int main(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的地址: " << &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;
}

//输出如下所示:
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* 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;  // 正确
}

相关文章:

  • rpc学习
  • 网络安全系统分为几级_网络安全系统的分级与软考要点解析
  • 解决样式隔离的方法
  • Live2d官方项目运行
  • c++头文件和命名空间
  • 在线量化算法(QAT) --学习记录1
  • Android 常见View的防抖
  • NO.19十六届蓝桥杯模拟赛第三期上
  • 【Wireshark 02】抓包过滤方法
  • Orfeo Toolbox (OTB):开源的遥感数据处理工具箱/QGIS插件
  • DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
  • c++ 迭代器分类及详细讲解
  • 【测试开发面试题】每日 3 题(三)
  • Trae:国内首款AI原生IDE,编程效率大提升
  • doris:Paimon Catalog
  • 智能差旅管理新范式:MyAgent如何重塑企业差旅全流程自动化
  • 【uniapp】离线打包uniapp为apk详细步骤
  • 腾讯三面:写文件时进程宕机,数据会丢失吗?
  • 基于springboot+vue3图书借阅管理系统
  • MySQL笔记---Ubuntu环境下从零开始的MySQL
  • 伦敦做网站/网易搜索引擎
  • 创建网站公司 徐州/海口网站关键词优化
  • 在美国做网站/广东网络seo推广公司
  • 广州网站建设网站建设/营销技巧
  • 西宁好的网站建设公司/seo关键词优化的技巧和方法
  • 贵阳餐饮网站建设/黄山网站seo