参数传递方式

参数传递方式教材上大都说有两种,一种是值传递,另一种是指针传递。而后者本质上依然是值传递。

底层原理

对于值传递还是指针传递,传递的都是相应的值,只不过指针传递传递的是地址的副本,修改副本对原来数据没有任何影响,需要修改的是地址的指向。关于函数调用的执行流程可参考strcpy为何不安全

bool test(int* x) {int b = 10;//memcpy(a, &b, sizeof(int));x = &b;//*a = b;return true;
}int main()
{// std::cout << "Hello World!\n";std::string filename = "11.png";// FILE* fp = fopen(filename.c_str(), "rb");char* s = new char[20];int a = 0;int * p = &a;test(p);std::cout << a;
}

此时的运行结果是0
而将代码修改为

bool test(int* x) {int b = 10;//memcpy(a, &b, sizeof(int));//x = &b;*x = b;return true;
}

此时的运行结果是10,也就是修改后的内容。
两段代码的区别:第一段代码 x = &b;对应的汇编代码是,修改的是x的值得,对原本的数据a没有任何影响。

00B62F26  lea         eax,[b]    //将b所指向的内存地址(而不是b的值)加载到eax寄存器中
00B62F29  mov         dword ptr [x],eax  //将 eax 寄存器中的32位(双字)值存储到 x 所指向的内存地址中

而*x = b;对应的汇编代码是,修改可地址的指向。

00492F1C  mov         eax,dword ptr [x]   //将x的值赋值给eax,x的值是a对应的地址
00492F1F  mov         ecx,dword ptr [b]  //将b内存中的值复制给ecx
00492F22  mov         dword ptr [eax],ecx  //将ecx的值赋值给eax指向的内存中的值

char *传值问题

bool test(int* x, char * str) {char* p = new char[200];memset(p, 0, 200);p[0] = 'H';p[1] = 'E';p[2]  = 'l';p[3] = '\0';int len = strlen(p);strcpy_s(str, strlen(p)+1, p);delete(p);return true;
}

不能使用str = p;这种只是修改副本的值,对原来的char*没有任何影响。

list传值问题

c++中list传递需要使用指针或者引用,才能改变原本的值。

bool test_list(list<string> *testList) {testList->push_back("3");return false;
}

调用方:

List<String> li;
li.push_back("1");
li.push_back("2");
test_list(&li);

或者

list<string> *li =  new std::list<string>();
li->push_back("1");
li->push_back("2");
test_list(li);

这两个语句都是用于创建一个存储字符串的列表。主要的区别在于:

  1. 数据类型的差异:前者使用的是C++标准库中的list容器,后者是使用指针创建的动态内存。

  2. 声明方式的差异:前者是一般的对象声明方式,后者是通过new运算符动态地分配内存并返回一个指向该内存区域的指针。

  3. 内存管理的差异:前者是一个自动管理内存的对象,当程序执行到其作用域结束或者该对象被销毁时,内存会自动释放;后者需要手动使用delete运算符释放动态分配的内存。

因此,建议在使用时考虑到实际情况,选择合适的声明方式和内存管理方式。如果只是需要临时存储字符串,并且不想手动管理内存,可以选择前者;如果需要在程序运行期间动态地分配和释放内存,并且需要手动管理内存,可以选择后者。

c#中的list传递,不需要指针或者引用。像java之类的语言类似,这也是java等语言比c相对简单的原因。

List<String> li = new List<String>();
li.Add("1");
li.Add("2");
await test(li);
Console.WriteLine(li);
Task test(List<String> list_test)
{list_test.Add("3");return Task.CompletedTask;}

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

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

相关文章

DGL在异构图上进行消息传递

异构图是包含不同类型的节点和边的图。不同类型的节点和边常常具有不同类型的属性。这些属性旨在刻画每一种节点和边的特征。在使用图神经网络时&#xff0c;根据其复杂性&#xff0c; 可能需要使用不同维度的表示来对不同类型的节点和边进行建模。 异构图上的消息传递可以分为…

ProtoBuf的使用

目录 1.创建.proto文件 1.1文件规范 1.2添加注释 1.3指定proto3语法 1.4package声明符 1.5定义消息(message) 1.6定义消息字段 2.编译contacts.proto文件 3.序列化与反序列化的使用 1.创建.proto文件 1.1文件规范 • 创建.proto文件时&#xff0c;⽂件命名应该使用全…

利用互斥锁解决缓存击穿问题

核心思路&#xff1a;相较于原来从缓存中查询不到数据后直接查询数据库而言&#xff0c;现在的方案是 进行查询之后&#xff0c;如果从缓存没有查询到数据&#xff0c;则进行互斥锁的获取&#xff0c;获取互斥锁后&#xff0c;判断是否获得到了锁&#xff0c;如果没有获得到&am…

DNS如何在Windows NIC配置多个DNS服务器时完成DNS解析查询

使用多个 DNS 服务器 IP 配置 DNS 客户端会增加 DNS 基础结构的容错。所以建议给Windows客户端使用多个 DNS 服务器。 文章目录 什么是DNS&#xff1f;在 NIC 上配置单个 DNS 服务器时&#xff0c;DNS 客户端的解析过程在 NIC 上配置两个 DNS 服务器时&#xff0c;DNS 客户端的…

【Docker】从零开始:3.Docker运行原理

