对引用的进一步理解

lambda表达式与方法引用 1、引用类方法 格式:类名 ::静态方法; Integer :: parseInt; Integer类的方法:这个类里面有一个静态方法 parseInt,可以将字符串类型转换成int类型; 如:定义一个接口,在这个接口中定义一个抽象方法convert(String s) 定义一个测试类,在这个测试类中提供两个方法,一个方法是 useConverter(Converter c) 一个方法是主方法,在这个主方法中调用 useConverter public inter... 阅读详情

本科毕业之后有时间重新系统学习一遍C++,因此决定写一系列笔记帮助自己理解,也许也能提供新的思路给和我一样的老萌新小萌新。


要理解引用,那么就要先理解C++的精华之指针,引用和指针是密不可分的,我们甚至可以说这俩就是一个东西。但是指针能做的事情比引用更多,而引用的出现简化了C++代码,毕竟指针可是凭借一己之力抬高了C++入门门槛,估计大家看见代码里满篇的指针都会虎躯一震吧~~

从指针开始

那么指针是什么?

指针只是一个地址,不要多想,这真的很简单!

不要考虑数据类型,对于任意数据来说,指针只是一串存储内存地址的数字。不论是什么数据类型,其地址所代表的长度是固定的,因为这主要取决于当前系统的框架。比如说,x86系统寻址为4个字节,那么代表地址的那一串儿数字就是4个字节的。在x86框架下,一个int类型的地址和double类型和char类型的地址都是4字节。

int main(){
	int a = 5;
	void* ptr_i = &a;
    double b = 123.4;
    void* ptr_d = &b;
	return 0;
}

在这里插入图片描述

在debug模式下查看内存,可以看到同为4字节(0x表示这是16进制显示,后面每一位都可以写成0-F,也就是16位数,也就是242^424,也就是4个bit. 1个字节有8bit,因此2位数代表1个字节,一共8位数,所以是4字节)

数据类型的重要性体现在对内存的操作

通过上述操作,已经完成了对数据类型的取地址操作,也就是可以获取某个数据的内存地址了。那么,如果想要通过内存地址反向对该数据进行操作,就需要提前通知编译器该地址指向的数据的数据类型。

#include<iostream>
#define LOG(x) std::cout << x << std::endl;

int main(){
    int a = 5;
    int* ptr = &a;
    *ptr = 6;
    LOG(a);
    return 0;
}

在这里插入图片描述

至此,我们掌握了如何通过指针改变地址指向的数据。

讲到引用

简单理解引用,就是一个变量的别名。那么既然是别名,在引用前就必须存在一个“本名”,因此引用不可为空。

int main(){
	int a = 5;
    int& ref = a; 
    return 0;
}

通过引用改变数据的方法

int main(){
    int a = 5;
    int& ref = a;
    ref = 6;
    LOG(a);
    return 0;
}

在这里插入图片描述

至此,我们掌握了引用的基本用法。

自增函数的例子

void Increment(int x){
    x++
}
int main(){
    int a = 5;
    Increment(a);
    return 0;
}

由于x是局部变量,自增只会发生在Increment函数当中(在函数当中创建一个新的变量等于a的值,而后对该变量进行操作),不会影响a的值,因此a在这一系列操作之后依旧还是5.

如果希望a本身发生变化,那么使用指针的方法如下:

void Increment(int* x){
	(*x) ++; //先找到x位置对应的数据,再自增
}
int main(){
    int a = 5;
    Increment(&a);
    LOG(a);
    return 0;
}

在这里插入图片描述

看着已经有点混乱了是不是,引用的出现极大地简化了代码,请看:

void Increment(int& x){
    x ++; //不用再找指针,有时候甚至用指针还是引用傻傻分不清
}
int main(){
    int a = 5;
    Increment(a); //不用写取地址
    return 0;
}

在这里插入图片描述

如此清爽的代码,完成了和之前指针一样的工作。谁能不爱引用呢?

但是指针为什么还存在?

强大的指针

int main(){
	int a = 5;
    int b = 6;
    int& ref = a;
    ref = b;
    return 0;
}

上述代码原本的核心任务是,更改引用,也就是从引用a更新为引用b. 然而我们明白ref = b 只是将ref指向的变量赋值为b,而无法重新引用。这也是引用重要的一个性质:只可以引用一次。

但是指针就没有这样的限制,它可以指向任意的同数据类型的数据。

int main(){
    int a = 5;
    int b = 6;
    int* ptr = &a;
    *ptr = 3;
    ptr = &b;
    *ptr = 4;
    return 0;
}

在这里插入图片描述

由此可见,指针在必要时候还是非常有用的。

txt经纬度批量转面要素(附自定义ArcGIS工具箱方法) 当涉及大量txt坐标文件需要转换成面要素的时候,逐步操作工作量较大。本文由需求出发,以ArcGIS10.2为例,采用python脚本自定义ArcGIS工具,实现批量操作的目的。 阅读详情

相关推荐

