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

【时时三省】(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[][]这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。

 

相关文章:

  • 开平机:卷材高效成板的核心装备
  • 无需标记点,精准面部捕捉!无线面捕头盔赋予自由表演空间
  • Java大师成长计划之第15天:Java线程基础
  • 3.5/Q1,GBD数据库最新文章解读
  • ubuntu24.04安装anaconda
  • Spring Boot + Vue 实现在线视频教育平台
  • Spring Boot 3 + Undertow 服务器优化配置
  • modbus 帧信息格式
  • Linux/AndroidOS中进程间的通信线程间的同步 - 消息队列
  • [数据库之十一] 数据库索引之联合索引
  • 主备Smart Link + Monitor Link组网技术详细配置
  • java实战(第六篇):统计投票信息
  • C++ STL 入门:map 键值对容器
  • 手写Promise的静态方法
  • 2024年 AI大模型我该买一张什么显卡?
  • 【行业深度解析】什么是马甲包?
  • 责任链设计模式
  • vue3的深入组件-组件 v-model
  • 免费AI图像编辑平台,最新无损放大技术
  • 无刷电机控制算法策略
  • 央行:下阶段将实施好适度宽松的货币政策
  • 中国词学研究会原会长、华东师大教授马兴荣逝世,享年101岁
  • 国家主席习近平同普京总统签署关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 苹果Safari浏览器上的搜索量首次下降
  • 巴基斯坦信德省卡拉奇发生爆炸
  • 明天起,沪苏湖高铁、杭温高铁推出13款新型票制产品