C++拾遗(四)引用与指针
引用和指针是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在功能和用途上是有所区别
声明与定义
引用:引用是别名,是对已存在变量的另一个称呼,一旦一个变量被引用,就不能再被引用其他变
量。
int a = 10;
int& ref = a;
这里,ref 是 a 的引用,它们引用的是同一个对象。
指针:指针是一个变量,其值为另一个变量的地址。指针可以被重新赋值以指向其他变量。
int a = 10;
int* ptr = &a;
这里,ptr 是一个指向 a 的指针。
初始化和绑定
引用:引用必须在声明时就初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到其他对象。
指针:指针可以在任何时候被初始化,也可以被重新指向其他对象。
int a = 10;
int* ptr = &a;
int b = 20;
ptr = &b;
这里,指针 ptr 被重新指向了 b
间接性
引用:引用不具有间接性,一旦一个变量被引用,就可以像使用该变量一样直接使用这个引用。
int a = 10;
int& ref = a;
std::cout << ref << std::endl;
这里可以直接使用 ref,不需要间接性。
指针:指针具有间接性,必须通过解引用来使用指针所指向的对象。
int a = 10;
int* ptr = &a;
std::cout << *ptr << std::endl;
这里需要使用 *ptr 来获取指针所指向的值。
操作
引用:引用本身不进行任何操作,对引用的操作实际上是对所引用的对象的操作。
int a = 10;
int& ref = a;
ref = 20;
这里对引用的操作实际上是对所引用的对象的操作,此时a为20
指针:指针可以进行各种操作,如指针算术、比较等。
int a = 10;
int* ptr = &a;
*ptr = 20;
这里对指针的操作会影响指针所指向的值,此时a为20
空值
引用:引用不能为空。
指针:指针可以为空。
int* ptr = nullptr;
动态内存分配
引用:不能用于动态内存分配。
指针:可以用于动态内存分配,如new
int* ptr = new int(20);
使用场景
引用:在函数参数传递、函数返回值等场景中经常使用引用,以提高效率并避免不必要的拷贝。
指针:在动态内存分配、实现复杂的数据结构(如链表、树等)时经常使用指针。
安全性
引用:使用引用更安全,因为它们不能被重新指向其他对象,也不能为空。
指针:指针可以指向无效的内存地址或未初始化的内存,因此使用指针需要更多的注意和小心。
取地址操作
引用:不能取一个引用的地址。
指针:可以取一个变量的地址,得到一个指向该变量的指针。
别名问题
引用:如果一个引用和它所引用的变量在程序的其他地方被改变,那么这个引用将会反映这些改
变。也就是说,引用是它所引用的变量的别名。
指针:一个指针可以被改变以指向另一个变量,但并不会影响原始变量的地址。也就是说,指针并
不一定是它所指向变量的别名。
引用使用场景
1.当需要将一个对象的引用分配给另一个变量时,应使用引用。
2.在函数参数中,期望的是按引用传递并修改原始数据,应使用引用。
3.在初始化列表中(如构造函数初始化列表),应该使用引用来初始化其他引用类型的变量。
指针使用场景
1.当从函数返回一个大的数据结构时,通常使用指针或智能指针。因为返回一个大的数据结构按值
传递会非常低效。
2.指针可以在任何时候指向任何对象。
3.指针可以指向一个空值。
4.对于动态分配的内存,应使用智能指针(如 std::unique_ptr 或 std::shared_ptr)而不是原始指针。
5.当重载操作符(如 operator->)时,通常会使用指针而不是引用,因为这些操作符期望的是一个指针类型的参数。
6.当模板参数是类类型时,因为类类型可能没有默认构造函数,而引用必须能够被初始化为一个有
效的对象。在这种情况下,使用指针作为模板参数可以避免编译错误。
7.将一个基类的指针转换为派生类的指针。这通常是通过多态来实现的。在这种情况下,应该使用
指向基类的指针,并在需要时进行类型转换。
8.在回调函数和函数指针的上下文中,通常使用原始指针而不是引用,因为回调函数通常以按值传
递的方式工作。此外,函数指针本身就是一个指向函数的指针,而不是对象的引用。
9.当需要传递大型数据结构或对象时,通过指针传递通常比按值传递更高效。
相关文章:
C++拾遗(四)引用与指针
引用和指针是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在功能和用途上是有所区别 声明与定义 引用:引用是别名,是对已存在变量的另一个称呼,一旦一个变量被引用,就不能再被引用其他变 量…...
k8s架构、工作流程、集群组件详解
目录 k8s概述 特性 作用(为什么使用) k8s架构 k8s工作流程 k8s集群架构与组件 核心组件详解 Master节点 Kube-apiserver Kube-controller-manager Kube-scheduler 存储中心 etcd Node Kubelet Kube-Proxy 网络通信模型 容器引擎 k8s核…...
CF1362C Johnny and Another Rating Drop(二进制、复杂度考虑)
看完数据范围 n ∈ [ 1 , 1 e 18 ] n\in[1,1e18] n∈[1,1e18]就可以先猜一下要不是可以直接推公式,不能暴力去做,更不能遍历一遍,又看到这种2进制的题目,要猜是不是 l o g log log级别的复杂度。 可以依次考虑每一位 所有 i % 2 …...
1 - 搭建Redis数据库服务器|LNP+Redis
搭建Redis数据库服务器|LNPRedis 搭建Redis数据库服务器相关概念Redis介绍安装RedisRedis服务常用管理命令命令set 、 mset 、 get 、 mget命令keys 、 type 、 exists 、 del命令ttl 、 expire 、 move 、 flushdb 、flushall 、save、shutdown 配置文件解析 LNP …...
米贸搜|Facebook“精准营销”越来越难?或许是“受众定位”没彻底搞清!
一、为何要确定目标受众 对于每个广告主而言,面向最有可能成为其客户的用户营销非常重要,因此,确定目标受众,是Facebook广告投放中极其重要的一环。 二、什么是目标受众? 目标受众是您希望向其传达营销信息…...
【C++】内存分区模型
目录 1.程序运行前 2.程序运行后 3. new操作符 3.1 基本语法 3.2 开辟数组 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区: 存放全局变量和静态变量以及常量栈区 …...
通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错
strings命令简介 strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序,库文件等。一般用于分析可执行程序和库文件。strings命令较为常用的功能有以下两种 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本,当系统的GLIBC版本与目标文…...
基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151
Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee 🐝 到 MQTT 桥接器 🌉,可以摆脱专有的 Zigbee 桥接器 🔨 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…...
【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、libjpeg介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libjpeg介绍 libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版…...
VI / VIM的使用
vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且 还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x win…...
第十二站(20天):C++泛型编程
模板 C提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类, 其 类内部的类型和函数的形参类型不具体指定 ,用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…...
【Docker】Dokcer学习① - 简介
【Docker】Docker学习① - 简介 一、Docker简介1. Docker是什么2. Docker组成3. Docker对比虚拟机4. Linux Namespace技术5. Linux control groups6. 容器管理工具 二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Dock…...
PostgreSQL 100条命令
我会为您提供一些 PostgreSQL 中最常用的命令: 1. 创建数据库:CREATE DATABASE database_name; 2. 连接到数据库:\c database_name; 3. 创建表格:CREATE TABLE table_name (column1 datatype, column2 datatype, ...); 4. 插入数…...
HTTP动态代理的原理及其对网络性能的影响
HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术,它可以优化网络性能、提高网络安全性,并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…...
69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey
文章目录 一:简介二:Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三:代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址: https://gitee.com/lymgoforIT/golang-trick/t…...
JavaScript实现的一些小案例
小案例 灯开关案例 <body><img id"light" src"img/off.jpg"><script>var light document.getElementById("light");var flag false;if(flag){light.src "img/on.jpg";flag false;}else{light.src "img/…...
MVC模式
Model-View-Controller : 模型-视图-控制器模式,用于应用程序的分层开发。 Model(模型):代表一个存取数据的对象。也可以带有逻辑,在数据变化时更新控制器。 View(视图):代表模型包含的数据的可视化。 Controller(控制器)…...
Java中的代理模式(一)
大家好👋,我是极客涛😎,今天我们聊一聊java中的代理模式,话不多说,还是老思路,什么是代理模式,为什么要有代理模式,如何实现代理模式 代理模式 在说java中的代理模式之前…...
跳跃游戏-算法
题目 给定一个数组nums {1,2,3,4,5},每个元素nums[i]表示从i这个位置最多可以向前跳跃nums[i]个台阶,求最小需要跳几次就可以调到末尾 思路 反向查找 从末尾开始逐个向前判断最远的起跳位置,接着再以该位置递归的判断 public int jumpT…...
ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评
ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评 ERP领域SAP、ORACLE相对于国内厂商如用友、金蝶优势在哪? SAP,ORACLE操作习惯一般国人用不惯;相对于国产软件,界面也很难看&#x…...
别再复制粘贴了!手把手教你从零配置一个生产可用的log4j2.xml文件
从零构建生产级Log4j2配置:告别复制粘贴的五个关键设计 每次接手新项目时,看到团队直接从GitHub或博客复制过来的log4j2.xml文件,我都会暗自叹气。这些配置往往带着各种隐患:有的在高峰期突然打满磁盘,有的关键错误日志…...
use Hyperf\View\View;的生命周期的庖丁解牛
它的本质是:Hyperf\View\View 不是一个简单的工具类,而是一个由 Hyperf DI 容器管理的 服务实例 (Service Instance)。它的生命周期始于 容器启动时的元数据注册,经历 请求触发时的懒加载/实例化,执行 模板解析与渲染,…...
为内部知识库问答机器人接入Taotoken提升回答稳定性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答机器人接入Taotoken提升回答稳定性 在企业内部知识管理系统中,一个稳定可靠的问答机器人是提升信息检…...
MUMmer4 v4.0.0技术升级:基因组比对工具标准化与容器化部署深度解析
MUMmer4 v4.0.0技术升级:基因组比对工具标准化与容器化部署深度解析 【免费下载链接】mummer Mummer alignment tool 项目地址: https://gitcode.com/gh_mirrors/mu/mummer MUMmer4作为生物信息学领域广泛使用的基因组比对工具,最新发布的v4.0.0版…...
软件工程自动化浪潮下,工程师如何从代码生产者转型为系统架构师?
1. 软件工程的自动化浪潮:从手工艺到基础设施的必然之路最近和几个在头部大厂干了十几年的老同事聊天,话题总绕不开一个词:焦虑。不是对业务增长的焦虑,而是对自身角色价值的焦虑。一个在阿里做P8的朋友说,他团队里新来…...
从NASA航天电子设计看高可靠性电源与模拟电路工程实践
1. 从太空迷到电子工程师:我的技术启蒙之路我是一名不折不扣的太空迷。这个身份的烙印,始于童年时守在电视机前,目睹第一艘“水星号”载人飞船发射升空的那一天。沃尔特克朗凯特在新闻中从各个科学角度进行的详尽报道,让我整整一天…...
避开这些坑:ADSP-SC589开发中JTAG连接、驱动安装与调试的常见问题解决
ADSP-SC589开发实战:JTAG连接与调试避坑指南 当ADSP-SC589开发板与AD-HP530ICE仿真器首次相遇时,许多开发者会陷入连接失败的困境。不同于普通MCU开发,SHARC系列DSP的JTAG调试存在诸多技术细节,稍有不慎就会导致数小时的无效排查。…...
别只盯着YOLOv5了!从R-CNN到DETR:手把手带你看懂目标检测算法演进史(附论文精读笔记)
从R-CNN到DETR:目标检测算法的范式革命与技术演进 当计算机视觉领域的研究者翻开2023年的顶会论文时,会发现目标检测任务已经呈现出与五年前截然不同的技术图景。这个看似"古老"的计算机视觉基础任务,正在经历着从传统卷积到Transf…...
OpenClaw集成xAI Grok模型:一键配置与API兼容性解析
1. 项目概述:为OpenClaw解锁xAI Grok模型支持 如果你和我一样,既是OpenClaw的忠实用户,又对xAI推出的Grok系列模型(特别是Grok 4.1)的强大推理能力垂涎已久,那么之前肯定也卡在了同一个地方:Ope…...
一句话就能“劫持”你的AI?DZS 分层式自适应提示词注入攻击的防御机制框架 (HAA)来了!
本文所展示的提示词技术已在Research square 发表论文预印本。DOI:https://doi.org/10.21203/rs.3.rs-9653510/v1 作者“抖知书(douzhishu),涉及到相关测试数据是本人自行测试的,并未通过多专家评审,所以仅…...
