引用和指针的区别

news/2024/9/25 13:05:19/

        引用(reference)指针(pointer)都是 C++ 中用来间接访问内存中对象的机制,但它们有一些重要的区别。以下是它们在语法、用法和特性上的详细区别。

下面从7个方面来详细说明引用和指针的区别

1. 定义与语法区别

  • 引用(reference) 是某个变量的别名。它在声明时必须被初始化,并且初始化后不能改变引用的目标。
  • 指针(pointer) 是一个变量,它存储另一个变量的内存地址。指针可以在运行时被重新赋值,并且可以为空(nullptr)。
    int a = 10;
    int &ref = a;  // ref 是 a 的引用int a = 10;
    int *ptr = &a;  // ptr 是指向 a 的指针
    

    2. 初始化与重新赋值

  • 引用必须在声明时进行初始化,并且一旦引用了某个变量,就不能再引用其他变量。引用不能指向 nullptr,它必须始终有效。

  • 指针可以在声明时不初始化,并且可以在任何时候指向不同的对象。指针可以是空指针(nullptrNULL),即指向无效的内存。

    int x = 5;
    int &ref = x;  // 引用必须在声明时初始化
    ref = 10;      // 改变的是 x 的值int x = 5;
    int y = 10;
    int *ptr;     // 可以不初始化
    ptr = &x;     // 指向 x 的地址
    ptr = &y;     // 重新指向 y 的地址
    

    3. 访问对象的方式

  • 引用直接使用对象的名字来访问所引用的对象,无需解引用。

  • 指针需要使用解引用运算符 * 来访问指针所指向的对象。

    int x = 5;
    int &ref = x;   // ref 是 x 的引用
    std::cout << ref << std::endl;  // 直接访问 x 的值int x = 5;
    int *ptr = &x;
    std::cout << *ptr << std::endl;  // 通过解引用访问 x 的值
    

    4. 内存地址的访问

  • 引用本身没有自己的内存地址,它只是所引用对象的别名。你不能获取引用本身的地址,只能获取它所引用的对象的地址。

  • 指针有自己的内存地址,并且存储的是它所指向对象的内存地址。你可以获取指针的地址,也可以获取它指向的对象的地址。

int x = 5;
int &ref = x;
std::cout << &ref << std::endl;  // 输出的是 x 的地址int x = 5;
int *ptr = &x;
std::cout << ptr << std::endl;   // 输出的是指针存储的 x 的地址
std::cout << &ptr << std::endl;  // 输出的是指针本身的地址

5. 指向空值或无效值

  • 引用不能指向 nullptr 或者无效的对象。它在声明时就必须引用有效的对象。

  • 指针可以是 nullptr,表示不指向任何对象,或者指向无效的内存地址(虽然指向无效地址是危险的)。

    int &ref = nullptr;  // 错误!引用不能为 nullptr
    int *ptr = nullptr;  // 指针可以为 nullptr
    

6. 修改所指对象的值

  • 引用可以修改所引用对象的值,引用本质上就是对该对象的直接访问。

  • 指针可以通过解引用来修改所指对象的值。

    int x = 5;
    int &ref = x;
    ref = 10;   // x 的值被修改为 10
    int x = 5;
    int *ptr = &x;
    *ptr = 10;  // 通过解引用修改 x 的值为 10
    

    7. 常量引用与指针

  • 常量引用(const reference):常量引用允许引用一个对象,但不允许修改它的值。常用于函数参数中,避免拷贝对象,但又能确保函数不会修改对象。

  • 常量指针与指向常量的指针

  • 指向常量的指针:指针可以指向一个常量对象,不能通过指针修改对象的值。

  • 常量指针:指针本身是常量,不能改变指针指向的地址,但可以修改指向对象的值。

  • int x = 5;
    const int &ref = x;
    // ref = 10;  // 错误,不能通过 const 引用修改值
    const int x = 5;
    const int *ptr = &x;
    // *ptr = 10;  // 错误,不能通过指向常量的指针修改值
    int x = 5;
    int *const ptr = &x;
    *ptr = 10;  // 可以修改 x 的值
    // ptr = &y;  // 错误,不能修改 ptr 指向的地址
    

 

 


http://www.ppmy.cn/news/1530292.html

相关文章

C++ asio异步网络库学习记录

最近几天在学习asio异步网络库&#xff0c;今天整理下前几日学习asio库同步读写demo的案例&#xff0c;明天我会整理asio配置的过程。 之前也学习过winsocket&#xff0c;但是不论是winsock还是asio都经历这样几个阶段&#xff1a; 服务端&#xff1a; socket创建socket套接字…

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”&#xff0c;其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”&#xff0c;其他默认 …

14年408-计算机网络

第一题&#xff1a; 解析&#xff1a;OSI体系结构 OSI由下至上依次是&#xff1a;物理层-网络链路层-网络层-运输层-会话层-表示层-应用层。 因此直接为会话层提供服务的是运输层。答案选C 第二题&#xff1a; 解析&#xff1a;数据链路层-交换机的自学习和帧转发 主机a1向交换…

中电金信:源启智能视觉分析系统~助力各行业破局升级,释放新质生产力

作为人工智能与计算机视觉的交叉范畴&#xff0c;智能视觉模仿人类视觉机能&#xff0c;来对各种形式的视觉输入予以处理、理解以及决策。当下&#xff0c;智能视觉已然发展为应用广泛、市场覆盖面大且形式多元的产业方向&#xff0c;获得了国家政策的强力支持。数字化时代搭台…

GIS开发之如何使用OpenLayers,Leaflet,Mapbox,Cesium,ArcGIS, Turf.js 与 D3.js

1、OpenLayers&#xff1a; 描述&#xff1a;OpenLayers是一个高性能、开源的JavaScript库&#xff0c;用于在Web上创建富有的地图应用。它支持多种地图数据源&#xff0c;包括从瓦片服务到矢量数据&#xff0c;并提供了大量的交互功能。特点&#xff1a;功能强大、灵活易用&a…

【Kubernetes】常见面试题汇总(三十五)

目录 87.简述 pod 中 readiness 和 liveness 的区别和各自应用场景。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产应…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…

Go 语言的垃圾回收机制

Go 语言的垃圾回收机制&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;1. 垃圾回收的工作原理2. 并发与回收3. 优点和缺点4. 调整和监控在 Go 语言中&#xff0c;垃圾回收&#xff08;GC&#xff09;机制主要通过“引用计数”和“可达性分析”来判断资源是否需…