C/C++中函数参数传递详解

学习QT之QString详解 学习QT之QString详解 QString类保存16位Unicode值,提供了丰富的操作、查询和转换函数。该类还进行了使用隐式共享、高效的内存分配策略等多方面的优化。 一、字符串常用操作 字符串的操作: 函数 说明 str.append(“xxx”) 在一个字符串的末尾追加另一个字符串 str.sprintf("%s",“HelloWorld”) 给字符串赋值为HelloW... 阅读详情

http://www.cnblogs.com/Romi/archive/2012/08/09/2630014.html点击打开链接 

C或C++中函数的参数传递包括:值传递、指针传递、引用传递这三种方法,这三种方法在《程序员面试宝典》中说的很明了,这里加上我自己的理解。

    先看源代码,编译环境是vc6.0,因为调试方便。功能是要实现a和b值的交换。

复制代码
 1 // test.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 
 7 using namespace std;
 8 
 9 //值传递
10 void swap1(int p,int q)
11 {
12     int temp;
13     temp=p;
14     p=q;
15     q=temp;
16 }
17 
18 //指针传递,函数体内只有指针值的变化
19 void swap2(int *p,int *q)
20 {
21     int temp;
22     temp=*p;
23     *p=*q;
24     *q=temp;
25 }
26 
27 //指针传递,函数体内只有指针的变化
28 void swap3(int *p,int *q)
29 {
30     int *temp;
31     temp=p;
32     p=q;
33     q=temp;
34 }
35 
36 //引用传递
37 void swap4(int &p,int &q)
38 {
39     int temp;
40     temp=p;
41     p=q;
42     q=temp;
43 }
44 
45 int main()
46 { 
47     int a=1,b=2;
48     swap1(a,b);
49     //swap2(&a,&b);
50     //swap3(&a,&b);
51     //swap4(a,b);
52     cout<<a<<"  "<<b<<endl;
53     return 0;
54 }
复制代码

共有四个函数,其中有两个是指针传递,但函数体内的实现不一样。下面具体分析

1.值传递

swap1函数实现的值传递,值传递传递的是实际参数的一个副本,如果对这句话不理解,那一步步调试看下内存分配情况。

执行到48行时,a和b的情况如下

接着进入swap1函数体内,如下所示

可以看到的是,p和q的地址和a与b的地址不一样,只是把a和b的值拷贝过去了,在swap1中对p和q操作只是对临时分配的栈中内容进行操作,函数执行完后形参就消失了,对原来的a和b不产生任何影响。所以swap1不能完成交换a和b值的功能

2.指针传递

swap2和swap3都是指针传递,swap2函数体内交换了p和q指向地址的值,swap3函数体内交换了p和q指向的地址。

先说swap2,进入swap2函数体内,如下所示

可以看到,形参指针p和q指向的是a和b的地址,而不是像值传递那样将实参的值拷贝到另外分配的地址中,运行到函数尾时,如下图

可以看到、指针p和q指向的地址没变,但地址中的值变了,也即a和b地址中的变了,就是a和b的值成功交换,继续调试可以看到正确的结果,如下图

再来看swap3,swap3运行到函数尾时的情况如下

可以看到p和q交换了地址,但最后函数执行完后的结果又如下所示

a和b的值并未交换,这是为什么呢?

swap3中,形参p和q会保存在栈中,p指向a的地址,q指向b的地址,使用temp指针完成了p和q的地址交换,即p指向b的地址,q指向了a的地址,但a和b地址中的值并未发生变化,这与swap2不同,swap2中是p指向的地址中的值(就是a)与q指向的地址中的值(b)交换,所以swap2执行完后a和b的值是交换了的。

3.引用传递

引用传递时,对形参的操作等同于对实参的操作,即传递的不会是实参的副本,而就是实参,进入swap4函数体内如下所示

看到这个内存分配,很明了了吧。最后会交换a和b的值。

到此,完了。当然函数参数也可以是指向指针的指针,这也是很常见的,但通常用在需要动态分配内存的地方以避免内存泄露。在使用cuda时调用cudaMalloc其参数就是这样,指向指针的指针。而malloc、CPLMolloc、new这些是通过返回值传递分配的动态内存的,自然是不会出现内存泄露的,这个后面再说。

