C++以数组作为参数,传递数组地址

news2024/11/19 20:29:05

文章目录

  • 函数如何使用指针来处理数组
  • 将数组作为参数意味着什么
    • 数组名和指针对应是好的吗?
  • 参考资料

函数如何使用指针来处理数组

在大多数情况下,C++和 C 语言一样,也将数组名视为指针。
C++将数组名解释为其第一个元素的地址:

cookies == &cookies[0] // array name is address of first element

该规则有一些例外。
首先,数组声明使用数组名来标记存储位置;
其次,对数组名使用 sizeof 将得到整个数组的长度(以字节为单位):
第三,将地址运算符&用于数组名时,将返回整个数组的地址,例如&cookies 将返回一个32 字节内存块的地址(如果int长4字节)
执行下面的函数调用:

int sum = sum arr(cookies, ArSize);

其中,cookies 是数组名,而根据 C++规则,cookies 是其第一个元素的地址,因此函数传递的是地址由于数组的元素的类型为 int,因此 cookies 的类型必须是 int 指针,即 int*。这表明,正确的函数头应该是这样的:

int sum arr(int * arr, int n) // arr = array name, n = size

其中用 int*arr 替换了 int arr []。这证明这两个函数头都是正确的。
因为在 C++中,当(且仅当)用于函数头或函数原型中,int *arr 和 int arr []的含义才是相同的。它们都意味着 arr 是个int 指针。然而,数组表示法 (int arr[]) 提醒用户,arr 不仅指向 int,还指向 int 数组的第一个int。
当指针指向数组的第一个元素时,使用数组表示法:而当指针指向一个独立的值时,使用指针表示法。

别忘了,在其他的上下文中,int*arr 和 int arr []的含义并不相同。例如,不能在函数体中使用 int tip[ ]来声明指针。

鉴于变量 arr 实际上就是一个指针,函数的其余部分是合理的。同数组名或指针一样,也可以用方括号数组表示法来访问数组元素。无论 arr 是指针还是数组名,表达式 arr [3]都指的是数组的第 4个元素。就目前而言,记住下面两个恒等式,将不会有任何坏处:

arr[i] == *(ar + i)// values in two notations
&arr[i] == ar + i// addresses in two notations

记住,将指针(包括数组名)加 1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。对于遍历数组而言,使用指针加法和数组下标是等效的。

将数组作为参数意味着什么

在这里插入图片描述
在这里插入图片描述

函数调用 sum_arr(coolies,ArSize)将 cookies 数组第一个元素的地址和数组中的元素数目传递给 sum_arr()函数。
sum_arr()函数将 cookies 的地址赋给指针变量arr,将ArSize 赋给 int 变量 n。这意味着,程序实际上并没有将数组内容传递给函数,而是将数组的位置(地址)包含的元素种(类型)以及素数目(n 变量)提交给函数:
在这里插入图片描述

有了这些信息后函数便可以使用原来的数组。传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。实际上,这种区别并不违反 C++按值传递的方法,sum_arr()函数仍传递了一个值,这个值被赋给一个新变量,但这个值是一个地址,而不是数组的内容。

数组名和指针对应是好的吗?

确实是一件好事。将数组地址作为参数可以节省复制整个数组所需的时间和内存。如果数组很大,则使用拷贝的系统开销将非常大;程序不仅需要更多的计算机内存,还需要花费时间来复制大块的数据。另一方面,使用原始数据增加了破坏数据的风险。

参考资料

《C++ PRIME PLUS》

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

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

相关文章

YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型

YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 制作自己的数据集训练自己的数据集创建自己数据集的yaml文件football.yaml文件内容 进行训练进行验证进行预测 数据集获取参考文献 …

NAS 扩容简明指南:使用各种外设给 NAS 们扩容

说起来有趣,NAS 除了“不同设备共享存储”这个功能之外,最重要的功能就是为设备扩容,但是 NAS 自己的存储容量不够了,又该如何。 ​这篇文章分享下我目前使用外设给 NAS 扩容的思路,如何以相对低的成本来获取更大的容…

IPV6网络技术详细介绍

无状态和有状态并不是相互对立的,他们可以同时存在,也就是一张网卡上可以同时出现通过RA生成的IP以及通过DHCPv6获得的IP。 从图中可以看到,顺序为: 1、Stateless自动配置“链路本地地址”2、Stateless自动配置“全球地址”&…

mysql基础 --子查询

文章目录 子查询 子查询 一个查询语句,嵌套在另一个查询语句内部;子查询先执行,其结果被外层主查询使用;子查询放入括号内;子查询放在比较条件的右侧;子查询返回一条,为单行子查询;…

普华永道于进博会首发“企业数据资源会计处理一体化平台”

