传指针和传引用的区别以及指针和引用的区别

2023-11-18

一、引用:

 引用的定义:引用是给另外一个变量其别名,所以引用不会分配内存空间,引用是引入了对象的一个同义词。

例如:

Point pt1(10,10);
Point &pt2 = pt1;

 上述的代码,定义了pt2为pt1的引用。通过这样的定义,pt2和pt1表示同一对象,需要特别注意的是,引用并不产生对象的副本,仅仅是对象的同义词,因此当执行下面的语句之后

pt1.offset(2,2);

pt1和pt2就都具有相同的值,引用必须在定义的时候马上被初始化,因为它必须是某个具体的东西的同义词,你不能线定义一个引用然后初始化它。下面的语句是非法的

Point &pt3;
pt3 = pt1;

引用有两个主要的用途:作为函数参数以及从函数中返回左值,在下面的内容中讲到

二、指针传递

     指针传递参数本质上是值传递,它所传递的是一个地址值。值传递的过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本,当栈帧回退的时候这个局部变量就不存在了。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值(这里是在说实参指针本身的地址不会变)。举例如下:

void Swap(int *x, int *y)
{
	int *tmp;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 10,b = 20;
	cout<<"a = "<<a<<" b = "<<b<<endl;
	Swap(&a,&b);
	cout<<"Swap后"<<endl;
	cout<<"a = "<<a<<" b = "<<b<<endl;
}

结果展示:

三、传引用

     传引用过程中,被调函数的形式虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址(int &形式)。被掉函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。当栈帧回退的时候,局部变量虽然已经不存在了,但是它已经通过实参传来的地址将地址里边的值已经改了。正因如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。举例如下:

void Swap(int &x, int &y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 10,b = 20;
	cout<<"a = "<<a<<" b = "<<b<<endl;
	Swap(a,b);
	cout<<"Swap后"<<endl;
	cout<<"a = "<<a<<" b = "<<b<<endl;
}

结果展示:

四、引用返回值

    如果一个函数返回了引用,那么该函数的调用也可以被赋值,举例:

int &func(int& tmp)
{
	return tmp;
}
int main()
{
	int num = 1;
	cout<<"num = "<<num<<endl;

	func(num) = 3;
	cout<<"change"<<endl;
	cout<<"num = "<<num<<endl;
}

结果展示:

五、传指针和传引用的区别

    虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针得指针,或者引用。

     为了进一步了解对指针和引用得区别,我将从编译得角度来阐述它们之间的关系

  程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改变,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改

六、指针和引用的相同点与不同点

相同点:(1)都是地址的概念,指针指向一块内存,它的内容所指内存的地址;而引用则是某块内存的别名

