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

        引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。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.hqwc.cn/news/307335.html

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

相关文章

电脑报错缺失vcomp140.dll无法执行代码怎么解决?快速的修复vcomp140.dll方案

vcomp140.dll无法执行代码怎么解决&#xff1f;vcomp140.dll是常见的系统文件&#xff0c;许多用户遇到它缺失导致程序无法运行的问题。本文旨在提供彻底解决此问题的方法&#xff0c;并对vcomp140.dll文件本身进行了简要说明。 以下是几种修复缺失的vcomp140.dll文件的方法 第…

车载导航定制_ 基于联发科MT6737核心板的车载终端解决方案

近年来&#xff0c;车载导航在智能化和功能化方面得到了长足的发展&#xff0c;不再仅仅局限于导航功能&#xff0c;而是集成了多种驾驶辅助功能&#xff0c;为驾驶者提供了全方位的行车辅助体验。这些功能包括车辆行车记录、倒车影像、AR实景导航、语音助手、ADAS辅助、云电子…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

MySQL的高级SQL语句

目录 1.mysql高阶查询 select&#xff1a;显示表格中一个或数个字段的所有数据记录 distinct&#xff1a;不显示重复的数据记录 where&#xff1a;有条件查询 AND OR &#xff1a;且 或 in&#xff1a;显示已知值的数据记录 between&#xff1a;显示两个值范围内的数据记…

rime中州韵 自定义词典

在使用 rime 输入法的过程&#xff0c; 我们往往会需要增加一些个个性化的词条&#xff0c;这些词条我们可能通过自定义词典的方式来管理和使用。 Custom_phrase.txt 首先&#xff0c;我们需要有一个词典文档&#xff0c;这里我们把 Custom_phrase.txt 文档作为我们的自定义文…

【WordPress插件】热门关键词推荐v1.3.0 Pro开心版

介绍&#xff1a; WordPress插件-WBOLT热门关键词推荐插件&#xff08;Smart Keywords Tool&#xff09;是一款集即时关键词推荐、关键词选词工具及文章智能标签功能于一体的WordPress网站SEO优化插件。 智能推荐&#xff1a; 热门关键词推荐引擎-支持360搜索、Bing、谷歌&a…

五个步骤,帮你实现健康减调目标

由于现代生活节奏快、工作压力大&#xff0c;在追求美好生活的过程中&#xff0c;很多人都顾不上饮食好不好&#xff0c;身体健不健康的问题了&#xff0c;直到身体开始横向发展&#xff0c;这才开始有人意识到了肥胖的问题以及它的危害。健康与肥胖是此消彼长的&#xff0c;身…

YoloV8改进策略:基于自研的图注意力机制改进| 独家改进方法|图卷积和注意力融合模块

摘要 SE注意力机制是一种通过显式建模卷积特征的信道之间相互依赖性的方法,旨在提高网络产生的表示的质量。SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输入特征图压缩成一个向量,然后通过一个全连接层将其映射到一个较小的向…

RabbitMQ详解

RabbitMQ 概念 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。它是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计&#xff0c;基于此协议的客户端与消息中间件可传递消息&a…

jdk17安装

前言 也许是太久没有新建java项目了&#xff0c;官网新建spring项目最低到17了&#xff0c;吃惊… 最近正好项目需要&#xff0c;就安装下&#xff0c;顺便记录下&#xff0c;与诸君共勉&#xff01;抱拳~ 参考文章 JDK17的下载安装与配置(详细教程) 文件下载地址 jdk17-win…

深度解析LinkedList

LinkedList是Java集合框架中List接口的实现之一&#xff0c;它以双向链表的形式存储元素。与传统的数组相比&#xff0c;链表具有更高的灵活性&#xff0c;特别适用于频繁的插入和删除操作。让我们从底层实现开始深入了解这个强大的数据结构。 底层数据结构 LinkedList的底层数…

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:/…