当前位置: 首页 > news >正文

C++ 获取数组大小、多维数组操作详解

获取数组的大小

要获取数组的大小,可以使用 sizeof() 运算符:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
cout << sizeof(myNumbers);

结果:

20

为什么结果显示为 20 而不是 5,当数组包含 5 个元素时?

这是因为 sizeof() 运算符返回类型的大小(以字节为单位)。

要找出数组有多少个元素,必须将数组的大小除以它包含的数据类型的大小:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
int getArrayLength = sizeof(myNumbers) / sizeof(int);
cout << getArrayLength;

结果:

5

使用 sizeof() 循环遍历数组

然而,通过使用上面示例中的 sizeof() 方法,现在我们可以创建适用于任何大小数组的循环,这更加可持续。

与其写:

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {cout << myNumbers[i] << "\n";
}

最好写成:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < sizeof(myNumbers) / sizeof(int); i++) {cout << myNumbers[i] << "\n";
}

请注意,在 C++ 版本 11(2011)中,还可以使用“for-each”循环:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i : myNumbers) {cout << i << "\n";
}

了解不同的数组循环方式是很重要的,因为你可能在不同的程序中都会遇到它们。

多维数组

多维数组是数组的数组。

要声明一个多维数组,请定义变量类型,指定数组名称,后跟方括号,指定主数组有多少元素,然后再跟另一组方括号,表示子数组有多少元素:

string letters[2][4];

与普通数组一样,你可以使用数组文字 - 在花括号内部的逗号分隔列表。在多维数组中,数组文字中的每个元素都是另一个数组文字。

string letters[2][4] = {{ "A", "B", "C", "D" },{ "E", "F", "G", "H" }
};

数组声明中的每组方括号都会向数组添加另一个维度。像上面的数组被称为具有两个维度的数组。

数组可以具有任意数量的维度。数组的维度越多,代码就越复杂。以下数组具有三个维度:

string letters[2][2][2] = {{{ "A", "B" },{ "C", "D" }},{{ "E", "F" },{ "G", "H" }}
};

访问多维数组的元素

要访问多维数组的元素,请在数组的每个维度中指定索引号。

此语句访问 letters 数组中第一行(0)和第三列(2)的元素的值。

string letters[2][4] = {{ "A", "B", "C", "D" },{ "E", "F", "G", "H" }
};cout << letters[0][2];  // 输出 "C"

记住:数组索引从 0 开始:[0] 是第一个元素。[1] 是第二个元素,依此类推。

更改多维数组中的元素

要更改元素的值,请引用每个维度中元素的索引号:

string letters[2][4] = {{ "A", "B", "C", "D" },{ "E", "F", "G", "H" }
};
letters[0][0] = "Z";cout << letters[0][0];  // 现在输出 "Z" 而不是 "A"

循环遍历多维数组

要循环遍历多维数组,你需要为数组的每个维度使用一个循环。

以下示例输出 letters 数组中的所有元素:

string letters[2][4] = {{ "A", "B", "C", "D" },{ "E", "F", "G", "H" }
};for (int i = 0; i < 2; i++) {for (int j = 0; j < 4; j++) {cout << letters[i][j] << "\n";}
}

此示例显示如何循环遍历三维数组:

string letters[2][2][2] = {{{ "A", "B" },{ "C", "D" }},{{ "E", "F" },{ "G", "H" }}
};for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < 2; k++) {cout << letters[i][j][k] << "\n";}}
}

为什么使用多维数组?

多维数组非常适合表示网格。此示例展示了它们的实际用途。在以下示例中,我们使用多维数组表示一个小型的战舰游戏:

// 我们放置 “1” 来表示那里有一艘船。
bool ships[4][4] = {{ 0, 1, 1, 0 },{ 0, 0, 0, 0 },{ 0, 0, 1, 0 },{ 0, 0, 1, 0 }
};

// 通过这些变

量跟踪玩家击中了多少船以及玩家已经玩了多少轮

int hits = 0;
int numberOfTurns = 0;// 允许玩家继续进行,直到他们击中了所有四艘船
while (hits < 4) {int row, column;cout << "选择坐标\n";// 要求玩家输入一行cout << "选择 0 到 3 之间的行号:";cin >> row;// 要求玩家输入一列cout << "选择 0 到 3 之间的列号:";cin >> column;// 检查这些坐标是否存在船只if (ships[row][column]) {// 如果玩家击中了一艘船,将其删除并将值设置为零。ships[row][column] = 0;// 增加击中计数器hits++;// 告诉玩家他们击中了一艘船以及剩下多少艘船cout << "命中!剩下 " << (4-hits) << " 艘船。\n\n";} else {// 告诉玩家他们没击中cout << "未命中\n\n";}// 计算玩家进行了多少轮numberOfTurns++;
}cout << "胜利!\n";
cout << "你在 " << numberOfTurns << " 轮内获胜";

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

相关文章:

C++ 获取数组大小、多维数组操作详解

