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

C++基础篇(二)基本数组及示例

目录

  • 一、一维数组
    • 1、定义和初始化
    • 2、访问和修改
    • 3、元素逆置和冒泡排序
  • 二、二维数组(用指针进行访问与修改)
    • 1、定义和初始化
    • 2、访问与修改
  • 三、更高维度的数组
    • 1、三维数组
    • 2、高维数组

一、一维数组

1、定义和初始化

在 C++ 中,可以使用下面的语法定义一个一维数组:

type arrayName [ arraySize ];

其中,type 是数组元素的类型,arrayName 是数组的名称,arraySize 是数组中元素的数量。

例如,下面的代码定义了一个包含 5 个整数的一维数组:

int numbers[5];

在定义数组时,可以同时初始化数组中的元素。例如:

int numbers[5] = {1, 2, 3, 4, 5};

也可以只初始化部分元素,未初始化的元素将被自动设置为默认值(通常为 0)。例如:

int numbers[5] = {1, 2}; // 等价于 {1, 2, 0, 0, 0}

如果在定义数组时不指定数组大小,则编译器会根据初始化元素的数量自动确定数组大小。例如:

int numbers[] = {1, 2, 3, 4, 5}; // 等价于 int numbers[5] = {1, 2, 3, 4, 5};

2、访问和修改

在定义了一个一维数组之后,可以通过下标运算符 [] 访问或修改数组中的元素。下标从 0 开始,最大值为 arraySize - 1。例如:

int numbers[5] = {1, 2, 3, 4, 5};
std::cout << numbers[0] << std::endl; // 输出第一个元素
numbers[1] = 42; // 修改第二个元素

注意,在访问或修改数组中的元素时,必须确保下标在合法范围内。否则会发生未定义行为。

除了使用下标运算符访问或修改数组中的元素外,还可以使用指针进行操作。因为在 C++ 中,数组名可以理解为指向数组第一个元素的指针,直接输出数组名是数组的首元素地址(16进制)。例如:

int numbers[5] = {1, 2, 3, 4, 5};
std::cout << numbers << std::endl; // 输出数组首地址
std::cout << *numbers << std::endl; // 输出第一个元素
*(numbers + 1) = 42; // 修改第二个元素

此外,在 C++ 中还可以使用范围 for 循环遍历一维数组中的所有元素。例如:

int numbers[5] = {1, 2, 3, 4, 5};
for (int n : numbers) {std::cout << n << std::endl; // 输出每个元素
}

3、元素逆置和冒泡排序

①元素逆置
用双指针算法将其中的元素逆置。

#include <iostream>int main() {int numbers[] = {3,2,1,4,5};int size = sizeof(numbers) / sizeof(int);//将整个数组占用内存大小除单个数组内存大小得到数组长度// 双指针算法int* left = numbers;int* right = numbers + size - 1;while (left < right) {int temp = *left;//暂存值左值*left = *right;//将较大值赋给左边元素*right = temp;//较小值赋给右边元素left++;right--;}// 输出结果for (int n : numbers) {std::cout << n << " ";}std::cout << std::endl;return 0;
}

②冒泡排序

#include <iostream>int main() {int numbers[] = {4, 5, 2, 31};int size = sizeof(numbers) / sizeof(int);// 冒泡排序for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (numbers[j] > numbers[j + 1]) {int temp = numbers[j];numbers[j] = numbers[j + 1];numbers[j + 1] = temp;}}}// 输出结果for (int n : numbers) {std::cout << n << " ";}std::cout << std::endl;return 0;
}

二、二维数组(用指针进行访问与修改)

1、定义和初始化

二维数组是由多个一维数组组成的数组。在 C++ 中,可以使用下面的语法定义一个二维数组:

type arrayName [ xSize ][ ySize ];

其中,type 是数组元素的类型,arrayName 是数组的名称,xSize 和 ySize 分别表示二维数组中第一维和第二维的大小。

例如,下面的代码定义了一个包含两行三列整数的二维数组:

int matrix[2][3];

与一维数组类似,在定义二维数组时也可以同时初始化其中的元素。例如:

int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};

也可以只初始化部分元素,未初始化的元素将被自动设置为默认值(通常为 0)。例如:

int matrix[2][3] = {{1},{4}
}; // 等价于 {{1, 0, 0}, {4, 0, 0}}

如果在定义二维数组时不指定第一维和第二维的大小,则编译器会根据初始化元素的数量自动确定它们。例如:

int matrix[][3] = {{1, 2, 3},{4, 5, 6}
}; // 等价于 int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};

2、访问与修改

在定义了一个二维数组之后,可以通过两个下标运算符 [][] 访问或修改其中的元素。第一个下标表示行号(从上到下),第二个下标表示列号(从左到右)。例如:

