C++引用参数与指针参数

关于 C++ 参数使用指针还是引用的总结 这本书的第一条就是区分指针和引用。它们两者之间的最大区别是引用必须指向某个对象而 指针可以是NULL,此外引用一旦指定不能更改而指针可以。这两个区别点导致引用有更加安全和高效的特性,但是指针却有无可比拟的灵活性。大部分 人出于安全性的考虑会推荐使用引用,这其实也是它设计的主要目的,但是如果你想要灵活 的设计,大部分时候你只能选用指针,比如设计模式种的大部分设计都是使用指针而不是使 用引用。 阅读详情

引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢?

引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。

因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针。例如:

class X;
void manip(X *px){
	//在解引用之前确定它非0
	if(px != 0)
		//解引用指针
}


另一方面,对于引用参数,函数不需要保证它指向一个对象。例如:

class Type{};
void operate(const Type& p1,const Type& p2);
int main(){
	Type obj1;
	//错误:引用参数的实参不能为0
	Type obj2 = operate(obj1,0);
}


如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数。

引用参数的一个重要用法是,它允许我们在有效实现重载操作符的同事,还能保证用法的直观性。

看个实例,它使用了Matrix类类型。我们想支持两个Matrix对象的加法和赋值操作符,使他们的用法同内置类型一样“自然”:

Matrix a,b,c;
c = a + b;


Matrix类对象的加法和赋值操作符用重载操作符来实现。

为重载操作符提供一个定义:

Matrix operator+(Matrix m1,Matrix x2){
	Matrix result;
	//do the computation in result
	return result;
}


实参按值传递,效率很低。

为提高效率,假设我们将参数声明为指针。operator+()新的实现代码:

Matrix operator+(Matrix *m1,Matrix *x2){
	Matrix result;
	//do the computation in result
	return result;
}


这样有一个缺点:失去了加法操作符用法的直观性。现在指针参数要求我们传递地址作为实参,指向Matrix对象。现在,我们的加法操作必须如下编程:

&a + &b;


但是这样比较难看,接口不友好。而且,在一个复合表达式中加三个对象变得很困难:

//这无法工作
//&a+&b的返回类型是Matrix对象
&a + &b + &c;


程序必须这样写:

&(&a + &b) + &c;

但是,引用参数提供了我们需要的方案。此时函数接收到的是实参的左值而不是值得拷贝。引用参数的实参是Matrix对象本身,这允许我们像对内置数据类型的对象一样自然地使用加法操作符。

operator+()实现代码:

Matrix operator+(Matrix &m1,Matrix &x2){
	Matrix result;
	//do the computation in result
	return result;
}


它支持如下形式的Matrix对象的加法:

a + b + c;



 

 

 

C++建立单向链表链表头指针需要使用指针类型的引用参数?  struct Node {int date; Node *next;}; void CreateList(Node *&head) //引用参数是表头指针 { s=new Node; cin>>s->data; while(s->data!=0) {if(head==NULL)head=s; else p->next=s; p=s; s=new Node; cin>>s->data;} p->next-NULL; delete s; return; }函数需要修改指针的内 阅读详情

相关推荐

C++中引用参数与指针参数的区别与联系详解

在C++中,函数参数可以通过值传递、引用传递和指针传递。虽然指针传递在C和C++中都非常常见,但C++引入了引用类型,使得引用传递变得更加直接和易用。本文将详细介绍函数中引用参数和指针参数的区别与联系,并通过C++语言代码示例加以说明。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 771

C++ 笔试题 (1)——每天学一点,天天都进步

关于引用以下说法错误的是( )。(阿里巴巴2015笔试题) A.引用必须初始化,指针不必 B.引用初始化以后不能被改变,指针可以改变所指的对象 C.不存在指向空值的引用,但是存在指向空值的指针 D.一个引用可以看作是某个变量的一个“别名” E.引用传值,指针传地址 F.函数参数可以声明为引用或指针类型 答案解析 A.引用必须初始化,必须在定义引用时明确引用的是哪个变量或者对象,否则语法错误,指针不初始化时值为随机指向 B.引用一旦定义时初始化指定,就不能再修改,指针可以改变指向 C.引用必须出示化,.

