C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


C++ 多维数组

多维数组

C++ 多维数组是一种数组,它具有多个维度,并允许您以网格状结构存储数据。您可以创建多维数组,但这里我们将讨论二维 (2D) 和三维 (3D) 数组。

C++ 支持多维数组。以下是多维数组声明的一般形式 -

语法

以下是 C++ 中多维数组的语法:

type name[size1][size2]...[sizeN];

示例

例如,以下声明创建了一个大小为 5、10、4 的三维整数数组 -

int threedim[5][10][4];

二维数组

多维数组最简单的形式是二维数组。二维数组本质上是一维数组的列表。要声明一个大小为 x 和 y 的二维整数数组,您可以编写如下代码 -

type arrayName [ x ][ y ];

其中 type 可以是任何有效的 C++ 数据类型,arrayName 是有效的 C++ 标识符。

二维数组可以被认为是一个表,它有 x 行和 y 列。二维数组 a 包含三行四列,如下所示 -

二维数组

因此,数组 a 中的每个元素都由 a[ i ][ j ] 形式的元素名称标识,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的下标。

初始化二维数组

可以通过为每一行指定括号中的值来初始化多维数组。以下是一个包​​含 3 行、每行 4 列的数组。

int a[3][4] = {
    {0, 1, 2, 3} , /* 索引为 0 的行的初始化器 */
    {4, 5, 6, 7} , /* 索引为 1 的行的初始化器 */
    {8, 9, 10, 11} /* 索引为 2 的行的初始化器 */
};

嵌套括号表示目标行,是可选的。以下初始化与上一个示例等效 -

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

访问二维数组元素

二维数组中的元素通过使用下标(即数组的行索引和列索引)来访问。例如 -

int val = a[2][3];

上述语句将从数组的第 3 行开始获取第 4 个元素。您可以在上图中验证这一点。

#include <iostream>
using namespace std;
 
int main () {
    // 一个 5 行 2 列的数组。
    int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
    
    // 输出每个数组元素的值
    for ( int i = 0; i < 5; i++ )
      for ( int j = 0; j < 2; j++ ) {
      
         cout << "a[" << i << "][" << j << "]: ";
         cout << a[i][j]<< endl;
      }
 
   return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

a[0][0]: 0
a[0][1]: 0
a[1][0]: 1
a[1][1]: 2
a[2][0]: 2
a[2][1]: 4
a[3][0]: 3
a[3][1]: 6
a[4][0]: 4
a[4][1]: 8

如上所述,您可以拥有任意维数的数组,尽管您创建的大多数数组可能是一维或二维的。

三维数组

类似地,C++ 中的三维 (3D) 数组是二维数组概念的扩展,增加了另一个维度。这使得您可以在三维空间中存储数据。您可以将其可视化为一个立方体,其中每个元素由三个索引标识,这三个索引通常表示深度、行和列的维度。要声明一个大小为 x、y 和 z 的二维整数数组,您可以编写如下代码:

type arrayName [ x ][ y ][z];

其中 type 可以是任何有效的 C++ 数据类型,arrayName 是有效的 C++ 标识符。

三维数组可以被认为是由多个二维表堆叠而成的集合,这些表彼此堆叠,形成一个类似立方体的结构。

因此,数组 a 中的每个元素都由 b[ i ][ j ][k] 形式的元素名称标识,其中 a 是数组名称,i、j 和 k 是唯一标识 b 中每个元素的下标。

初始化三维数组

可以通过为每一层、每一行和每一列指定括号中的值来初始化三维数组。以下是一个包​​含 2 层、3 行和 4 列的三维数组的示例。

int b[2][3][4] = {
    {
        {0, 1, 2, 3}, /* 第 0 层,第 0 行的初始化器 */
        {4, 5, 6, 7}, /* 第 0 层,第 1 行的初始化器 */
        {8, 9, 10, 11} /* 第 0 层,第 2 行的初始化器 */
    },
    {
        {12, 13, 14, 15}, /* 第 1 层,第 0 行的初始化器 */
        {16, 17, 18, 19}, /* 第 1 层,第 1 行的初始化器 */
        {20, 21, 22, 23} /* 第 1 层,第 2 行的初始化器 */
    }
};

在此初始化中,嵌套括号用于表示每组值的目标层和行。

平面初始化

或者,您也可以初始化一个不使用嵌套括号的三维数组。此方法将数组作为单个连续的值块。以下是示例:

int b[2][3][4] = {0, 1, 2, 3, 
  4, 5, 6, 7, 
  8, 9, 10, 11, 
  12, 13, 14, 15, 
  16, 17, 18, 19, 
  20, 21, 22, 23};

在本例中,值以平面格式列出。两种初始化方法均有效,并生成相同的数组结构。

访问三维数组元素

三维数组中的元素可以通过三个下标访问,即层索引、行索引和列索引。例如:-

int val = b[1][2][3];

在上述语句中,val 将从数组 b 的第二层第三行开始获取第 4 个元素。

索引的工作原理如下:

  • 第一个索引 (1) 指定数组的层(或深度)。
  • 第二个索引 (2) 指定该层中的行。
  • 第三个索引 (3) 指定该行中的列。

因此,b[1][2][3] 访问的元素对应于位于数组第一层、第二行和第三列的值。您可以通过思考数据如何以立方体格式构建来实现这一点,其中每个坐标指向该三维空间内的特定元素。

示例

以下是一段代码:

#include <iostream>
using namespace std;

int main() {
    // 一个包含 2 层、3 行、4 列的数组。
    int b[2][3][4] = {{
        {0, 1, 2, 3}, // 第 0 层,第 0 行
        {4, 5, 6, 7}, // 第 0 层,第 1 行
        {8, 9, 10, 11} // 第 0 层,第 2 行
    },
    {
        {12, 13, 14, 15}, // 第 1 层,第 0 行
        {16, 17, 18, 19}, // 第 1 层,第 1 行
        {20, 21, 22, 23} // 第 1 层,第 2 行
    }};
    
    // 输出每个数组元素的值
  for (int i = 0; i < 2; i++) {      // 遍历各层
    for (int j = 0; j < 3; j++) {    // 遍历行
      for (int k = 0; k < 4; k++) {  // 遍历列
        cout << "b[" << i << "][" << j << "][" << k << "]: ";
        cout << b[i][j][k] << endl;
      }
    }
  }

  return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

b[0][0][0]: 0
b[0][0][1]: 1
b[0][0][2]: 2
b[0][0][3]: 3
b[0][1][0]: 4
b[0][1][1]: 5
b[0][1][2]: 6
b[0][1][3]: 7
b[0][2][0]: 8
b[0][2][1]: 9
b[0][2][2]: 10
b[0][2][3]: 11
b[1][0][0]: 12
b[1][0][1]: 13
b[1][0][2]: 14
b[1][0][3]: 15
b[1][1][0]: 16
b[1][1][1]: 17
b[1][1][2]: 18
b[1][1][3]: 19
b[1][2][0]: 20
b[1][2][1]: 21
b[1][2][2]: 22
b[1][2][3]: 23

上述代码有效地演示了如何在 C++ 中处理三维数组。