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, 3,1};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、元素逆置和冒泡排序 二、二维数组(用指针进行访问与修改)1、定义和初始化2、访问与修改 三、更高维度的数组1、三维数组2、高维数组 一、一维数组 1、定义和初始化 在 C 中,可以使用下面的…...

C++多态练习题
目录 一.习题1: 解决下列测试代码所出现的问题 测试用例1: 测试用例2: 代码改进: 习题1总结: 二.习题2. 求类对象的大小 三.习题3: 代码解析 : 解析图: 四.习题4ÿ…...

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

第十三章 利用PCA简化数据
文章目录 第十三章 利用PCA简化数据13.1降维技术13.2PCA13.2.1移动坐标轴 13.2.2在NumPy中实现PCA13.3利用PCA对半导体制造数据降维 第十三章 利用PCA简化数据 PCA(Principal Component Analysis,主成分分析)是一种常用的降维技术࿰…...
开源中文分词Ansj的简单使用
ANSJ是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram HMM分词模型:在Bigram分词的基础上,识别未登录词,以提高分词准确度。 虽然基本分词原理与ICTLAS的一样&#…...
251_多线程_创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像
举一个更丰富的例子来说明多线程的用法。 我们将创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像。 这个例子可以更好地展示多线程并发处理的优势。 假设有一个函数 processImageSection,它会对图像的一个特定区域进…...
[吐槽Edge浏览器]关于Edge浏览器的闪退问题
这个浏览器嘛,在谷歌浏览器不能页面翻译后,一直是用的高高兴兴的,可突然有一天,Edge浏览器页面加载不出来了。 很慌,大概就是页面崩溃、加载失败什么的都出现过。 修了整整一天,不知道原因在哪,…...

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

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

【决策树-鸢尾花分类】
决策树算法简介 决策树是一种基于树状结构的分类与回归算法。它通过对数据集进行递归分割,将样本划分为多个类别或者回归值。决策树算法的核心思想是通过构建树来对数据进行划分,从而实现对未知样本的预测。 决策树的构建过程 决策树的构建过程包括以…...
类与对象(中--构造函数)
类与对象(中--构造函数) 1、构造函数的特性2、默认构造函数3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用࿰…...
Makefile学习1
文章目录 Makefile学习1Makefile简介Makefile重要性Makefile内容1) 显式规则2) 隐晦规则3) 变量的定义4) 文件指示5) 注释 Makefile规则规则默认目标多目标多规则目标伪目标 Makefile目标依赖头文件依赖自动生成头文件依赖关系 Makefile命令Makefile变量变量定义和使用赋值立即…...

城市内涝监测预警系统,科学“智治”应对灾害
近日,台风“杜苏芮”以摧枯拉朽之势给我国东南沿海地区带来狂风骤雨,福建的三个国家气象观测站日降水量突破历史极值。之后,“杜苏芮”一路北上。中央气象台预报称,7月29日至8月1日,北京、天津、河北、山东西部、河南北…...

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

Mac下certificate verify failed: unable to get local issuer certificate
出现这个问题,可以安装证书 在finder中查找 Install Certificates.command找到后双击,或者使用其他终端打开 安装完即可...
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的构造函数,不是程序员定义的,是Vue.extend生成的只需要写<school/>或者<school><school/>,Vue解析时,会帮我们创建schoo…...

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug
未经允许,本文不得转载,vx:837007389 文章目录 step1:下载专业版本的pycharmstep2 配置自动同步文件夹,即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…...
SAP ABAP 基础语法超详细
1.表声明 Tables: 表名[,表名]. 声明多个表时可用逗号分隔当你声明了一个数据表的同时,系统也同时自动生成了一个和数据表同名的结构,结构的变量集等于数据表里面的字段。 2.定义变量 Data: v1[(l)] [type t] [decimals d] [v…...

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

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...