c++指针传递与引用传递

news/2024/10/7 11:48:35/文章来源:https://www.cnblogs.com/qinLiCode/p/18449867

c 不支持引用传递的!
在 C++中,指针传递和引用传递是两种常用的参数传递方式,它们各自有不同的特点和适用场景。下面是两者之间的主要区别:

1. 语法和使用

指针传递

  • 定义和调用:函数参数是一个指针类型,调用时需要传递变量的地址。
  • 解引用:在函数内部需要使用解引用操作符 * 来访问指针指向的值。
  • 示例
    void modifyValuePointer(int *p) {*p = 20;  // 修改指针所指向的值
    }int main() {int value = 10;modifyValuePointer(&value);  // 传递变量的地址return 0;
    }
    

引用传递(引用的本质在c++内部实现是一个指针常量.

  • 定义和调用:函数参数是一个引用类型,调用时直接传递变量本身。
  • 直接使用:在函数内部可以直接使用引用变量,就像操作原始变量一样。
  • 示例
    void modifyValueReference(int &ref) {//int& ref = value; //自动转换为 int* const ref = &value; //指针常量是指针指向不可改,指针指向的值可以更改,这也说明为什么引用不可更改ref = 20;  // 直接修改引用绑定的对象
    }int main() {int value = 10;modifyValueReference(value);  // 直接传递变量return 0;
    }
    

2. 安全性

指针传递

  • 空指针:指针可以是 nullptr,因此在使用指针之前需要检查是否为 nullptr,以避免未定义行为。
  • 示例
    void modifyValuePointer(int *p) {if (p != nullptr) {*p = 20;} else {std::cerr << "Error: Null pointer" << std::endl;}
    }
    

引用传递

  • 不能为空:引用必须绑定到一个有效的对象,不能是 nullptr,因此不需要进行空指针检查。
  • 示例
    void modifyValueReference(int &ref) {ref = 20;  // 不需要检查空指针
    }
    

3. 可变性

指针传递

  • 重新绑定:指针可以在函数内部重新指向其他对象。
  • 示例
    void changePointer(int *p, int *q) {p = q;  // 只改变局部变量 p 的值,不影响调用者
    }int main() {int a = 10, b = 20;int *ptr = &a;changePointer(ptr, &b);  // ptr 仍然指向 areturn 0;
    }
    

引用传递

  • 不可重新绑定:引用一旦绑定到某个对象后,就不能重新绑定到其他对象。
  • 示例
    void changeReference(int &ref, int &otherRef) {// ref = otherRef;  // 这只是修改了 ref 绑定的对象的值,不是重新绑定引用
    }int main() {int a = 10, b = 20;int &ref = a;changeReference(ref, b);  // ref 仍然绑定到 areturn 0;
    }
    

4. 性能

指针传递

  • 额外开销:指针传递可能需要额外的解引用操作,这可能会带来一些性能开销。

引用传递

  • 优化:编译器通常会对引用进行优化,使得引用传递的性能与直接传递变量相同或接近。

5. 可读性和简洁性

指针传递

  • 可读性:指针传递需要显式地使用解引用操作符,这可能会使代码稍微复杂一些,尤其是对于初学者来说。

引用传递

  • 简洁性:引用传递更加简洁和直观,代码更容易理解和维护。

总结

  • 指针传递:适用于需要灵活地重新绑定对象或需要显式检查空指针的场景。
  • 引用传递:适用于需要保证参数非空且希望代码更简洁、更安全的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809373.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从硬件的视角看GEMM

从硬件的视角看GEMM 1. 分块乘法的内存层次架构 分块矩阵乘法,如图6-28所示, 通过将矩阵分块拆分,能够在处理器的Cache和寄存器内存放进行快速计算,计算完成后写回主存。图6-28 分块矩阵乘法 首先,所有的数据都在主内存中,如图6-29所示。图6-29 所有的数据都在主内存中 然…

电表行业强力推荐KY8023S6对标平替BL8023双向继电器驱动芯片

双向继电器驱动芯片KY8023S6对标平替BL8023。 产品特点 SOT23-6L和SOP-8 两种封装 静态功耗电流<1uA 输入高低转换电平为1.3V(Is=1A)左右,兼容多种单片机 工作电压5-40V,推荐工作电压5-30V 输入INA和INB端自带115k下拉电阻,一般可省略外围下拉电阻 集成高速续流二极管,…

重启后,idea 依赖爆红

没改动代码,但无法运行java项目 java: -source 1.5 中不支持……表达式/运算符java: 错误: 不支持发行版本 5解决:https://www.cnblogs.com/liu-han/p/16105953.html 文件→项目结构,SDK和项目/模块 语言级别的版本要一致SDK: 1.8 项目语言级别:SDK默认值 模块语言级别:SD…

[亲测]君临九州+单机安装教程+无需虚拟机+GM后台

今天给大家带来一款单机游戏的架设:君临九州,版本号:1.0.12.30。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没…

智慧园区管理系统原型

智慧园区管理系统的构建是一个复杂而系统的工程,它融合了信息化、AI、物联网等多种先进技术,旨在提升园区的管理效率、服务质量以及企业运营效率。 一、明确系统目标和需求 需求收集与分析:首先,需要对园区的实际需求进行全面分析,包括园区类型(如产业园区、办公园区、住…

POI导出excel文件加水印

百分百能用,我用的POI版本是5.2.3,效果如下import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.xs…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

江苏省第二届数据安全技术应用职业技能竞赛初赛WP

一、数据安全解题赛1、ds_0602解题思路题目让我们获取加密文件中的原始数据,解密后提交第六行第二列数据,下载附件,发现里面有两个文件,其中一个是“.enc”结尾,那这里我们得先简单了解一下“.enc”结尾的是什么类型的文件。简单来说“.enc”结尾的文件通常是经过加密的文…

java之使用CompletableFuture入门2

Java 17 -序章 本文介绍用过的 allOf、anyOf 函数的用法。allOf 函数原型两点: 1、没有返回值。 2、参数 cfs 中 任何一个 都不能是 null。anyOf 函数原型两点: 1、有返回值,为 Object。 2、参数 cfs 中 任何一个 都不能是 null。allOf 测试意图: 多个任务正常执行。ben发布…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 发布,新增功能概览VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org集中式日志管理 V…

VMware Aria Operations for Networks 6.13 发布,新增功能概览

VMware Aria Operations for Networks 6.13 发布,新增功能概览VMware Aria Operations for Networks 6.13 - 网络和应用监控工具 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

读数据工程之道:设计和构建健壮的数据系统01数据工程概述

数据工程概述1. 数据工程 1.1. 自从公司开始使用数据做事,数据工程就以某种形式存在了1.1.1. 预测性分析、描述性分析和报告1.2. 数据工程师获取数据、存储数据,并准备数据供数据科学家、分析师和其他人使用 1.3. 数据工程是系统和流程的开发、实施和维护,这些系统和流程接收…