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

Mybatis Provider注解实现批量插入

需求 借助mybatis 的provider实现一个比较通用的,批量插入数据接口。 Mapper接口 第一参数为需要批量插入的数据,第二个参数为对应实体类的class public interface BaseDao<T> { @InsertProvider(type = BaseProvider.class, method = "batchInsert") int batchInsert(@Param("lists") List<T&gt

小楼夜听雨的博客 2417

CSRT跟踪算法的使用

Fu Xianjun. All Rights Reserved. 文章目录 前言 一、CSRT跟踪算法是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CSRT跟踪算法是什么? 在具有通道和空间可靠性的判别相关滤波器(DCF-CSR)中,我们使用空间可靠性图将滤波器支持调整为从帧中选择区.

sinat_53821602的博客 7906

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

涨薪技术|Kubernetes(k8s)环境部署实战

这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json:​​​​​​​。安装完成后,可以使用以下命令来查看dashboard访问的端口号​​​​​​​。网络插件CNI也是以容器的方式进行启动​​​​​​​。安装完成后可以检查是否拉取了对应的容器​​​​​​​。再使用以下命令进行安装:​​​​​​​。打开后输入以下内容:​​​​​​​。安装1.19.0版本​​​​​​​。修改IP地址:​​​​​​​。

m0_60889254的博客 1085

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

【kafka】控制台默认不能发送大数据 4096 4095 4129

1.概述 因为某些原因,需要做一个测试,然后我想往topic中,发送一条消息,然后再消费它。但是消息有点大,一条消息是36K. 消费者 [root@1 kafka]# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic xxx.devicealarm | grep 网络攻击 生产者,生产者发送了一个消息消息是一个json,json中有这个数据特征 网络攻击 [root@1 kafka]# bin/kafka-console-p

九师兄 586

【YOLOv11工业级实战】15. YOLOv11海洋监测实战:珊瑚礁健康评估(水下图像增强|机器人搭载)

摘要:本文针对珊瑚礁健康评估的海洋监测需求,基于YOLOv11提出解决方案,聚焦水下色偏、悬浮物干扰、珊瑚形态复杂三大难题。引用全球珊瑚礁监测网络(GCRMN)标准,采用CoralNet数据集,通过Jaffe-McGlamery物理模型引导增强与悬浮物去除算法,在浑浊水域(能见度<5m)实现87.3%的健康珊瑚识别率,藻类误判率低至7.2%。介绍了以BlueROV2水下机器人和Jetson AGX Orin为核心的部署方案,结合水下SLAM定位技术,实现珊瑚健康的实时评估与三维覆盖率计算。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1644

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

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

祯的博客 728

【AUTOSAR-COM】-2.3_通过PduGroup批量控制CAN Frame/Pdu的接收

-->如果实现类似UDS诊断 $28服务,控制所有APP CAN Rx Frame/Pdu/报文接收; -->自定义过滤CAN信号的接收。

「汽车电子助手」的博客 1989

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

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

weixin_42579072的博客 1万+

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1191

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

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

mingyuexin235的博客 2011

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

icat的博客 2024

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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、付费专栏及课程。

余额充值