C/C++ 函数参数按引用传递、指针传递、实参传递

news2024/11/26 20:45:17

        引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C++新增的这项特性是对 C语言的超越,C语言只能按值传递。按值传递导致被调用函数使用调用程序的值的拷贝。当然,C语言也允许避开按值传递的限制,采用按指针传递的方式。

        现在我们通过一个常见的的计算机问题一一交换两个变量的值,对使用引用和使用指针做一下比较。交换函数必须能够修改调用程序中的变量的值。这意味着按值传递变量将不管用,因为函数将交换原始变量副本的内容,而不是变量本身的内容。但传递引用时,函数将可以使用原始数据。另一种方法是,传递指针来访问原始数据。

演示源码:

// Len_value.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

void swapr(int & a, int & b);   // 按引用传递
void swapp(int * p, int*  q);	// 按指针传递
void swapv(int a, int b);		// 按值传递

int main()
{
	int a1 = 300;
	int a2 = 350;
	cout << "按引用传递:";
	cout << "a1=" << a1 << ", a2=" << a2 ;
	swapr(a1, a2);
	cout << ",交换数据后:a1=" << a1 << ", a2=" << a2 << endl << endl;

	a1 = 300;
	a2 = 350;
	cout << "按指针传递:";
	cout << "a1=" << a1 << ", a2=" << a2;
	swapp(&a1, &a2);
	cout << ",交换数据后:a1=" << a1 << ", a2=" << a2 << endl << endl;


	a1 = 300;
	a2 = 350;
	cout << "按值传递:  ";
	cout << "a1=" << a1 << ", a2=" << a2;
	swapv(a1, a2);
	cout << ",交换数据后:a1=" << a1 << ", a2=" << a2<<endl << endl;
}

void swapr(int & a, int & b)   // 按引用传递
{
	int temp = a;
	a = b;
	b = temp;
}
void swapp(int * p, int*  q)	// 按指针传递
{
	int temp = *p;
	*p = *q;
	*q = temp;

}
void swapv(int a, int b)		// 按值传递
{
	int temp = a;
	a = b;
	b = temp;
}

执行结果:

程序说明:
    swapr(a1, a2);
    swapp(&a1, &a2);
    swapv(a1, a2);
    
        按引用传递swapr(a1,a2) 和按值传递 swapv(a1,a2)看起来相同。

        只能通过原型或函数定义才能知道 swapr()是按引用传递的。然而,地址运算符&使得按地址传递swapp(&a1,&a2)一目了然。类型声明 int*p 表明p 是个int 指针因此与p 对应的参数应为地址如&a1。
比较函数 swapr()按引用传递和 swapv()按值传递的代码,唯一的外在区别是声明函数参数的方式不同:

    void swapr(int & a, int & b);   // 按引用传递
    void swapv(int a, int b);        // 按值传递

        当然还有内在区别: 在 swapr()中,变量a 和 b 是 a1和a2 的别名,所以交换a和b 的值相当于交换a1和a2的值;但在 swapv()中,变量a和b是复制了a1和a2的值的新变量。因此交换 a和 b的值并不会影响a2 和a2的值。最后,比较函传递引用和 传递指针第一个区别是声明函数参数的方式不同:

    void swapr(int & a, int & b);   // 按引用传递
    void swapp(int * p, int*  q);    // 按指针传递


        另一个区别是指针版本需要在函数使用p和 的整个过程中使用解除引用运算符*。

        之前说过,应在定义引用变量时对其进行初始化。函数调用使用实参初始化形参,因此质数的引用参数被初始化为函数调用传递的实参。也就是说,下面的函数调用将形参a和b分别初始化为 a1和a2。
            swapr(a1,a2);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JS 逆向百例】steam 登录 Protobuf 协议详解

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

Java创建线程执行任务的方法(一)

目录 1.继承Thread类 2.实现Runnab类 2.1实现Runnable类 2.2使用Lambda表达式 3.实现Callable类 3.1返回Integer类型数据 3.2返回String类型数据 3.3返回Object类型数据 4.匿名内部类 创建线程的方法&#xff1a;继承Thread类&#xff1b;实现Runnab类&#xff1b;匿名…

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…

腾讯云服务器怎么购买?流程来了

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容&#xff1a; 时间序列预测任务&#xff0c;单变量预测单变量&#xff0c;基于Llama大模型&#xff0c;在zero-shot场景下模型表现优异。创新点&#xff0c;引入滞后特征作为协变量来进行预测。 获得…

【每天一个早下班技巧】NPM发包流程