愿你有青春亦可奔赴 1844

C# 调用C++DLL(函数参数包含指针)

C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。

【C++基础学习】C++引用参数与指针参数

引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢? 引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。 因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针。例如: class X;...

weixin_34021089的博客 248

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 349

技术解析:PETR如何通过3D位置编码革新多视角3D目标检测

本文深入解析了PETR模型如何通过创新的3D位置编码技术革新多视角3D目标检测。它摒弃了DETR3D复杂的投影采样机制,通过3D坐标生成器和编码器,将3D几何信息直接注入2D图像特征,构建出3D感知特征。该方法简化了流程,提升了模型对空间关系的理解能力与训练稳定性,为自动驾驶等领域的精准感知提供了新思路。

weixin_29079743的博客 213

C++C#相互调函数指针

按照之前对C++函数指针的理解,C++函数指针为内存地址,可以用int或者intptr_t保存地址信息,在需要调用时候再转换成相应的函数指针。委托作为C#的指针实现形式,那么理论上可以用C#的IntPtr类型接C++返回的intptr_t地址后在转换为C#的委托对象。然后通过委托对象执行函数调用。理论上也可以把C#的函数转换成IntPtr传递给C++,C++得到intptr_t后把地址转换成相应的函数指针执行函数调用。 首先实现C++的dll库代码 提供的申明头 #include <string&gt

zhanglianzhu_91的博客 4112

Xilinx IP核 Block Memory Generator v8.4 的使用