Mid-360与FAST-LIO2实战:从点云采集到高精度建图全流程解析

本文详细解析了使用Livox Mid-360激光雷达与FAST-LIO2算法实现高精度实时建图的全流程。内容涵盖硬件准备、软件环境搭建、算法部署配置、数据采集实战,并重点探讨了多楼层场景下的参数调优与误差抑制策略,为机器人及无人机三维感知应用提供了实用指南。

prometheus9mon的博客 416

【进一步】加强理解C++的指针和引用

一般人容易疏忽的点,和不知道的为什么...在这里你能找到答案

weixin_72391681的博客 1316

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 501

c++ 关于引用 &的进一步理解

在很久以前看primer的时候看到&有了一些理解,接着在平时使用的时候觉得自己有了更深的理解,发现书上讲得的确挺对但是却不怎么好理解,所以再写一篇来解释一下引用 & 。大神勿喷,有错请指教,本人菜鸟一枚。。。 觉得在学习c++的时候 最重要的一个东西就是,你在学习的时候一定要搞懂它是什么? 那引用是什么呢? 其实呢引用 也是一个指针,哈哈。 为什么呢我们可以看一下 char a = 'a'

lingdi2000的专栏 728

淘宝链接跳转微信全攻略:自建合规中转页实现私域引流

在跨平台运营中,链接跳转是连接不同生态、实现流量引导的关键技术。其核心原理是通过服务器端或前端逻辑,将用户从一个平台的链接安全引导至目标页面,同时规避平台间的访问限制。这项技术的核心价值在于打破数据孤岛,实现跨平台用户沉淀与精细化运营,广泛应用于电商引流、私域流量构建和跨平台营销等场景。本文聚焦于**淘宝短链**与**企业微信**之间的跳转难题,提供了一套基于自建中转页面的完整工程解决方案,手把手教你如何通过合规的技术手段,将淘宝流量高效、安全地引导至微信生态,并实现数据追踪与客户分流。

weixin_34185512的博客 414

Lattice CrosslinkNx LIFCL-40实战解析:MIPI D-PHY硬核IP配置与CSI-2数据解析全流程

本文详细解析了Lattice CrosslinkNx LIFCL-40 FPGA中MIPI D-PHY硬核IP的配置与CSI-2数据解析全流程。通过实战案例,介绍了硬件环境搭建、寄存器配置、数据包结构解析及视频流重构技巧,帮助开发者快速掌握高速图像采集系统的设计与优化方法。

weixin_29159613的博客 200

java引用的理解

把java的引用理解为剑柄,java对象理解为剑身,这样就特别容易理解~~~成员变量看成是剑中的一块,而方法看成是剑链接的一段区域~

yinjian520的专栏 360

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

理解函数传对象为什么是按值传递的而不是按引用传递的

一、基本类型的值与引用类型的值 基本类型的值: Undefined Null Boolean Number String 基本类型的值存在栈内存中,是按值访问的,下面来看一个示例 var a = 10; var b = a; b = 20; console.log(a) //打印结果 10 那么为什么改变a对b没有影响呢? 答:b只是复制了a的一个副本,b的改变对a没有任何影响。下面借用其他的博主的一张图更能清晰的看明白: ![在这里插入图片描述](https://img-blog.csdnimg.c

weixin_45499352的博客 579

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-工作流自动清洗

在构建本地RAG知识库时,数据结构化清洗是关键但繁琐的步骤。传统方法效率低且易出错,而低代码/无代码平台如Dify提供了更高效的解决方案。Dify通过可视化工作流设计,集成大模型智能处理,支持多格式输入输出,无需编码即可完成复杂的数据清洗任务。文章详细介绍了数据结构化的核心困境、目标、价值及类型,并比较了TXT与Markdown在RAG系统中的适用性。最后,通过Dify平台实战演示了如何在20分钟内完成规则制度文档的结构化清洗,输出标准化数据,展示了自动化工作流在数据处理中的高效性和便捷性。

少说,多做 1224

dToF直方图之美_deadtime死区时间

IMX459的死区时间可以在6ns,这个时间是什么级别,车载激光雷达激光器的光脉宽一般都在4ns以上,也就是这个时间贴近去SPAD的死区时间,这就导致了pile up会非常弱,不会有太多数量的光子计数堆积,加上某些SPAD设计,对TDC有一些更深入的考量,所以不需要去校正pile up算法。Sensor层面决定了pile up的复杂程度,如果一个dToF的SPAD一致性非常好,那么pile up校正可以简单到极致,也就是一句代码的事,比如IMX611,优秀到不需要后端去考虑校正pile up。

dream it possible 1436

Java中对象与引用