不同点:(1)指针是一个实体,需要分配内存空间,引用只是变量的别名,不需要分配内存空间

               (2)引用在定义的时候必须进行初始化,以后不能够改变(从一而终);指针在定义的时候不一定要初始化,并且指向的空间可变(见异思迁)。注:引用的值不能为NULL

               (3)有多级指针,但是没有多级引用

               (4)引用没有const,指针有const,const的指针不可变;(具体指没有 int& const a这种形式,而const int& a是有

                           的,前者指引用本身即别名不可改变,引用本来就不可改变,所以不需要这种形式,后者指引用所指的值不可

                           改变)。

              (5)sizeof 引用,得到的是指向的变量的大小,而 sizeof 指针 得到的是指针本身的大小

              (6)指针和引用的自增(++)运算意义不一样,指针是指向下一个空间,引用是引用的变量值加1

              (7)引用访问一个变量是直接访问,而指针访问一个变量是间接访问

              (8)引用类型是安全的,而指针不是。(引用比指针多了类型检查)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传指针和传引用的区别以及指针和引用的区别 的相关文章

  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • YOLOv8目标检测PySide6 GUI可视化界面

    课程链接 https edu csdn net course detail 38552 YOLOv8目标检测PySide6 GUI可视化界面效果图如下 YOLOv8目标检测PySide6 GUI可视化界面支持本地图片和视频推理 摄像头实时视
  • PyTorch深度学习实践笔记#8

    嗨 我是error 我来记录PyTorch深度学习实践的笔记了 这会是这个系列的最后一篇文章 个人之前都是使用tensorflow进行深度学习实践 这是第一次学习Pytorch 若笔记有误欢迎提出纠正 课件采用自B站 刘二大人 老师的视频
  • Latex常用数学公式整理——矩阵

    文章目录 1 简单矩阵 2 复杂矩阵 1 简单矩阵 带 的矩阵 begin pmatrix 0 0 0 0 1 0 0 0 0 end pmatrix 0
  • Jaspersoft 环境搭建和入门简单实例

    JasperReport简介 JasperReport是一个强大 灵活的报表生成工具 能够展示丰富的页面内容 并将之转换成PDF HTML 或者XML格式 该库完全由Java写成 可以用于在各种Java应用程序 包括J2EE Web应用程序
  • BFS(广度优先算法)——判断无向简单图中任意两点是否连通

    include
  • dojo SplitContainer

    SplitContainer author amushen email amushen yahoo com cn qq 38371354 相关的文件 dojo widget LayoutContainer dojo widget HtmlW
  • Pytorch2.0中compiled_model=torch.compile(model) 的正确添加位置

    今天pytorch官网更新了pytorch2 0稳定版 迫不及待的我直接更新了 确实像官方所说 只需加入model torch compile model 一行代码即可加速 加入的位置如下 cpu训练 model UNet deep sup
  • 混杂设备与字符设备的区别----misc_register、 register_chrdev 的区别总结

    杂项设备 misc device 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动 在 Linux 内核的include linux目录下有Miscdevice h文件 要把自己定义的misc device从设备定义在这里 其实是因为这些
  • openstack开发实践(一):devstack搭建all-in-one的openstack开发环境

    Devstack简介 devstack是面向开发者的一个openstack部署工具 用户可以指定不同的版本分支进行安装 devstack借助于Shell脚本实现openstack自动化部署 devstack源码中的stack sh即为安装脚
  • Python基于控制台的学生管理系统

    encoding utf 8 定义一个函数 显示可以使用的功能列表给用户 def showInfo print 30 print 学生管理系统 v1 0 print 1 添加学生的信息 print 2 删除学生的信息 print 3 修改学
  • MIPI信号的分析--结合示波器实际测试波形

    如果排查的思路对你有帮助 请记住 消雨匆匆 码字和排查很累 仅此而已 硬件不是抄电路 拿烙铁 懂点软件 细致分析 找问题和破案搜集线索是一样的 PS 硬件知识也可以性感 部分内容来自于此博客的大神总结 http www elecfans c
  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

    场景 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 霸道流氓气质的博客 CSDN博客 在上面实现J
  • 数字人+ChatGPT强强联手能擦出什么火花?

    随着元宇宙概念的快速发展 以数字人 ChatGPT为形式的创作方式正在颠覆传统视频创作方式 并在市场上呈现快速增长的态势 根据新榜的报道 目前已经有多位大V使用虚拟数字人来协助完成短视频制作 并且值得一提的是 这些视频并没有因为采用数字人而
  • 定时器编码器AB相电机测速( 补充)

    TIM编码器AB相电机测速 定时器编码器AB相电机测速 1 四倍频 2 算法应用 3 stm32硬件连接 3 stm32环境配置端口配置 3 C语言实现编码器个数读取 3 C语言实现编码器个数转换为速度 定时器编码器AB相电机测速 1 四倍
  • vue3配置eslint 出现问题

    vue3配置eslint 出现问题 标题必须使用导入来加载 ES 模块 ESlint Error Must use import to load ES Module 加上这一行即可
  • Jmeter之ForEach控制器

    场景运用 ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用 其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量 该控制器下的采样器或者控制器都会被执行一次或多次 每次读取不同的变量值 需求2 有一组
  • 学习java随堂练习-20220609

    学习Java的第八天 第1题 第2题 第3题 第4题 第5题 今天是学习Java的第八天 5道练习题 第1题 题目 1 循环输入近6年某高校的录取分数 求出平均分和最低分 运行结果 代码如下 循环输入近6年某高校的录取分数 求出平均分和最低
  • PHP操作Excel

    头 header Content Type application vnd ms excel header Content Disposition attachment filename sample xls header Pragma n
  • 时序预测

    时序预测 MATLAB实现DNN全连接神经网络时间序列预测 目录 时序预测 MATLAB实现DNN全连接神经网络时间序列预测 基本介绍 模型研究 程序设计 学习总结 参考资料 基本介绍 DNN的结构不固定 一般神经网络包括输入层 隐藏层和输
  • 传指针和传引用的区别以及指针和引用的区别

    一 引用 引用的定义 引用是给另外一个变量其别名 所以引用不会分配内存空间 引用是引入了对象的一个同义词 例如 Point pt1 10 10 Point pt2 pt1 上述的代码 定义了pt2为pt1的引用 通过这样的定义 pt2和pt