二维数组(初学者)
1、二维数组的定义:当数组中每个元素带有两个下标时,称这样的数组为二维数组。在逻辑上可以把二维数组看成是一个具有行和列的表格或一个矩阵。
一般形式:类型说明符 数组名[常量表达式1][常量表达式2];
例:定义a为3*4(3行4列)的数组,b为5*10(5行10列)的数组。
#include <stdafx.h> #include<stdio.h> void main() { float a[3][4],b[5][10]; }
在内存中的表达:
例如:int a[3][4];说明了一个三行四列的数组,数组名为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]
在c语言中可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组。如以上a数组可以看成是由a[0]、a[1]、a[2]三个元素组成的一维数组,其中每个元素又是由四个整型元素组成的一维数组。建立起这一概念是十分重要的,因为c语言编译系统确实是把二维数组a中的a[0]、a[1]、a[2]作为数组名来处理的。
二维数组在概念上是二维的,但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。
如何在一维存储器中存放二维数组,有两种方式:一种是按行排列,即放完一行后顺次放入第二行。另一种是按列排列,即放完一列后再顺次放入第二列。在c语言中,二维数组是按行排列的。
衍生:多维数组的定义
定义三维数组:float a[2][3][4];
多维数组在内存中的排列:第一维的下标变化最慢,最右边的下标变换最快。
(图百度的=-=)2、二维数组的引用和初始化
形式:数据类型 数组名[常量表达式1][常量表达式2]={初始化数据};
二维数组的初始化有四种方式:
(1)所赋初值个数与数组元素的个数相同
可以在定义二维数组的同时给二维数组的各元素赋初值。
例如:int a[4][3]={{1,2,3},{4,5,6}{7,8,9},{10,11,12}};
全部初值括在一对花括号中,之间用逗号隔开。
(2)每行所赋初值个数与数组元素个数不同
当某行一对花括号内的初值个数少于该行中元素的个数时,如:
int a[4][3]={{1,2},{4,5},{7},{10}};
系统将自动给该行后面的元素补初值0。因此,a[0][2]、a[2][1]的初值为0。也就是说,不能跳过每行前面元素二给后面的元素赋初值。
(3)所赋初值行数少于数组行数
当代表着给每行赋初值的行花括号对少于数组的行数时,如:
int a[4][3]={{1,2},{4,5}};
系统将自动给后面各行的元素补初值0。
(4)赋初值时省略行花括号对
在给二维数组赋初值时可以不使用行花括号对,如:
int a[4][3]={1,2,3,4,5}
系统将按a数组元素在内存中的排列顺序,将花括号中的数据一一对应的赋给各元素,若数据不足,系统将给后面的元素自动补初值0。
注:如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度则不能省。
例: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};
在定义时可以只对部分元素赋初值而省略第一维长度,但应分行赋初值。
例:int a[][4]={{0,0,3},{},{0,10}};
不建议使用