int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};
std::cout << matrix[0][1] << std::endl; // 输出第一行第二列的元素
matrix[1][2] = 42; // 修改第二行第三列的元素

注意,在访问或修改二维数组中的元素时,必须确保下标在合法范围内。否则会发生未定义行为。

除了使用下标运算符访问或修改二维数组中的元素外,还可以使用指针进行操作。因为在 C++ 中,二维数组名实际上是一个指向一维数组的指针,进行解引用后得到的是一个一维数组首元素的指针,再次进行解引用得到的才是首元素的值。例如:

int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};
std::cout << **matrix << std::endl; // 输出第一行第一列的元素
*(*(matrix + 1) + 2) = 42; // 修改第二行第三列的元素

此外,在 C++ 中还可以使用嵌套循环遍历二维数组中的所有元素。例如:

int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};
for (auto& row : matrix) {for (int n : row) {std::cout << n << std::endl; // 输出每个元素}
}

三、更高维度的数组

1、三维数组

三维数组是由多个二维数组组成的数组。下面的代码定义了一个包含两个二维数组的三维数组,每个二维数组都包含两行三列整数:

int matrix[2][2][3] = {{{1, 2, 3},{4, 5, 6}},{{7, 8, 9},{10, 11, 12}}
};
std::cout << matrix[0][1][2] << std::endl; // 输出第一个二维数组中第二行第三列的元素
matrix[1][0][1] = 42; // 修改第二个二维数组中第一行第二列的元素//遍历三维数组
for (auto& twoDArray : matrix) {for (auto& row : twoDArray) {for (int n : row) {std::cout << n << " ";}}
}

三维数组名实际上是一个指向二维数组的指针。对它进行一次解引用操作时,将会得到一个二维数组名,它也是一个指针,指向一维数组。再次对它进行解引用操作时,会得到一个一维数组名,它也是一个指针,指向一维数组首元素。最后对它进行解引用操作,将会得到一维数组首元素的值,因此这里需要三个解引用运算符。

//用指针来访问和修改三维数组
std::cout << *(*(*(matrix + 1) + 0) + 1) << std::endl; // 输出第二个二维数组中第一行第二列的元素
*(*(*(matrix + 1) + 0) + 1) = 42; // 修改第二个二维数组中第一行第二列的元素

在上面的代码中,matrix 是一个指向二维数组 {{1, 2, 3}, {4, 5, 6}} 的指针。对它进行一次解引用操作并加上偏移量 1 后,将会得到另一个二维数组名 {{7, 8, 9}, {10, 11, 12}},再次对它进行解引用操作并加上偏移量 0 ,得到一个一维数组名 {7, 8, 9}。最后对它进行解引用操作并加上偏移量 1 后,得到一维数组中第二个元素的值 8

2、高维数组

四维数组可以看成由多个三维数组所组成的数组,依此类推,高维数组可以看成由多个低一维数组所组成的数组。

相关文章:

C++基础篇(二)基本数组及示例

目录 一、一维数组1、定义和初始化2、访问和修改3、元素逆置和冒泡排序 二、二维数组&#xff08;用指针进行访问与修改&#xff09;1、定义和初始化2、访问与修改 三、更高维度的数组1、三维数组2、高维数组 一、一维数组 1、定义和初始化 在 C 中&#xff0c;可以使用下面的…...

C++多态练习题

目录 一.习题1&#xff1a; 解决下列测试代码所出现的问题 测试用例1&#xff1a; 测试用例2&#xff1a; 代码改进&#xff1a; 习题1总结&#xff1a; 二.习题2. 求类对象的大小 三.习题3&#xff1a; 代码解析 &#xff1a; 解析图&#xff1a; 四.习题4&#xff…...

ELD透明屏在智能家居中有哪些优点展示?

ELD透明屏是一种新型的显示技术&#xff0c;它能够在不需要背光的情况下显示图像和文字。 ELD透明屏的原理是利用电致发光效应&#xff0c;通过在透明基板上涂覆一层特殊的发光材料&#xff0c;当电流通过时&#xff0c;发光材料会发出光线&#xff0c;从而实现显示效果。 ELD…...

第十三章 利用PCA简化数据

文章目录 第十三章 利用PCA简化数据13.1降维技术13.2PCA13.2.1移动坐标轴 13.2.2在NumPy中实现PCA13.3利用PCA对半导体制造数据降维 第十三章 利用PCA简化数据 PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0…...

开源中文分词Ansj的简单使用

ANSJ是由孙健&#xff08;ansjsun&#xff09;开源的一个中文分词器&#xff0c;为ICTLAS的Java版本&#xff0c;也采用了Bigram HMM分词模型&#xff1a;在Bigram分词的基础上&#xff0c;识别未登录词&#xff0c;以提高分词准确度。 虽然基本分词原理与ICTLAS的一样&#…...

251_多线程_创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像

举一个更丰富的例子来说明多线程的用法。 我们将创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像。 这个例子可以更好地展示多线程并发处理的优势。 假设有一个函数 processImageSection,它会对图像的一个特定区域进…...

[吐槽Edge浏览器]关于Edge浏览器的闪退问题

这个浏览器嘛&#xff0c;在谷歌浏览器不能页面翻译后&#xff0c;一直是用的高高兴兴的&#xff0c;可突然有一天&#xff0c;Edge浏览器页面加载不出来了。 很慌&#xff0c;大概就是页面崩溃、加载失败什么的都出现过。 修了整整一天&#xff0c;不知道原因在哪&#xff0c;…...

数据包在网络中传输的过程

ref: 【先把这个视频看完了】&#xff1a;数据包的传输过程【网络常识10】_哔哩哔哩_bilibili 常识都看看 》Ref&#xff1a; 1. 这个写的嘎嘎好&#xff0c;解释了为啥4层7层5层&#xff0c;还有数据包封装的问题:数据包在网络中的传输过程详解_数据包传输_张孟浩_jay的博客…...

Acwing.875 快速幂

题目 给定n组ai , bi, pi&#xff0c;对于每组数据&#xff0c;求出akimod pi的值。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含三个整数ai , bi,pi。输出格式 对于每组数据&#xff0c;输出一个结果&#xff0c;表示aibimod pi的值。 每个结果占一行。 数…...

【决策树-鸢尾花分类】

决策树算法简介 决策树是一种基于树状结构的分类与回归算法。它通过对数据集进行递归分割&#xff0c;将样本划分为多个类别或者回归值。决策树算法的核心思想是通过构建树来对数据进行划分&#xff0c;从而实现对未知样本的预测。 决策树的构建过程 决策树的构建过程包括以…...

类与对象(中--构造函数)

类与对象&#xff08;中--构造函数&#xff09; 1、构造函数的特性2、默认构造函数3、编译器自动生成的默认构造函数&#xff08;无参的&#xff09;&#xff08;当我们不写构造函数时&#xff09;3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用&#xff0…...

Makefile学习1

文章目录 Makefile学习1Makefile简介Makefile重要性Makefile内容1) 显式规则2) 隐晦规则3) 变量的定义4) 文件指示5) 注释 Makefile规则规则默认目标多目标多规则目标伪目标 Makefile目标依赖头文件依赖自动生成头文件依赖关系 Makefile命令Makefile变量变量定义和使用赋值立即…...

