二维数组

    xiaoxiao2022-07-14  155

    定义

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

    int a[3][4];

    表示定义了一个 3×4,即 3 行 4 列总共有 12 个元素的数组 a。这 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]。        与一维数组一样,行序号和列序号的下标都是从 0 开始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。所以在引用数组元素时应该注意,下标值应在定义的数组大小的范围内。        此外,与一维数组一样,定义数组时用到的“数组名[常量表达式][常量表达式]”和引用数组元素时用到的“数组名[下标][下标]”是有区别的。前者是定义一个数组,以及该数组的维数和各维的大小。而后者仅仅是元素的下标,像坐标一样,对应一个具体的元素。        C 语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组,即它的元素为一维数组。比如“int a[3][4];”可以看作有三个元素,每个元素都为一个长度为 4 的一维数组。而且 a[0]、a[2]、a[3] 分别是这三个一维数组的数组名。下面来验证一下看看是不是这么回事儿: 

    int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; printf(" a的地址 0x%p\n a[0]地址: 0x%p\n a[0][0]地址: 0x%p\n", a, &a[0], &a[0][0]); printf(" a[0]行数组:%zd\n a的第一个元素: %zd\n", sizeof(a[0]), sizeof(a[0][0])); a的地址 0x000000056C2FF758 a[0]地址: 0x000000056C2FF758 a[0][0]地址: 0x000000056C2FF758 a[0]行数组:16 a的第一个元素: 4

    可见 a[0] 确实是第一行一维数组的数组名,其他同理。a、a[0]、a[0]0[]三者地址相同是数组的首地址。        二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。        在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。

    初始化

    分行给二维数组赋初值: int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

    这种赋初值的方法比较直观,将第一个花括号内的数据赋给第一行的元素、第二个花括号内的数据赋给第二行的元素……即每行看作一个元素,按行赋初值。

    将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。比如: int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

    效果与第 1 种是一样的。但第1种方法更好,一行对一行,界限清楚。第 2 种方法如果数据多,写成一大片,容易遗漏,也不易检查。

    对部分元素赋初值。比如: int a[3][4] = {{1, 2}, {5}, {9}};

    相当于对第一行的前两个元素赋值、第二行和第三行的第一个元素赋值。其余元素自动为 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[3][4]={0};

    数组如何输出

    二维数组有行和列,那么如何输出里面的元素呢?在讲述一维数组的时候说过,“数组的元素只能一个一个输出”,二维数组也不例外。在一维数组中是用一个 for 循环进行输出,而二维数组元素的输出要使用两个 for 循环嵌套。

    int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int i; //行循环变量 int j; //列循环变量 for (i = 0; i < 3; ++i) { for (j = 0; j < 4; ++j) { printf("%-2d\x20", a[i][j]); } printf("\n"); } 1 2 3 4 5 6 7 8 9 10 11 12

    参考:

    http://c.biancheng.net/view/200.html 

    最新回复(0)