11月6日,在第六届中国国际进口博览会上,普华永道发布企业数据资源会计处理一体化平台(英文名为Data Accounting Platform,简称DAP)。该产品以普华永道“五步法”数据资源入表路径为理论依据,依托多年来普华…

c: CLion 2023.1.1

/** # encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看:https://www.learnc.net/c-data-structures/c-linked-list/ # 描述:https://blog.jetbrains.com/clion/2016/05/keep-your-code-documented/ # Author : geovindu,Geovin Du 涂…

2023年10 种用于最佳稳定扩散最佳方案

在过去的一年里,您可能已经看到了很多关于 ChatGPT 和其他 AI 自动纹理的新闻。但是,页面(或屏幕)上的文字远非现代组织和设计师使用人工智能的唯一方式。Stable Diffusion 等工具可帮助您创建令人惊叹的 AI 图像,供个…

CS224W5.1——消息传递和节点分类

从之前的文中,学习了如何使用图表示学习进行节点分类。在这节中,将讨论另一种方法,消息传递。将引入半监督学习,利用网络中存在的相关性来预测节点标签。其中一个关键概念是集体分类,包括分配初始标签的局部分类器、捕…

数据库安全:InfluxDB 未授权访问-Jwt验证不当 漏洞.

数据库安全:InfluxDB 未授权访问-Jwt验证不当 漏洞. InfluxDB 是一个开源分布式时序,时间和指标数据库。其数据库是使用 Jwt 作为鉴权方式,在用户开启认证时,如果在设置参数 shared-secret 的情况下,Jwt 认证密钥为空…

无人机航迹规划MATLAB:七种优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

Docker修改容器内部文件的三种方法

为啥要记录呀 今天在修改Docker内部文件的时候,安装vim居然失败了,在执行apt-get update时一直有几个404,解决无果,最后放弃安装vim,将文件拷贝出来修改,然后再拷贝到docker内部。记录一下如何修改Docker内…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】(web+app+h5+小程序)

前言: ​​大家好,我是阿里测试君。 最近很多小伙伴都在面试,但是对于自己的项目经验比较缺少。阿里测试君再度出马,给大家找了一个非常适合练手的软件测试项目,此项目涵盖web端、app端、h5端、小程序端,…

现在个人想上架微信小游戏已经这么难了吗...

点击上方亿元程序员关注和★星标 引言 大家好,最近我突然想起来我还有一款微信小游戏还没有上架,于是捣鼓了一天把游戏完善了一下,然后准备提交审核,却发现异常的艰难… 1.为什么难? 相信大家都大概知道&#xff0c…

【Github】git clone命令下载文件中途停止

方法一: 使用git clone命令下载github上的源代码时,有时文件下载到一定百分比时就停止不动, 这是因为我们所下载的文件很大,超过了git预先分配的Postbuffer容量,所以一直卡在那里。可以使用以下命令查看当前Postbuffe…

Docker和镜像安装

2.1、Docker安装 2.1.1、检查环境 Docker运行环境要求系统为64位、Linux系统内核版本为 3.8以上 查看自己虚拟机的内核: 2.1.2、搭建gcc环境(gcc是编程语言译器) yum -y install gcc yum -y install gcc-c 2.1.3、安装需要的软件包 yu…

合成数据如何改变制造业

人工智能正在工厂车间使用,以识别生产线中的低效率。它可以有效地预测设备何时需要维护,以避免停机。人工智能被用于发现产品中的缺陷。 为了完成所有这些工作,使用从人工智能应该学习的过程中收集的数据来创建或训练模型。对于缺陷识别&…

音频——解析 PCM 数据

文章目录 生成 PCM 数据16bit16bit mono16bit stereo16bit 4 channel16bit 8 channel24bit解析 PCM 数据解析 24bit 数据程序源码生成 PCM 源码解析 PCM 源码生成 PCM 数据 16bit 16bit mono int 48k_16bit_modo[] = {0, 4276, 8480, 12539, 16383, 19947, 23169, 25995, 28…

Cross-Origin跨站问题详解(跨站请求、跨站cookie)

背景:我部署frontend和backend到两个不同的docker容器,前端路径为http://localhost:3000,后端路径为http://localhost:4000。我设置了用户登录功能,并使用cookie进行session管理。当我的前端登录时,创建了一个session&…

【LeetCode笔试题】27.移除元素

问题描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…

华为防火墙vrrp+hrp双机热备主备备份(两端为交换机)

默认上下来全两个vrrp主都是左边 工作原理: vrrp刚开机都是先initialize状态,然后切成active或standb状态。 hrp使用18514端口,且用的单播,要策略放行,由主设备发hrp心跳报文 如果设备为acitve状态时自动优先级为65…