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

 更新时间:2025年03月04日 10:09:47   作者:_DCG_  
左值引用与指针的区别:左值引用是一个别名,只能绑定左值,对左值引用的访问与访问左值是相同的;指针是一个变量,该变量在内存中存在真是的物理地址,该变量内的存储的是一个内存地址,访问指针变量对应的内容需要配合解访问符*

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

很多朋友遇到过这个问题

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

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

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

先从定义说起

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

看看下面的例子

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;  // 正确
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • c++实现版本层次遍历功能

    c++实现版本层次遍历功能

    这篇文章主要介绍了c++实现版本层次遍历功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • C++库std::flush的具体使用

    C++库std::flush的具体使用

    std::flush是C++标准库中的一个操作符,用于刷新输出流,本文主要介绍了C++库std::flush的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 利用Matlab绘制地图的超详细教程

    利用Matlab绘制地图的超详细教程

    worldmap和usamap是axesm的子类,worldmap是用于生成世界地图坐标区域,usamap用于生成美国地图坐标区域。本文将详细为大家介绍如何利用这两个函数绘制地图,需要的可以参考一下
    2022-02-02
  • C++ 流插入和流提取运算符的重载的实现

    C++ 流插入和流提取运算符的重载的实现

    这篇文章主要介绍了C++ 流插入和流提取运算符的重载的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C语言实现两个矩阵相乘

    C语言实现两个矩阵相乘

    这篇文章主要为大家详细介绍了C语言实现两个矩阵相乘的程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C++实现十六进制字符串转换成int整形值的示例

    C++实现十六进制字符串转换成int整形值的示例

    今天小编就为大家分享一篇关于C++实现十六进制字符串转换成int整形值的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Vs2019+Qt+Opencv环境配置心得(图文)

    Vs2019+Qt+Opencv环境配置心得(图文)

    这篇文章主要介绍了Vs2019+Qt+Opencv环境配置心得(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C语言自研定时器计划任务语法详解

    C语言自研定时器计划任务语法详解

    市面主流定时器计划任务语法: cron ,但是使用起来非常难受,设计的比较非人性话语法,我想一般人都没几个记住的,所以本文将自研定时器计划任务语法,需要的可以参考一下
    2022-09-09
  • C语言超详细讲解循环与分支语句基础

    C语言超详细讲解循环与分支语句基础

    各位小伙伴们,今天给大家带来的是循环与分支语句,本篇将会向大家介绍这些语句的格式和使用的基本方法,感兴趣的朋友来看看吧
    2022-04-04
  • C语言编程银行ATM存取款系统实现源码

    C语言编程银行ATM存取款系统实现源码

    这篇文章主要为大家介绍了C语言编程银行ATM存取款系统实现的源码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11

最新评论