城市内涝监测预警系统,科学“智治”应对灾害

近日&#xff0c;台风“杜苏芮”以摧枯拉朽之势给我国东南沿海地区带来狂风骤雨&#xff0c;福建的三个国家气象观测站日降水量突破历史极值。之后&#xff0c;“杜苏芮”一路北上。中央气象台预报称&#xff0c;7月29日至8月1日&#xff0c;北京、天津、河北、山东西部、河南北…...

切片[::-1]解析列表list表示的“非负整数加1”

列表数位表示非负整数&#xff0c;熟练操作“满十进位”。 (本笔记适合熟练操作Python列表list的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅…...

Mac下certificate verify failed: unable to get local issuer certificate

出现这个问题&#xff0c;可以安装证书 在finder中查找 Install Certificates.command找到后双击&#xff0c;或者使用其他终端打开 安装完即可...

Django项目启动错误

uwsgi项目启动错误信息如下Did you install mysqlclient?Command pkg-config --exists mysqlclient returned non-zero exit status 1Command pkg-config --exists mariadb returned non-zero exit status 1.Traceback (most recent call last):File "/home/dream21th/co…...

Vue2 第十二节 Vue组件化编程 (二)

1. VueComponent 2. 单文件组件 一. VueComponent 组件本质上是一个名为VueComponent的构造函数&#xff0c;不是程序员定义的&#xff0c;是Vue.extend生成的只需要写<school/>或者<school><school/>&#xff0c;Vue解析时&#xff0c;会帮我们创建schoo…...

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…...

SAP ABAP 基础语法超详细

1&#xff0e;表声明 Tables: 表名[,表名]. 声明多个表时可用逗号分隔当你声明了一个数据表的同时&#xff0c;系统也同时自动生成了一个和数据表同名的结构&#xff0c;结构的变量集等于数据表里面的字段。 2&#xff0e;定义变量 Data: v1[(l)] [type t] [decimals d] [v…...

html学习3(表格table、列表list)

1、html表格由<table>标签来定义。 <thead>用来定义表格的标题部分&#xff0c;其内部用 <th > 元素定义列的标题&#xff0c;可以使其在表格中以粗体显示&#xff0c;与普通单元格区分开来。<tbody>用来定义表格的主体部分&#xff0c;其内部用<t…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...