当前位置: 首页 > 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…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...