初学Java 时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java 书中,把对象和对象的引用混为一谈。     如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术,把自己的一点认识写下来,或许能让初学Java 的朋友们少走一点弯路。             为便于说明,我们先定义一个简单的类:        class student{  

fbz123456的博客 824

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

浅析数据引用

数据引用

qq_48265856的博客 457

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java引用的问题

我们都知道java的引用分为值引用和对象引用,那么值引用和对象引用在使用上的区别是什么呢?直奔代码。 我定义了四个对象,分别是String、StringBuilder、int、boolean类别。其中s、s1是对象引用,a、b是值引用。以下是执行结果 经过查找,范县java方法调用传参数引用是引用的复制,而不是同一个引用,就是说在stack里面是两个不同的引用。可以参考http://bl

mrsbai的博客 416

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java8新特性:Lambda表达式、函数式接口、方法引用 、 构造器引用 和 数组引用

1.2 Lambda表达式语法 语法格式1:无参, 无返回值 语法格式2:Lambda需要一个参数,但是没有返回值 语法格式3:数据类型可以省略,因为可由编译器推断,称为类型维护 语法格式4:Lambda 若只需要一个参数时,参数的小括号可以省略 语法格式5:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值 语法格式6:当 Lambda 体只有一条语句时,return 与 大括号若有,都可以省略 1.3 Lambda总结 -> 左边: Lambda形参列表的参数类型可以省略(类型推断)

GQ的博客 317

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

值传递和引用传递

简述值传递和引用传递值传递引用传递 值传递 传递的是值的拷贝,对原来的数据无影响 public class TempTest { //值传递 private void test1(int a){ a=5; System.out.println("test1: "+a); } public static void main(String[] args) { TempTest tempTest = new TempTest();

weixin_44125071的博客 128

Dubbo原理简述四:服务暴露、服务引用和调用流程

关于服务暴露,首先需要了解:ServiceBean.java 此类实现了几个Spring中比较重要的接口:如InitializingBean、ApplicationContextAware、ApplicationListener等,查看该类结构图: 接下来分析一下该类的一些主要方法: 在ServiceBean.afterPropertiesSet()方法中,就是将配置文件的各项属性信息都配置到该...

.... 永远年轻,永远热泪盈眶 5万+

学php的意义,深入理解PHP中的global

一、实现原理在PHP的函数中,global语法是比较常见的,大家一定都知道一旦在函数中global了某个外部变量后,这个变量就可以在这个函数中使用了,但是也有不少网友不知道这是一个什么实现原理。现在上一个例子,大家一看就知道了:$globalStr = ‘.com’;function globalTest(){global $globalStr;$globalStr = ‘viphper’.$gl...

weixin_35021193的博客 263

值类别 左值引用 右值引用

文章目录值类别关系图示例左值引用声明符: &语法示例反汇编伪代码右值引用声明符: &&语法示例反汇编伪代码 值类别 每个 C++ 表达式(运算符带上其操作数、字面量、变量名等)可按照两种独立的性质加以辨别:类型和值类别 (value category)。每个表达式都具有某种非引用类型,且每个表达式恰属于三种基本值类别之一:纯右值 (prvalue)、亡值 (xvalue)、...

一十一的博客 245

C++面向对象程序设计 - 类和对象进一步讨论

在C++中,关于面向对象程序设计已经讲了很大篇幅,也例举很多案例,此篇将通过一些习题来进一步了解对象、静态成员、指针、引用、友元、类模板等等相关知识。

觉醒法师的专栏 1045

jq 函数引用变量_js中函数参数值传递和引用传递

js中函数参数值传递和引用传递:在阅读本章节之前建议参阅一下两章节:1.值类型可以参阅javascript的值类型一章节。2.引用类型可以参阅javascript的引用类型一章节。一.函数传递值类型:代码实例如下:function addNum(num){num+=10;return num;}var num=10;var result=addNum(num);console.log(num);c...

weixin_39945679的博客 785

[Java基础]-- java 引用类型

java引用类型介绍 先举一个例子: 1、打印地址 public static  void main(String str[]){ String ss[]={"12","23","45","22"}; System.out.println(ss); //打印结果:[Ljava.lang.String;@18a992f }   2、打印值 public static  void ma...

欢迎来到我的博客,一起探索代码里的世界! 864

java传值传引用原理,Java传值仍是传引用终极解释,还是看老外解释的清楚啊

Java传值还是传引用终极解释,还是看老外解释的清楚啊。by http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.htmlDoes Java pass by reference or pass by value?Why can't you swap in Java?By Tony Sintes, JavaWorld.c...

weixin_28856341的博客 94

Go语言的传参和传引用[转]

传参和传引用的问题 很多非官方的文档和教材(包括一些已经出版的图书), 对Go语言的传参和引用的讲解 都有很多问题. 导致众多Go语言新手对Go的函数参数传参有很多误解. 而传参和传引用是编程语言的根本问题, 如果这个问题理解错误可能会导致很多问题. 传slice不是传引用! 首先, Go语言的函数调用参数全部是传值的, 包括slice/map/...

weixin_33980459的博客 103
上一篇: LeetCode 88 - Merge Sorted Array 合并有序数组
下一篇: Static关键字
Ayu阿予
博客等级 码龄5年 456粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayu阿予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值