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

【时时三省】(C语言基础)怎样定义和引用二维数组

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组,如下图,如果建立一个数组pay,它应当是二维的,第一维用来表示第几分队,第二维用来表示第几个队员。例如用pay₂,₃表示2分队第3名队员的工资,它的值是1725。

二维数组常称为矩阵。把二维数组写成行和列的排列形式。可以有助于形象化地理解二维数组的逻辑结构。

怎样定义二维数组

怎样定义二维数组呢?其基本概念与方法和一维数组相似。

如:

float pay [ 3 ] [ 6 ];

以上定义了一个float型的二维数组,第1维有3个元素,第2维有6个元素。每一维的长度分别用一对方括号括起来。

二维数组定义的一般形式为

类型说明符数组名[常量表达式] [常量表达式];

例如:

float a [ 3 ] [ 4 ],b [ 5 ] [ 10 ];

定义a为3×4 (3行4列)的数组,b为5×10 (5行10列)的数组。注意,不能写成

float a [ 3 , 4 ],b [ 5 , 10 ];

C语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组,它的元素又是一个一维数组。

例如,可以把a看作一个一维数组,它有3个元素:

a [ 0 ],a [ 1 ],a [ 2 ]

每个元素又是一个包含4个元素的一维数组,如图:

可以把a [ 0 ],a [ 1 ],a [ 2 ]看作3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于

float a [ 0 ] [ 4 ],a [ 1 ] [ 4 ],a [ 2 ] [ 4 ];

此处把a [ 0 ],a [ 1 ],a [ 2 ]看作一维数组名。C语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会体会到。

C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。

假设数组a存放在从2000字节开始的一段内存单元中,一个元素占4个字节,前16个字节( 2000 ~ 2015 )存放序号为0的行中的4个元素,接着的16个字节( 2016 ~ 2031 )存放序号为1的行中的4个元素,余类推。

注意:

用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。这点务请明确。

C语言还允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。例如,定义三维数组的方法如下:float a[2][3][4] ; / /定义三维数组a,它有2页,3行,4列

多维数组元素在内存中的排列顺序为:第1维的下标变化最慢,最右边的下标变化最快。

怎样引用二维数组的元素

二维数组元素的表示形式为

数组名[下标] [下标]

例如,a [ 2 ] [ 3 ]表示a数组中序号为2的行中序号为3的列的元素。下标应是整型表达式,如a [ 2-1 ] [ 2 * 2-1 ]。不要写成a [ 2,3 ]、a [ 2-1,2 * 2-1 ]形式。

数组元素可以出现在表达式中,也可以被赋值,例如:

b [ 1 ] [ 2 ] = a [ 2 ] [ 3 ] / 2

注意:在引用数组元素时,下标值应在已定义的数组大小的范围内。在这个问题上常出现错误。例如:

int a [ 3 ] [ 4 ] ;

a [ 3 ] [ 4 ] = 3 ;/ /不存在a [ 3 ] [ 4 ]元素

按以上的定义,数组a可用的“行下标”的范围为0 ~ 2,“列下标”的范围为0 ~ 3。用a [ 3 ] [ 4 ]表示元素显然超过了数组的范围。

注意:

请读者严格区分在定义数组时用的a [ 3 ] [ 4 ]和引用元素时的a [ 3 ] [ 4 ]的区别。前者用a [ 3 ] [ 4 ]来定义数组的维数和各维的大小,后者a [ 3 ] [ 4 ]中的3和4是数组元素的下标值,a [ 3 ] [ 4 ]代表行序号为3、列序号为4的元素(行序号和列序号均从0起算)。

二维数组的初始化

可以用“初始化列表”对二维数组初始化。

( 1 )分行给二维数组赋初值。例如:

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

这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的数据赋给第2行的元素……即按行赋初值。

( 2 )可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。例如:

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

效果与前相同。但以第(1)种方法为好,一行对一行,界限清楚。用第(2 )种方法如果数多,则会写成一大片,容易遗漏,也不易检查。

( 3 )可以对部分元素赋初值。例如:

int a [ 3 ] [ 4 ] = {{1},{5},{9}};

它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。赋值后数组各元素为

 也可以对各行中的某一元素赋初值,例如:

int a [ 3 ] [ 4 ] = { {1},{0,6},{0,0,11} };

初始化后的数组元素如下:

这种方法对非0元素少时比较方便,不必将所有的0都写出来,只须输入少量数据,也可以只对某几行元素赋初值:

int a [ 3 ] [ 4 ] ={{1},{5,6}}

数组元素为

第3行不赋初值。也可以对第2行不赋初值。

( 4 )如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省。第3行不赋初值。也可以对第2行不赋初值,例如:

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

与下面的定义等价:

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

系统会根据数据总个数和第2维的长度算出第1维的长度。数组一共有12个元素,每行4列,显然可以确定行数为3。

在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值。

从本节的介绍中可以看到:C语言在定义数组和表示数组元素时采用a[][]这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。

 

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

相关文章:

  • 数字孪生医疗:构建患者特异性数字孪生体路径探析
  • 【NLP 71、常见大模型的模型结构对比】
  • 缓存套餐-01.Spring Cache入门案例
  • 阿里云 golang 一面
  • 【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具
  • 使用 Vite 创建 Vue 3 项目并手动配置路由的完整步骤
  • 如何通过服务主体获取 Azure 凭据
  • Ansible 流程控制
  • MySQL的索引和事务
  • @AutoConfigureBefore功能简介-笔记
  • ideal创建Springboot项目(Maven,yml)
  • 在Git历史中移除现有的Commit
  • Python 异常处理与文件 IO 操作:构建健壮的数据处理体系(3/10)
  • 高低比率策略
  • 天选5Pro(锐龙版)设备声音、显卡消失等问题完整解决记录
  • 表达式求值(算法题)
  • CMU-15445(3)——PROJECT#1-BufferPoolManager-Task#1
  • 【MySQL】存储引擎 - CSV详解
  • C++ stl中的string的相关用法
  • 【人工智能agent】--dify通过mcp协议调用工具
  • HR新战场:构建AI战略时代的认知分工与生态化人才供应链
  • 嵌入式C进阶路线指南
  • 创建虚拟服务时实现持久连接。
  • [人机交互]交互设计过程
  • 堆排序(算法题)
  • Easy云盘总结篇-文件分享
  • 如何看待首个通用型智能体 (The First General AI Agent) Manus发布?
  • ORB-SLAM3论文阅读
  • Agent学习之:MCP和Function Call
  • # 创建一个功能完备的计算器应用:使用PyQt5和Python