【C++】函数入参 值传递和引用传递,与C语言的区别

在 C++ 中,函数的参数传递有值传递和引用传递两种方式。当函数的参数是 vector 类型时,可以选择使用 vector 或 vector& 作为参数类型,两者各有优劣:

vector vect1:这种方式使用了值传递,即在函数调用时会对传入的 vector 对象进行拷贝,函数内部对参数进行修改不会影响原始对象。如果在函数体内调用 vect1.push_back(1),则是对函数内部的拷贝对象进行操作,不会影响原始对象。

void func1(vector<int> vect) {vect.push_back(1);
}int main() {vector<int> originalVect;func1(originalVect);// originalVect.size() 仍然为 0,没有改变return 0;
}

vector& vect1:这种方式使用了引用传递,即在函数调用时不会进行拷贝,直接操作原始对象。如果在函数体内调用 vect1.push_back(1),则会直接对原始对象进行操作。

void func2(vector<int>& vect) {vect.push_back(1);
}int main() {vector<int> originalVect;func2(originalVect);// originalVect.size() 现在为 1,已经改变return 0;
}

因此,如果希望在函数内部修改传入的 vector
对象,并且希望这些修改能够影响到原始对象,那么应该使用引用传递(vector&)。如果只是需要在函数内部使用传入的 vector 对象而不修改原始对象,那么可以使用值传递(vector)。

需要注意的是,在使用引用传递时,需要注意函数内部对传入对象的修改可能会对原始对象造成意外的影响,因此在编写代码时需要慎重考虑传参方式,避免出现不可预期的结果。

在 C++ 中,对于 vector 对象来说,无论是通过引用传递还是值传递,都可以使用 vect.push_back(1) 这样的方式来对 vector 进行操作。这是因为 C++ 中的对象是面向对象的,其成员函数(比如 push_back)是通过对象直接调用的,而不需要通过指针来取得对象。

当你使用 vect.push_back(1) 时,编译器会根据 vect 的类型来自动调用对应的成员函数,让代码更加简洁和易读。

还可以通过指针传递方式将 vector 对象传递给函数。如果函数的参数是 vector* vect1,则表示该函数接受一个指向 vector 对象的指针作为参数。在函数内部,可以通过解引用操作符 * 来访问指针所指向的 vector 对象。

