当前位置: 首页 > 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;  // 正确
}
http://www.lryc.cn/news/546047.html

相关文章:

  • Linux基础使用和程序部署
  • Linux驱动开发之串口驱动移植
  • 计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)
  • 指针小节.
  • [Qt5] QJson数据之间的转换以及QByteArray图像数据压缩
  • 2025年能源工作指导意见
  • Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format
  • 深入探索像ChatGPT这样的大语言模型-02-POST training supervised finetuning
  • 广义线性模型下的数据分析(R语言)
  • AutoMQ:无需 Cruise Control 实现 Kafka 的自动分区再平衡
  • 在剪映中给英文学习视频添加中文字幕
  • Opencv之sift特征检测和FLANN 匹配器进行指纹特征匹配
  • rust学习~tokio的io
  • FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别
  • 本地部署大数据集群前置准备
  • Spring Boot整合RabbitMQ
  • CDefView::_OnFSNotify函数分析
  • 精准汇报:以明确答复助力高效工作
  • Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例
  • 软件工程---基于构件的软件工程
  • AMD RDNA3 GPU架构解析
  • docker关闭mysql端口映射的使用
  • 关于对机器中的人工智能进行基准测试
  • CSS - 妙用Sass
  • MS模块创新
  • 私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)
  • MFC中CMutex类和CSingleLock类,配合使用疑惑
  • 残差收缩模块
  • HOW - 在Windows浏览器中模拟MacOS的滚动条
  • Unity 打包后EXE运行出现Field to Load il2cpp的一种情况