二、二维数组
1、二维数组的一般形式
二维数组带两对中括号,也就是说带两个下标。
类型名 数组名[常量表达式][常量表达式];
例:int a[3][4];
上面的代码是定义 a 为3行4列的数组。
可以把二维数组看成是一种特殊的一维数组,a[3][4]这个二维数组,可以把 a看成是一个一维数组,这个一维数组有三个元素,即a[0]、a[1]、a[2],每个元素又是一个包含 4 个元素的一维数据。
如下图:
int a[3][4];就相当于定义了 12个元素 (3 行 4 列) ,第一维下标能引用的范围是 0- 2,第二维下标能引用的范围是 0-3 ,所以整个二维数组能够引用的元素如下,共 12 个元素:
a[0][0],a[0][1] ,a[0][2],a[0][3],
a[1][0],a[1][1] ,a[1][2],a[1][3],
a[2][0],a[2][1] ,a[2][2],a[2][3]
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
在 C语言中,二维数组的元索存放顺序是按行存放,即在内存中先顺序存放第一行元素,再存放第二行元素 ,以此类推,所以int a[3][4];这个二维数组在内存中存放数据看起来,如下图所示:
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
有了对二维数组的理解 ,三维数组甚至多维数组就好理解了。
例:int a[2][3][4]
a[0][0][0],a[0][0][1],a[0][0][2],a[0][0][3],
a[0][1][0],a[0][1][1],a[0][1][2],a[0][1][3],
a[0][2][0],a[0][2][1],a[0][2][2],a[0][2][3],
a[1][0][0],a[1][0][1],a[1][0][2],a[1][0][3],
a[1][1][0],a[1][1][1],a[1][1][2],a[1][1][3],
a[1][2][0],a[1][2][1],a[1][2][2],a[1][2][3]
在实际工作中,一维和二维数组常用, 三维和多维数组有的都比较少。
2、二维数组元素的引用
二维数组元素的引用形式为 :
数组名[下标][下标]
引用二维数组元素时必须带两个中括号 ,如 a[2][3],下标也可以整型表达式,如 a[5-3][4-1],但一般不会这样写,一般都是写成一个整数,注意不要写成 a[2,3],必须是两个中括号。
注意:
1、不管一维数组还是二维数组,它们的数组元素(也叫成员)应该被看成一个普通变量,如一维数组的a[1],二维数组的a[2][3],都把它们当成普通变量看待和使用即可。
2、定义int a[3][4],那么第一维下标的范围是 0-2,第二维下标的范围是 0-3,在引用的时候,只要这两个下标有一个超过范围,引用就是错误的。
3、要严格区分数组定义时使用的[3][4]和引用数组元素时使用的[3][4],这完全是两个意思:前者用来定义数组的维数和各个维度的大小,后者a[3][4]中的 3 和 4 是下标值,用来标识某个元素。
例:
2、二维数组的初始化
与一维数组初始化一样 ,在定义二维数组的时候,就可以顺便给该二维数组元素赋初值,这就叫二维数组的初始化。
(1)按行给二维数组赋初值?
例:
按行赋值,第一个花括号{大括号}内的数据赋值给第一行元素,第二个花括号内的数据,赋值给第二行元素,以此类推。
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[0][3]=4,
a[1][0]=2
a[1][1]=3
a[1][2]=3
a[1][3]=4,
a[2][0]=3
a[2][1]=4
a[2][2]=5
a[2][3]=6
(2)将所有数据放在一个大括号里 ,看起来不清晰,容易遗漏和造成混乱,不建议。
例:
(3)对部分元素赋初值。
例:
每个大括号里的内容代表一行,这里省略了第三行 ,没给第三行元素赋初值,那么所有没有赋值的元素,都会被系统默认赋成0。 可以设置断点调试一下看看。
例:对第二行不赋初值,断点调试,没赋初值的数组元素同样被系统默认赋成0。
(4)若对全部元素赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省略。
例:
?int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
可以简写为:
int a[ ][4]={1,2,3,4,2,3,4,5,3,4,5,6};
此时系统会根据初始化的数据总个数来分配存储空间,一共有12个数据,每行有4列, 那当然是3行,但是一般很少这样编写代码 ,都应该明确地写出数组维度的大小。
注意:
目前所讲解的一维和二维数组都是整型数组, 也就是数组元素中保存的都是整型数字,这是因为整型数组在编程时用的比较广泛,接下来,将要讲解字符数组 ,字符数组在C和 C++中用的也非常广泛,同时也最容易用错,需认真学习。