函数参数传变量和传引用,QString a 和QString &a 有什么区别,哪种更好 2. `QString &a`:在这种情况下,参数`a`是一个引用,这意味着函数将直接访问原始字符串,而不是创建副本。因此,对参数`a`的任何更改将直接影响原始字符串。但是,由于直接修改了原始数据,因此这种方式需要小心处理,以避免意外修改了不应该修改的数据。1. `QString a`:在这种情况下,参数`a`是一个值,函数将创建参数的一个副本。如果你需要保留原始字符串不变,那么使用`QString a`更好。如果你需要修改原始字符串,并且希望避免创建副本的开销,那么使用`QString &a`更好。 阅读详情

相关推荐

【飞腾平台安装windows arm 11系统】

本文提供国内的百度网盘链接供下载使用:链接: https://pan.baidu.com/s/1_cftVdoX40k0M6zVTmFq8Q?3)快速迁移虚拟机技巧:如果是迁移已经安装好的虚拟机的使用场景,除了导出镜像外,也可直接复制安装好虚拟机的整个文件夹到指定的存储目录,选定好其中的任意qcow2文件后即可快速启动。可在飞腾软件平台点击网盘链接获取对应系统的deb包(麒麟和统信)以及phyvirt·app,下载地址:https://www.phytium.com.cn/developer/

firefly_cv的博客 8942

C++ Qt QString类用法介绍

是 Qt 框架中的一个重要类,用于处理 Unicode 字符串。它提供了大量的功能,方便开发者处理、查询和操作字符串。这些是QString类中用于裁剪和截取字符串的一些常用方法。您可以根据需要选择适合您的情况的方法。建议查看 Qt 官方文档以获取更多详细的方法和描述。:去除字符串中多余的空格字符,并将连续的空格字符替换为一个空格。:根据指定的分隔符,截取字符串的一部分。:去除字符串开头和结尾的空格字符。:返回从指定位置开始的n个字符。:返回字符串的前n个字符。:返回字符串的后n个字符。

琅嬛福地 927

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

C++引用小知识点

C++函数传参的时候发现一个问题 //弹出文件对话框 QString filepath=QFileDialog::getOpenFileName(this,"我的文件对话框"); //创建QFile对象 QFile myfile(filepath); //打开文件 myfile.open(QIODevice::ReadWrite); //读取文件内容 QByteArray buf=myfile.readAll(); //把读取

HZHejo的博客 1821

【Kingbase人大金仓】授权文件更换

本文介绍了金仓数据库授权文件更换的步骤:1.通过ksql或客户端工具查询数据库版本;2.在官网下载对应版本的license.bat文件;3.替换前先备份原授权文件(使用tar命令压缩),再用新文件覆盖原文件。注意事项包括:版本号需严格对应,授权文件通常位于安装目录下,可使用find命令查找具体位置。操作需谨慎,建议先备份原文件以便恢复。

qq_34463511的博客 3469

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站)同时连接。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 8902

C/C++中函数参数传递详解(从内存的分析)

C/C++中函数参数传递详解 Posted on 2012-08-09 11:59 romi 阅读(5217) 评论(2) 编辑 收藏    昨天看了内存管理的有关内容,有一点了解,但不是很深入,发现之前写代码时有很多细节问题没有注意到,只知道这样做可以实现功能,却不知道为什么可以这样,对于采用自己的方法造成的隐患也未知,更不晓得还有其他方法可以实现,我们知道C++强大的一个

cquptzzq的专栏 984

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 101

【C++】C/C++中函数参数传递详解

对比两种传递方式: 按值传递变量,需要有复制实参内存以初始化形参,所以这将带来一些开销。在讨论简单变量时,内置的类型(如int、float)的开销可以忽略不计,但对于大型的对象(如代表整个3D世界的大对象)来说,复制的代价会很高昂。C语言也提供了一种指针式的“按值传递”,也可以解决传递大对象时代价过高的问题,然而“指针”由于安全问题一直为众多程序员所诟病。故而C++又提供了一个按引用传递。

xn_28的专栏 1101

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 912

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250
上一篇: Android异步加载网络图片
下一篇: Android自定义View之一:初探实例
起风啰
博客等级 码龄16年 30粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值