本文主要介绍如何使用并初始化 Xilinx 提供的IP核 Block Memory Generator v8.4`,为了确保成功初始化,还对其进行了一个简单的仿真,更多细节请参考官方手册。

高阶近似的博客 1万+

C#调用C++

C#调用C++DLL的方法,不同参数类型的调用方法 1. 参数为基本类型,例如int, float, char等 [C++] void fun(int value); void fun(float vaue); void fun(char ch); [C#] [DllImport("xxx.dll")] public static extern void fun(Int32 value); [D...

lishuangquan1987的博客 2368

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 250

自然语言处理:稀疏向量表示

稀疏向量表示是指运用特定的方法和技术,将数据(如文本、图像、信号等)转化为向量形式,且该向量具有大部分元素值为零,仅少数元素值非零的特征,以此来实现对数据的高效存储、处理和分析。

老赵爱学习的博客 1443

C++练习 —— 命名空间、引用、类的定义、构造函数和析构函数、运算符重载、const成员函数、类相关OJ题

C++练习 —— 命名空间、引用、类的定义、构造函数和析构函数、运算符重载、const成员函数、类相关OJ题

祯的博客 728

Vue3 - 超详细“纯前端“将文件上传到阿里云OSS对象存储,最新阿里云前端直传音频、视频、图片、文件、office文档等任意文件,vue3单个或批量从本地选择文件,秒传到阿里云oss无需后端接口!

vue3,阿里云oss存储,前端直传oss,上传图片/office文档/音视频/zip压缩包到阿里云oss,项目中上传文件到阿里云oss详细教程,如何将本地文件上传到阿里云OSS存储,纯前端实现阿里云OSS上传,纯前端直传至阿里OSS对象存储教程,如何解决上传文件到阿里云OSS本地环境调试出现跨域问题,直传阿里云oss跨域报错解决,前端直接上传文件到oss服务端,不经过后端直传,浏览器直接上传文件,阿里云oss上传sdk官方文档,阿里云错误,解决这个问题,上传很慢,一直签名失败,权限,不经过后端,纯前端直传

🏆 前端领域优质创作者 1万+

c++之指针和引用作为函数参数传递时的区别

之前写过c++之值传递、引用传递、指针传递,今天再单独区分一下指针和引用作为函数参数传递时的区别。 本文参考浅谈C++中指针和引用的区别 一、指针作为函数参数传递时 1、类似于值传递,传入函数的指针只是原指针的一个拷贝,所以此时是存在两个指针,同时指向一个内存空间(同时指向原对象) 2、当在函数中不改变拷贝指针的指向时,修改指针的值,就相当于修改原指针指向的对象 3、当在函数中改变拷贝指针的指向时,只是改变了拷贝指针的指向,不改变原指针的指向,所以不改变原指针指向的对象。 #include<iostr

weixin_42579072的博客 1万+

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 687

华为用自研的MetaERP替换全球顶级的SAP ERP系统,其难度与风险远超一次普通的技术升级,它是一场战略级的、涉及业务筋骨的系统性工程

华为成功用自研MetaERP替换SAP系统,这是一项极具挑战的战略工程。面临四大难度:业务复杂度高(170多国业务)、数据迁移量大(20年历史数据)、技术集成复杂(重构生态系统)、人员适应周期长。同时伴随四大风险:业务中断、数据失真、成本超支、供应链协同问题。华为成功的关键在于:生存压力驱动的战略决心、强大的软件研发能力、以自身业务为试验场、分步实施策略。这一案例证明中国企业能攻克高端软件壁垒,但对大多数企业而言,核心系统替换需谨慎评估风险,建议采用渐进式替代策略。

金牌架构师 535

C++学习——指针、引用、参数传递

本文总结了一些C++学习与面试题常考的重点知识,包含指针、引用、参数传递等相关内容。

mingyuexin235的博客 2011

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

c++ 对象作为参数,指针作为参数,引用作为参数

c++ 参数传递方式有三种,分别为:传对象,传引用和传指针,那这三种传递方式之间到底有什么区别呢? 传对象:是将实参对象的值传递给形参对象,是单项传递,在函数中修改形参的值时,不会影响到原来实参的值 传引用:把实参对象名传给形参对象名,形参对象名就成为实参对象名的别名,实参和形参代表同一个对象,所以改变形参,就是改变实参对象的值. 传指针:将指向对象的指针作为函数的参数,形参是对象的指针,实参是对...

icat的博客 2024

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++引用变量、函数中引用参数&、引用和指针的区别

引用是充当另一个变量别名的变量。引用类型最常用于函数的参数,它使得一个函数能够对传递给他的变量做出永久性的改变。引用更正确的称呼是左值引用。 #include <iostream> using std::cout; using std::cin; using std::endl; int add(int &a); int main(void) { int a = 11, b = 22; int i = 0; int &j = i;//j是i的一个别名 j++;//更改i

DayDayUp 1584

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++笔记——参数传递中的指针传递和引用传递

C++笔记——参数传递中的指针传递和引用传递

ken2232的博客 3644

C++中的指针与引用、如何参数传递

C++语言中,函数的参数和返回值的传递方式有3种:引用传递、指针传递和值传递。 1、引用传递 引用传递传递的是引用对象的内存地址。 引用传递的特点是:被调函数对形参的任何操作都会影响主调函数中的实参变量。 举例说明: #include using namespace std; void swap3(int &p,int &q) { int temp; temp =

成长Bar的博客专栏 1113

C/C++ 数组作为参数传递 指针 引用——VS——普通值传递、指针传递、引用传递

文章目录1 C++ 值传递、指针传递、引用传递详解值传递:指针传递:引用传递:2 数组作为函数的形参2.1 一维数组传递2.2 二维数组传递总结 1 C++ 值传递、指针传递、引用传递详解 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

zou_albert的博客 2万+

【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )

I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1134

C++ 指针或引用作为函数参数

C++ 指针或引用作为函数参数 例子: #include <iostream> using namespace std; void swap1(int a, int b); void swap2(int *p1, int *p2); void swap3(int &r1, int &r2); int main() { int num1, num2; cout << "Input two integers: "; cin >&gt

qq_36013249的博客 447

【C++ 函数参数】指针类型和指针引用类型的区别

总体来说指针的引用类型传递参数没太大用处。函数中通过 *p 修改指向的地址的值就可以。

hhw_hhw的博客 1292
上一篇: main 函数传参
下一篇: 内联函数的声明和定义
seadplus
博客等级 码龄15年 57粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值