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

C/C++数据结构之多维数组

概述

        多维数组,实际上就是“数组的数组”。最常见的是二维数组,就像一个表格,拥有行和列。而三维数组则可以想象为多个这样的表格堆叠起来形成的一个立方体。依此类推,我们可以构建四维、五维甚至更高维度的数组。

        多维数组主要用于表示具有多个属性的数据集合。在计算机图形学中,图像可以被视为二维像素矩阵。在科学计算中,物理场可能需要三维数组来表示。另外,棋盘类游戏中的棋盘通常是一个固定大小的网格,实际上也是一个多维数组。比如:国际象棋的棋盘是一个8 x 8的网格,可以用二维静态数组来表示。

声明与初始化

        我们以二维数组为例,来说明如何进行声明与初始化。声明一个多维数组,首先需要明确指定数组的类型和每个维度的尺寸。声明格式通常如下:

                type arrayName[size1][size2];

        其中,type代表数组中元素的数据类型(比如:int、float等),而size1和size2则是在编译期可以确定的一个常量值或常量表达式,表示数组在一维和二维分别能够容纳的元素个数。比如:要声明一个3 x 4的二维数组,可以写为如下代码。

int paNumber[3][4];

        其中,paNumber是一个包含3个元素的数组,每个元素本身又是一个包含4个整数的数组。

        在声明二维数组的同时,还可以对二维数组进行初始化。初始化时,可以按照维度直接给出所有元素的值,形式如下。值得注意的是,如果省略某些值,默认它们会被设置为0。

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

        访问二维数组中的某个元素,可以通过两个连续的下标运算符[]实现,其语法格式如下:

                arrayName[index1][index2];

        其中,index1和index2是从0开始计数的位置索引,index1不能大于size1,index2不能大于size2。比如:有一个名为paNumber的整型数组,想要获取第二行第三列元素的值,可以写作paNumber[1][2]。

动态分配

        有时候,我们需要根据程序运行时的变量值动态创建多维数组,而不是在编译时就确定其大小。此时,可以使用指针和new来实现。

        在下面的示例代码中,这段代码首先创建了一个指向指针数组的指针ppMatrix(即二维数组),然后为每一行分配了足够的内存空间来存储列元素。

int nRows = 3;
int nCols = 4;
// 创建行指针数组
int** ppMatrix = new int*[nRows];
for(int i = 0; i < nRows; ++i)
{// 为每一行分配空间ppMatrix[i] = new int[nCols];
}

        需要注意的是,动态分配内存后,我们必须释放这些资源,以防止内存泄漏。

for(int i = 0; i < nRows; ++i)
{// 释放每一行的内存delete[] ppMatrix[i];ppMatrix[i] = NULL;
}// 最后释放行指针数组的内存
delete[] ppMatrix;
ppMatrix = NULL;

http://www.xdnf.cn/news/15287.html

相关文章:

  • MyBatis04-MyBatis小技巧
  • QT 多线程 管理串口
  • Node.js特训专栏-实战进阶:16. RBAC权限模型设计
  • 沃尔玛 卡号查询 滑块 分析
  • 深度学习图像分类数据集—角膜溃疡识别分类
  • TensorFlow深度学习实战(24)——变分自编码器详解与实现
  • spring-ai-alibaba 1.0.0.2 学习(十六)——多模态
  • IP 地址与网络基础全面解析
  • ARC 02 runner scale set chart:对接集群与 Github Action 服务器
  • 在 OCI 生成式 AI 上搭一个「指定地区拉面店 MCP Server」——从 0 到 1 实战记录
  • 基于SpringBoot3集成Kafka集群
  • CSS个人笔记分享【仅供学习交流】
  • Utils系列之内存池(MultiSizePool)
  • 电商系统未来三年趋势:体验升级、技术赋能与模式重构
  • 关于ISO 26262的Single-Point Fault/Residual Fault/Latent Fault/Dual-Point Fault的整理
  • Android 响应式编程完整指南:StateFlow、SharedFlow、LiveData 详解
  • Docker 基于 Cgroups 实现资源限制详解【实战+源码】
  • CAU数据挖掘第四章 分类问题
  • Linux修炼:开发工具
  • 软件开发中的瀑布式开发与敏捷开发
  • 2025湖北省信息安全管理与评估赛项一阶段技能书
  • 在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm 等)中如何新建一个 PlantUML 文件
  • 新手向:使用Python构建高效的日志处理系统
  • Llama系列:Llama1, Llama2,Llama3内容概述
  • Web攻防-PHP反序列化魔术方法触发条件POP链构造变量属性修改黑白盒角度
  • Python爬虫实战:研究xlwings库相关技术
  • Qt 3D模块加载复杂模型
  • CA复习功课
  • 前端进阶之路-从传统前端到VUE-JS(第五期-路由应用)
  • react中为啥使用剪头函数