发包流程 step1&#xff1a;设置包发布地址 参考资料 // 1.在package.json中设置发布地址 "publishConfig":{"registry":"http://registry.npm.xxx.com" }//2.设置别名 alias ynpm"npm --registryhttp://registry.npm.xxx.com" ynp…

Typora使用PicGo+Gitee上传图片

Typora使用PicGoGitee上传图片 1.下载PicGo(国内镜像) https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/ 点击PicGo-Setup-2.3.0-x64.exe &#xff08;64位安装&#xff09; 然后打开gitee&#xff08;没注册先注册&#xff09; 2.下载node.js插件 https:/…

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑&#xff0c;如果电脑系统坏了&#xff0c;就会影响自己正常使用电脑&#xff0c;这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤&#xff0c;那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

4.14 构建onnx结构模型-Min

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Min 结点进行分析 方式 方法一&…

【网络安全 | XCTF】2017_Dating_in_Singapore

正文 题目描述&#xff1a; 01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-0405…

华为无线AC内三层漫游配置详解

重要说明 1、在一台ac中实现三层漫游 2、ac和核心的互联vlan和ap的管理vlan是同一个广播域&#xff0c;可以不用配option 43 3、直接转发模式&#xff0c;ac上可以不起业务vlan&#xff0c;ac和核心交换机上可以只放行一个互联vlan 10 4、ac上要启两个vap魔板&#xff0c;两个…

Git 浅入浅出

前提 最近和同事分模块联合开发代码&#xff0c;自然而然就要用到 Git 管理代码&#xff1b;借此机会&#xff0c;对 Git 进行简单介绍。 Git 的特征 文件系统 我们都知道 Git 是个版本控制系统&#xff0c;但是如果你深入了解其原理&#xff0c;就不难发现它更像一个文件管…

区间DP详解,思路分析,OJ详解

文章目录 前言问题引入暴力枚举自下而上状态设计状态转移方程 区间DP的分析状态设计状态转移时间复杂度翻译成递推 OJ详解P1880 [NOI1995] 石子合并记忆化搜索版本递推版本 HDU Dire WolfMultiplication PuzzlePolygon 总结 前言 区间dp属于动态规划中一类比较好理解的问题&…

概率论相关题型

文章目录 概率论的基本概念放杯子问题条件概率与重要公式的结合独立的运用 随机变量以及分布离散随机变量的分布函数特点连续随机变量的分布函数在某一点的值为0正态分布标准化随机变量函数的分布 多维随机变量以及分布条件概率max 与 min 函数的相关计算二维随机变量二维随机变…

超级详细的YOLOV8教程

超级详细的YOLOV8教程 YOLOV8介绍1. 数据标记1.1 第一种为在网站上下载&#xff0c;1.2 第二种为在CVAT上自定义数据 2. 制作数据集3. 部署YOLOV8的代码3.1 远程部署3.1.1 项目下载3.1.2 修改代码3.1.2.1 训练模型3.1.2.1 验证模型 3.2 本地部署3.2.1 YOLOV8项目部署3.2.2 cuda…

2023总结与展望--Empirefree

今年一篇博客都没写过了&#xff0c;好像完全在忙在工作和生活上面了&#xff0c;珍惜自我&#xff0c;保持热情&#xff0c;2024对我好点 文章目录 &#x1f525;1. 年终总结1.1.学习工作计划1.2. 生活计划1.3 个人总结 &#x1f525;2. 未来展望 &#x1f525;1. 年终总结 1…

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

两阶段提交协议

数据的强一致性 要么都修改 要么就都不修改。 不同的实体和过程 领导者和参与者、表决阶段和提交阶段 过程 一个不同意 提交就终止 存在的问题和解决的方案 如果一个领导者或者参与者的状态机中有阻塞状态&#xff0c;那么系统必须等他完成才能执行&#xff0c;这样就会…

【并发编程篇】线程安全问题_—_ConcurrentHashMap

文章目录 &#x1f354;情景引入&#x1f339;报错了&#xff0c;解决方案 &#x1f354;情景引入 我们运行下面的代码 package org.example.unsafe;import java.util.HashMap; import java.util.Map; import java.util.UUID;public class MapTest {public static void main(…

SpringBoot单点登录认证系统MaxKey(附开源项目地址)

1 项目介绍 MaxKey 单点登录认证系统&#xff0c;谐音马克思的钥匙寓意是最大钥匙&#xff0c;支持 OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM 等标准协议&#xff0c;提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC 权限管理…