C语言定义和引用二维数组

怎样定义和引用二维数组

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

一.怎样定义二维数组

其基本概念与方法与一维数组相似,如:

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

二维数组定义的一般形式为
类型说明符 数组名 [常量表达式] [常量表达式]
例如:

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

定义a为3×4(三行四列)的数组,b为5×10(5行10列)的数组,但是不能写成 float a[3,4],b[5,10];

C语言对二维数组采用这样的方式定义,使得二维数组可被看作一种特殊的一维数组;它的元素又是一个一维数组,例如,可以把a看作一个一维数组,它有三个元素: a[0], a[1], a[2];
每个元素又是包含4个元素的一维数组,如

a[0] --- a[0][0] a[0][1] a[0][2] a[0][3]
a[1] --- a[1][0] a[1][1] a[1][2] a[1][3]
a[2] --- a[2][0] a[2][1] a[2][2] a[2][3]
  

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

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

C语言还允许使用多维数组,有了二维数组的基础,再掌握多维数组是不困难的,例如定义三维数组的方法如下:

float a[2][3][4];

二.怎样引用二维数组的元素

二维数组元素的表现形式为:
数组名 [下标] [下标]
例如,a[2][3] 表示a数组中序号为2的行中序号为3的元素。下标应是整形表达式,
如a[2-1][22-1]。~~不要写成 a[2,3], a[2-1,22-1]形式。~~
数组元素可以出现在表达式中,也可以被赋值,例如:

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

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

int a[3][4];   //定义a为3X4的二维数组
...
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).分行给二维数组赋初值。例如

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

这种赋值方法比较直观,把第一个花括号内的数据给第一行的元素,第二个花括号内的数据赋给第二行的元素…即按行赋初值。
(2).可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序给各元素赋初值。例如:

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

效果与前相同,但以第二种方法为好,一行对一行,界限清楚。用第(2)种方法如果数据多,则会写成一大片,容易疏漏,也不易检查。
(3).可以对部分元素赋初值,例如:

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

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

1   0   0   0 
5   0   0   0
9   0   0   0
也可以对各行中的某一元素赋初值,例如:
int a[3][4]={ { 1}{ 0,6}{ 0,0,11}};
初始化后的数组元素为:
1   0   0   0    0
0   6   0   0    0
0   0   0   11   0

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

int a[3][4] ={ { 1},{ 5,6}};
数组元素为:
1   0   0   0
5   6   0   0
0   0   0   0 
0   0   0   0
第三行不赋初值
也可以对第二行不赋初值,例如:
int a[3][4] ={ { 1},{  },{ 9}};

(4).如果对全部元素都赋初值(即提供全部初始化数据),则定义数组时对第一维的长度可以不指定,但第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维的长度,但应分行赋初值。例如:

int a[][4] = { { 0,0,3},{ },{ 0,10}};
这样的写法,能通知编译系统;数组共有3行。数组各元素为:
0   0   3   0
0   0   0   0
0   10  0  0

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

    原文作者:江江编程
    原文地址: https://blog.csdn.net/qq_44832907/article/details/112366259
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