#include <iostream>
#include <vector>void func(vector<int>* vect) {vect->push_back(1); // 使用箭头运算符 -> 访问指针指向的对象
}int main() {vector<int> originalVect;func(&originalVect); // 传入指向 originalVect 的指针for (int num : originalVect) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在上面的代码中,func 函数接受一个指向 vector 对象的指针作为参数,然后通过箭头运算符 -> 来访问指针所指向的对象并调用 push_back 方法。在 main 函数中,我们将 originalVect 的地址传递给 func 函数,使得在函数内部可以修改原始对象。

通过指针传递 vector 对象,可以在函数内部修改原始对象的内容,并且不会发生对象的拷贝。需要注意的是,在使用指针传递时,需要确保指针有效性并注意内存管理,以避免出现悬空指针或内存泄漏等问题。

在 C 语言中,如果传入的是指针 vect,那么必须使用 *vect 来取得指针所指向的值,这是因为在 C 语言中,指针是一种特殊的数据类型,需要通过解引用操作符 * 才能获取指针指向的值。所以在 C 语言中,对于指针变量 vect,你需要使用 *vect 来获取其指向的值。

当在 C 语言中使用不同的参数传递方式时,可以通过值传递、引用传递和指针传递来访问和修改函数参数。以下是这三种方式的示例代码:

值传递(Pass by Value)示例:

#include <stdio.h>// 值传递方式
void valuePass(int num) {num = 10; // 修改函数内的副本
}int main() {int originalNum = 5;valuePass(originalNum); // 将 originalNum 的值传递给函数printf("Original number: %d\n", originalNum); // 输出 5,未被修改return 0;
}

引用传递(Pass by Reference)示例:
C 语言中并没有直接支持引用的概念,但可以通过指针来模拟引用传递的效果。

#include <stdio.h>// 引用传递方式,使用指针模拟引用
void referencePass(int *num) {*num = 10; // 通过指针修改原始变量的值
}int main() {int originalNum = 5;referencePass(&originalNum); // 将 originalNum 的地址传递给函数printf("Original number: %d\n", originalNum); // 输出 10,已被修改return 0;
}

指针传递(Pass by Pointer)示例:

#include <stdio.h>// 指针传递方式
void pointerPass(int *num) {*num = 10; // 通过指针修改原始变量的值
}int main() {int originalNum = 5;pointerPass(&originalNum); // 将 originalNum 的地址传递给函数printf("Original number: %d\n", originalNum); // 输出 10,已被修改return 0;
}

在这些示例中,可以看到不同的参数传递方式对原始变量的修改效果。值传递会修改函数内部的副本,而引用传递和指针传递可以直接修改原始变量的值。

值传递(Pass by Value):
C 语言中的值传递: 在 C 语言中,所有参数传递都是按值传递的,即函数接收的是实际参数的副本,对形参的修改不会影响实参。
C++ 中的值传递: 在 C++ 中,也支持值传递。当参数通过值传递时,函数会创建参数的副本,对形参的修改不会影响实参。
引用传递(Pass by Reference):
C 语言中的引用传递: 在 C 语言中并没有直接支持引用传递,但可以通过指针来模拟引用传递的效果。
C++ 中的引用传递: C++ 提供了引用传递的机制。通过引用传递,函数可以直接操作实参,而不是其副本。这样可以避免产生额外的副本,同时对形参的修改会影响到实参。
指针传递(Pass by Pointer):
C 语言中的指针传递: 在 C 语言中,可以通过指针传递来修改实参的值。函数接收一个指向变量的指针,可以通过指针修改原始变量的值。
C++ 中的指针传递: C++ 同样支持指针传递。通过传递指针作为参数,函数可以直接修改原始变量的值。
总结:

C 语言中参数传递都是按值传递,可以通过指针来模拟引用传递的效果。
C++ 中支持值传递、引用传递和指针传递,其中引用传递可以让函数直接操作实参,而指针传递则需要使用指针来访问和修改实参的值。
使用引用传递可以避免产生额外的副本,提高效率,并且能够直接修改实参的值。

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

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

相关文章

自学高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题解析

今天继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么小…

Dism修复Windows出错(错误代码0x800f081f,找不到源文件)的解决方法

一、环境 系统&#xff1a;Windows 10 二、Dism修复步骤 注&#xff1a;以下操作都需要管理员权限。修复过程需要联网。 2.1 dism扫描全部系统文件 DISM /Online /Cleanup-image /Scanhealth如果结果是“未检测到组件存储损坏 ”&#xff0c;说明完好&#xff0c;可以退出…

Maven终端命令生成Spring-boot项目并输出“helloworld“

1. 生成项目 mvn archetype:generate填写groupId和artifactId&#xff0c;其余默认即可 2. 修改pom.xml文件 将如下内容放入pom.xml文件内 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

Conda笔记--移动Conda环境后pip使用异常的解决

1--概述 由于各种原因&#xff0c;需要将Anaconda转变为Minicoda&#xff0c;为了保留之前安装的所有环境&#xff0c;直接将anaconda3/envs的所有环境拷贝到Miniconda/envs中&#xff0c;但在使用移动后环境时会出现pip的错误&#xff1a;bad interpreter: No such file or di…

计算机网络-物理层-传输媒体

传输媒体的分类 导向型-同轴电缆 导向型-双绞线 导向型-光纤 非导向型

面试问答总结之Java进阶

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;注解Annotaion &#xff08;java标注&#xff09;&#x1f415;内置注解&#x1f415;元注解 &#x1f380;对象克隆&#x1f415;如何实现克隆&#x1f415;如何实现深克…

Vue3教程

1.1 配置环境 vue官网&#xff1a; Vue.js - The Progressive JavaScript Framework | Vue.js 终端 Linux和Mac上可以用自带的终端。 Windows上推荐用powershell或者cmd。Git Bash有些指令不兼容。 安装Nodejs 安装地址&#xff1a; Node.js 安装vue/cli 打开Git Bash&#x…

C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码

1 最小代价多边形三角剖分算法 凸多边形的三角剖分是通过在非相邻顶点&#xff08;角点&#xff09;之间绘制对角线来形成的&#xff0c;这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长…

293.【华为OD机试】剩余银饰的重量(模拟和贪心算法JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

LLM春招准备(1)

llm排序 GPT4V GPT-4V可以很好地理解直接绘制在图像上的视觉指示。它可以直接识别叠加在图像上的不同类型的视觉标记作为指针&#xff0c;例如圆形、方框和手绘&#xff08;见下图&#xff09;。虽然GPT-4V能够直接理解坐标&#xff0c;但相比于仅文本坐标&#xff0c;GPT-4V在…

蓝桥杯练习题——dp

五部曲&#xff08;代码随想录&#xff09; 1.确定 dp 数组以及下标含义 2.确定递推公式 3.确定 dp 数组初始化 4.确定遍历顺序 5.debug 入门题 1.斐波那契数 思路 1.f[i]&#xff1a;第 i 个数的值 2.f[i] f[i - 1] f[i - 2] 3.f[0] 0, f[1] 1 4.顺序遍历 5.记得特判 …

Web前端---表格和表单

1.表格概述 表格标记&#xff1a;<table></table> 表格标题标记&#xff1a;<caption></caption> 表头&#xff1a;<th></th>------heading 行标记&#xff1a;<tr></tr>-----r是row 列标记&#xff1a;<td></t…

数据可视化原理-腾讯-散点图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

快速搭建Vue前端框架

快速搭建Vue前端框架 安装Vue Vue官方安装过程:https://cli.vuejs.org/zh/guide/installation.html 二.创建Vue工程 2.2 安装淘宝镜像 安装淘宝镜像&#xff08;会让你安装Vue的速度加快&#xff09;&#xff1a; npm config set registry https://registry.npm.taobao.or…

CMU 10-414/714: Deep Learning Systems --hw0

hw0 宏观上的步骤: softmax loss: 实现softmax loss代码 概念 softmax就是将结果映射到0~1之间,且所有结果相加为1(概率形式)cross-entropy loss就是计算 p ( x ) log ⁡ q ( x ) p(x)\log {q(x)} p(x)logq(x),此值可用于衡量实际输出与期望输出的距离,进而衡量预测模…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

CRMCHAT修复获取客户ip信息,地区信息

CRMCHAT修复获取客户ip信息&#xff0c;地区信息-TP源码网原因&#xff1a; 因pv.sohu.com/cityjson?ieutf-8接口已无法正确获取ip信息&#xff0c;导致后台站点统计无法正确获取用户ip信息&#xff0c;无法获取地区信息 修改 注释掉无用接口地址 修复ip信息 也可以使用&…

PTA天梯赛L1 001-010题目解析

目 录 1.L1-001 Hello World 2.L1-002 打印沙漏 3.L1-003 个位数统计 4.L1-004 计算摄氏温度 5.L1-005 考试座位号 6.L1-006 连续因子 7.L1-007 念数字 8.L1-008 求整数段和 9.L1-009 N个数求和 10.L1-010 比较大小 1.L1-001 Hello World 代码&#xff1a; #inclu…

NLP评价指标

一、分类任务常见评估&#xff1a; 准确度(Accuracy) 评估预测正确的比例&#xff0c;精确率(Precision) 评估预测正例的查准率&#xff0c;召回率(Recall) 评估真实正例的查全率。如果是多分类&#xff0c;则每个类别各自求P、R最终求平均值。 TP&#xff08;True Positives…

NLP_新闻主题分类_7(代码示例)

目标 有关新闻主题分类和有关数据.使用浅层网络构建新闻主题分类器的实现过程. 1 案例说明 关于新闻主题分类任务: 以一段新闻报道中的文本描述内容为输入, 使用模型帮助我们判断它最有可能属于哪一种类型的新闻, 这是典型的文本分类问题, 我们这里假定每种类型是互斥的, 即文…