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

引用和指针的区别

        引用(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 指向的地址
    

 

 

相关文章:

引用和指针的区别

引用&#xff08;reference&#xff09;和指针&#xff08;pointer&#xff09;都是 C 中用来间接访问内存中对象的机制&#xff0c;但它们有一些重要的区别。以下是它们在语法、用法和特性上的详细区别。 下面从7个方面来详细说明引用和指针的区别 1. 定义与语法区别 引用&…...

内容生态短缺,Rokid AR眼镜面临市场淘汰赛

AR是未来&#xff0c;但在技术路径难突破、生态系统难建设&#xff0c;且巨头纷纷下场的背景下&#xff0c;Rokid能坚持到黎明吗&#xff1f; 转载&#xff1a;科技新知 原创 作者丨王思原 编辑丨蕨影 苹果Vision Pro的成功量产和发售&#xff0c;以及热门游戏《黑神话》等在A…...

【论文阅读】StoryMaker | 更全面的人物一致性开源工作

文章目录 1 Motivation2 背景 相关工作 Related work3 Method 方法4 效果 1 Motivation 背景是 Tuning-free personalized image generation methods无微调的个性化图像生成方式在维持脸部一致性上取得了显著性的成功。这里我不是很了解 然而&#xff0c;在多个场景中缺乏整…...

读构建可扩展分布式系统:方法与实践14流处理系统

1. 流处理系统 1.1. 时间就是金钱 1.1.1. 从数据中提取有价值的知识和获得洞见的速度越快&#xff0c;就能越快地响应系统所观察的世界的变化 1.1.2. 信用卡欺诈检测 1.1.3. 网络安全中异常网络流量的捕获 1.1.4. 在支持GPS的驾驶应用程序中进行的实时路线规划 1.1.5. 社交…...

C++第2课——取余运算符的应用、浮点型和字符型(含视频讲解)

文章目录 1、课程笔记2、课程视频 1、课程笔记 /* #include<iostream> using namespace std; int main(){//cout<<"hello,world!";//运算符的优先级 () * / % -// 3/2 1...1 3%21 5%32 3%53 -3%2-1 3%-21//cout<<6/4%2;//int 向下取整6…...

SQL常用技巧总结

查询优化基本准则 1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名&#xff0c;因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM 子句中包含多个表的情况下&#xff0c;你必须选择记录条数最少的表作为基础表。 例如&#xff1a; 表 T…...

AJAX(简介以及一些用法)

AJAX 1. 简介 什么是 Ajax Ajax 的全称是 Asynchronous JavaScript And XML &#xff08;异步 JavaScript 和 XML &#xff09;我们可以理解为&#xff1a;在网页中 利用 XMLHttpRequest 对象和服务器进行数据交互的方式就是 Ajax &#xff0c;它可以帮助我们轻松实现网页…...

美畅物联丨GB/T 28181系列之TCP/UDP被动模式和TCP主动模式

GB/T 28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》作为我国安防领域的重要标准&#xff0c;为视频监控系统的建设提供了全面的技术指导和规范。该标准详细规定了视频监控系统的信息传输、交换和控制技术要求&#xff0c;在视频流传输方面&#xff0c;GB/T 2…...

机器学习之实战篇——图像压缩(K-means聚类算法)

机器学习之实战篇——图像压缩(K-means聚类算法&#xff09; 0. 文章传送1.实验任务2.实验思想3.实验过程 0. 文章传送 机器学习之监督学习&#xff08;一&#xff09;线性回归、多项式回归、算法优化[巨详细笔记] 机器学习之监督学习&#xff08;二&#xff09;二元逻辑回归 …...

轴承介绍以及使用

轴承&#xff08;Bearing&#xff09;是在机械传动过程中起固定、旋转和减小载荷摩擦系数的部件。也可以说&#xff0c;当其它机件在轴上彼此产生相对运动时&#xff0c;用来降低运动力传递过程中的摩擦系数和保持转轴中心位置固定的机件。 轴承是当代机械设备中一种举足轻重的…...

【JAVA】算法笔记

一、ArrayList ArrayList类是一个可以动态变化的数组&#xff0c;与普通数组的区别就是它没有固定的长度。 ArrayList<String> arrList new ArrayList<String>(); arrList.add("吐泡泡"); System.out.println(arrList.get(0)); arrList.set(0,"J…...

Gnu Radio抓取WiFi信号,流程图中模块功能

模块流程如图所示&#xff1a; GNURadio中抓取WiFi信号的流程图中各个模块的功能&#xff1a; UHD: USRP Source&#xff1a; 使用此模块配置USRP硬件进行信号采集。设置频率、增益、采样率等参数。Complex to Mag^2&#xff1a; 将复数IQ数据转换为幅度的平方。Delay&#xf…...

GO语言中make与new的区别

区别 1 make不仅分配内存&#xff0c;还会初始化。 new只会分配零值填充的值2make只适用slice,map,channel的数据&#xff0c;new 没有限制3make返回原始类型(T),new返回类型的指针(*T) 源码中定义的区别 func make(t Type,size …IntegerType) Type func new(Type) *Type f…...

安全运维类面试题

1、你熟悉哪些品牌的安全设备 答&#xff1a;天融信的ngfw防火墙&#xff0c;老牌防火墙厂商&#xff0c;功能比较齐全&#xff0c;像流量检测&#xff0c;web应用防护和僵木蠕等模块都有&#xff0c;界面是红白配色&#xff0c;设计稍微有点老 2、IPS用的是哪个牌子的 答&…...

STM32外设之LTDC/DMA2D—液晶显示(野火)

文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么&#xff0c;有几种屏&#xff0c;有什么组成。 怎么控制&#xff0c;不同屏幕控…...

调试vue build之后的js文件

调试 dist 目录下的 JavaScript 文件可以按照以下步骤进行&#xff1a; 1. 确保 Source Maps 正常生成 确认你的构建配置中已启用 Source Maps&#xff0c;确保 .map 文件与构建后的 .js 文件位于同一目录。 2. 启动一个本地服务器 使用本地服务器来服务 dist 目录&#xf…...

Django一分钟:DRF快速实现JWT认证与RBAC权限校验

一、项目创建并实现JWT认证 1. 下载依赖 下载django、djangorestframework、djangorestframework_simplejwt pip install django djangorestframework djangorestframework_simplejwt2. 创建项目 启动Django项目 django-admin startproject <myproject> cd myprojec…...

面试题(六)

48、设计模式 49、继承是否会破坏封装&#xff1f; 继承在面向对象编程中是一个重要的概念&#xff0c;但它确实可能对封装产生影响&#xff0c;具体情况取决于如何使用继承。以下是对这个问题的分析&#xff1a; 封装的定义 封装是面向对象编程中的一个基本原则&#xff0…...

CSS 实现文本溢出省略号显示,含单行与多行文本溢出

&#x1f680; 个人简介&#xff1a;某大型国企资深软件研发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…...

Redis中String命令的基础操作

文章目录 Redis中String命令的基础操作一、引言二、String类型的基础命令1、设置与获取值1.1、SET命令1.2、GET命令 2、字符串操作2.1、APPEND命令2.2、GETRANGE命令2.3、SETRANGE命令2.4、STRLEN命令 3、数值操作3.1、INCR命令3.2、DECR命令3.3、INCRBY和DECRBY命令 三、应用场…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...