【Docker】从零开始&#xff1a;3.Docker运行原理 Docker 工作原理Docker与系统的关系Docker平台架构图解 Docker 工作原理 Docker与系统的关系 Docker 是一个 Client-Server 结构的系统&#xff0c;Docker 守尹进程运行在王机上&#xff0c; 然后通过 Socket 连接从各尸端坊…

Vue3-shallowRef 和 shallowReactive函数(浅层次的响应式)

Vue3-shallowRef 和 shallowReactive函数&#xff08;浅层次的响应式&#xff09; shallowRef函数 功能&#xff1a;只给基本数据类型添加响应式。如果是对象&#xff0c;则不会支持响应式&#xff0c;层成也不会创建Proxy对象。ref和shallowRef在基本数据类型上是没有区别的…

第1关:图的邻接表存储及求邻接点操作

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;要求从文件输入顶点和边数据&#xff0c;包括顶点信息、边、权值等&#xff0c;编写程序实现以下功能。 1&#xff09;构造图G的邻接表和顶点集&#xff0c;即图的存储结构为邻接表。 …

手把手入门MO | 如何使用SeaTunnel将数据写入MatrixOne

1 概述 SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;专注于海量数据&#xff08;包括离线和实时数据&#xff09;同步和转化。MatrixOne 支持使用 SeaTunnel 从其他数据库同步数据&#xff0c;可以稳定高效地处理数百亿条数据。 本文档将介绍如何使用 …

SpringCloud原理-OpenFeign篇(二、OpenFeign包扫描和FeignClient的注册原理)

文章目录 前言正文一、从启动类开始二、EnableFeignClients 的源码分析三、Import FeignClientsRegistrar 的作用四、FeignClientsRegistrar#registerFeignClients(...)五、饥饿注册&懒注册 FeignClientsRegistrar#registerFeignClient(...)六、通过Holder真正注册beanDefi…

SSM框架(一):Spring 容器

文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例&#xff1a;配置数据库4.…

「编程学习书籍总结」提升个人能力从读书开始

✍️作者简介&#xff1a;码农小北&#xff08;专注于Java、Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、…

CHINTERGEO2023中国测绘地理信息技术装备展览会,大势智慧在3010展台期待您的莅临!

11月27日-11月29日 CHINTERGEO2023中国测绘地理信息技术装备展览会 二层-HALL3展厅-3010 大势智慧携符合信创要求的实景三维软硬件全流程解决方案 为您带来一场全国产、真安全的实景三维新型智能测绘装备盛宴 期待您的莅临&#xff01;

unity C#设置文件为不可见

unity C#设置文件为不可见 /// ///设置文件为隐藏// /// using UnityEngine; using System.IO;public class SetFolderInvisible : MonoBehaviour {private void Start(){string folderPath "Qi/Video";// 将文件夹属性设置为隐藏和系统SetFolderAttributes(folder…

C#使用MaxMind.GeoIP2数据库查询当前ip地址

GeoLite2-City.mmdb下载 因为比较简单&#xff0c;直接上代码&#xff0c;代码展示获取ip地址的国家和城市信息 using MaxMind.GeoIP2; using MaxMind.GeoIP2.Model; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Sy…

超级会员卡积分收银系统源码+会员卡+积分商城+多门店系统 附带完整的搭建教程

时代在发展&#xff0c;商家对于会员管理、积分管理、收银管理以及多门店管理的需求日益增长。为了满足这些需求&#xff0c;开发一款功能全面、易于使用和管理的超级会员卡积分收银系统变得至关重要。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.会员管…

STM32 -Bin/Hex文件格式解析

文章目录 1. 概述2. Hex文件2.1 格式解析2.2 数据类型2.3 举例解析2.4 合并两个Hex文件方法 3. Bin文件3.1 生成方式3.2 合并多个Bin文件方法3.3 打开Bin文件方式3.4 和Hex文件比较 4 总结 1. 概述 Hex文件&#xff1a;它是单片机和嵌入式工程编译输出的一种常见的目标文件格式…

https想访问本地部署的http://localhost接口

情况说明&#xff1a; 网址是https的&#xff0c;想访问java本地启的一个程序接口http://localhost:8089 解决办法 java程序加上

智能高效的转运机器人,为物流行业注入新动力

在当今社会&#xff0c;随着科技的不断发展&#xff0c;机器人已经逐渐融入到我们的生活中。其中&#xff0c;转运机器人作为物流行业的新秀&#xff0c;正以其高效、智能的特点&#xff0c;引起了广泛的关注。 转运机器人&#xff0c;是指能够自主进行物品搬运和运输的机器人…

iPhone的实时照片不能直接查看,但有不少替代方法可以查看

​苹果在iPhone 6s和iPhone 6s Plus上推出了实时照片(livp)功能,该功能也出现在最新的iPhone中。正如你所知,实时照片功能是电影和静态图像的混合。也就是说,实时照片既不是照片也不是视频。 当你在iPhone上拍摄实时照片时,iOS会创建一个MOV文件和一个JPEG文件。 如果你…

如何利用CHATGPT写主题文章

问CHAT&#xff1a;新课标下畅言智慧课堂助力小学生量感培养&#xff0c;拟解决的关键问题 CHAT回复&#xff1a; 1. 确定智慧课堂在新课标下的正确应用方法&#xff1a;新课标对教育方法、内容等提出了新的要求&#xff0c;需要探讨如何将智慧课堂与新课标相结合&#xff0c;…