获取数组的大小 要获取数组的大小&#xff0c;可以使用 sizeof() 运算符&#xff1a; 示例 int myNumbers[5] {10, 20, 30, 40, 50}; cout << sizeof(myNumbers);结果&#xff1a; 20为什么结果显示为 20 而不是 5&#xff0c;当数组包含 5 个元素时&#xff1f; 这…...

苹果电脑怎么彻底删除软件 苹果电脑卸载软件在哪里 cleanmymac x怎么卸载 mac废纸篓怎么删除

苹果电脑卸载软件的方法相对直观和简单&#xff0c;尤其是对于习惯使用Mac操作系统的用户来说。以苹果MacBook Pro为例&#xff0c;以下是卸载软件的详细步骤、使用方法、注意事项与建议。 一、卸载软件的详细步骤&#xff1a; 1. 打开Mac电脑&#xff0c;进入桌面&#xff0c…...

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…...

WebGPU vs. 像素流

在构建 Bzar 之前&#xff0c;我们讨论过我们的技术栈是基于在云上渲染内容的像素流&#xff0c;还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验&#xff0c;因此在开始编写一行代码之前&#xff0c;从一开始就采取正确…...

Windows下docker-compose部署DolphinScheduler

参照&#xff1a;快速上手 - Docker部署(Docker) - 《Apache DolphinScheduler v3.1.0 使用手册》 - 书栈网 BookStack 下载源文件 地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.1 解压到指定目录&#xff0c;进入apache-dolphinscheduler-xxx-…...

微服务项目sc2024通用Base工程

1. cloud-provider-payment8001 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…...

git学习 1

打开自己想要存放git仓库的文件夹&#xff0c;右键打开git bush&#xff0c;用git init命令建立仓库 用 ls -a(表示全都要看&#xff0c;包括隐藏的)可以看到git仓库 也可以用 git clone 接github链接&#xff08;点code选项里面会给链接&#xff0c;结尾是git的那个&#xf…...

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…...

【CV】ORB算法

1. ORB算法&#xff1a; 特点&#xff1a; 实现了旋转不变性、尺度不变性和计算效率高等特性。 旋转不变性&#xff1a; 通过计算关键点周围的梯度信息&#xff0c;确定关键点的主方向。将图像旋转到关键点的主方向&#xff0c;然后再提取BRIEF描述符&#xff0c;增强了旋转不…...

【算法】Cordic算法的原理及matlab/verilog应用

一、前言 单片机或者FPGA等计算能力弱的嵌入式设备进行加减运算还是容易实现&#xff0c;但是想要计算三角函数&#xff08;sin、cos、tan&#xff09;&#xff0c;甚至双曲线、指数、对数这样复杂的函数&#xff0c;那就需要费些力了。通常这些函数的计算需要通者查找表或近似…...

QT:信号与槽

作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…...

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…...

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…...

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&am…...

Spring的 IOC和AOP编程思想

Spring的IOC&#xff08;控制反转&#xff09;编程思想 IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架的核心思想之一。在传统的编程方式中&#xff0c;我们直接通过new关键字来创建对象&#xff0c;并直接调用对象的方法。这种方式下&am…...

Qt中显示hex数据的控件

效果类似QTextEdit&#xff0c;但是显示十六进制的数据&#xff0c;比如用于显示抓取串口或者bin文件的数据等等 chunks.h #ifndef CHUNKS_H #define CHUNKS_H/** \cond docNever *//*! The Chunks class is the storage backend for QHexEdit.** When QHexEdit loads data, C…...

python web 开发 - 常用Web框架

python web 开发 - 文章目录 python web 开发 -1、关于Web开发2、常用Web框架3、开发案例3.1. 使用Flask框架创建一个简单的Web应用程序3.2. 使用tornado框架创建一个简单的Web应用程序3.3. 使用Django框架创建一个简单的待办事项应用程序 4、总结 1、关于Web开发 Web当然是网…...

设计模式——适配器模式06

适配器模式 通常在已有程序中使用&#xff0c;至少有两个类的接口不兼容时&#xff0c;让相互不兼容的类能很好地合作。例如之前系统 用的Target 接口调用&#xff0c;现在要新增第三方接口Adaptee。如何进行适配&#xff0c;面向客户端提供 调用Target接口方式达到使用Adaptee…...

【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink

1. Prop 父子单向同步 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会同步回父组件。当父组件中的数据源更改时&#xff0c;与之相关的Prop装饰的变量都会自动更新。如果子组件已经在本地修改了Prop装饰…...

Web 前端性能优化之八:前端性能检测实践

五、前端性能检测实践 1、常用的检测工具 Lighthouse、Chrome开发者工具中与性能检测相关的一些工具面板、页面加载性能分析工具PageSpeed Insights、专业的性能检测工具WEBPAGETEST等 1、Chrome 任务管理器 通过Chrome任务管理器我们可以查看当前Chrome浏览器中&#xff0…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...