zoukankan      html  css  js  c++  java
  • C Program基础-二维数组

      一维数组可以看作一行连续的数据,只有一个下标。C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置。

    (一)二维数组的定义

    二维数组定义一般的格式是:

    DataType ArrayName[Row][Colume];

    其中,DataType可以是任何数据类型,ArrayName是数组名,Row是数组的行,Colume是列;

    例如int m[5][9];表示的是如下一个5行9列的矩阵:

    为了访问i行j列的元素,需要用m[i][j]的形式

    虽然在上面我们以表格的形式表示二维数组,但我们需要知道在计算机内存中并不存在这样的存储,C语言是按照行主序的方式存储多维数组,并且是存储在连续空间中,也就是说先存储第0行元素,接着第1行,以此类推。在内存中的布局如下图所示:

    (二)二维数组的初始化

    (1)完全初始化

    通过嵌套一维初始化的方式可以产生二维数组的初始化式:

    1     int m[5][9] = { { 1, 1, 1, 1, 1, 1, 1, 1, 0 },
    2                     { 1, 1, 0, 1, 1, 1, 1, 1, 1 },
    3                     { 1, 1, 1, 0, 1, 0, 1, 1, 1 },
    4                     { 1, 0, 1, 1, 1, 0, 1, 1, 1 },
    5                     { 1, 1, 0, 1, 1, 0, 1, 1, 0 } };

    (2)不完全初始化

    如果初始化没有大到填满整个二维数组,剩余的元素将被赋值为0:

    (a)初始化只填充前面3行,后面两行元素被初始化为0:

    1     int m[5][9] = { { 1, 1, 1, 1, 1, 1, 1, 1, 0 },
    2                     { 1, 1, 0, 1, 1, 1, 1, 1, 1 },
    3                     { 1, 1, 0, 1, 1, 0, 1, 1, 0 } };

    (b)内层列表没有达到足以填充一行,该行剩余元素被初始化为0:

        int m[5][9] = { { 1, 1, 1, 1, 1, 1, 1, 1, 0 },
                        { 1, 1, 0, 1, 1, 1, 1, 1, 1 },
                        { 1, 1, 1, 0, 1, 0, 1, 1, },
                        { 1, 0, 1, 1, 1, 0, 1, } ,
                        { 1, 1, 0, 1, 1, 0, 1, 1, 0 } };

    甚至可以省略内层花括号(但强烈建议不用这种方式):

    1     int m[5][9] = { 1, 1, 1, 1, 1, 1, 1, 1, 0,
    2                     1, 1, 0, 1, 1, 1, 1, 1, 1,
    3                     1, 1, 1, 0, 1, 0, 1, 1, 1,
    4                     1, 0, 1, 1, 1, 0, 1, 1, 1,
    5                     1, 1, 0, 1, 1, 0, 1, 1, 0};

    因为一旦编译器发现数值足以填满一行,它就开始填充下一行。但是需要知道,在多维数组中省略内层花括号是非常危险的,因为在不完全初始化的情况下,缺失的元素将会影响初始化,编译器无法计算每行每列该初始化多少个元素。

    常用的一个初始化方法,全初始化为0: int a[3][4] = {0}; 

    (三)二维数组的遍历

    对于二维数组,一般用双层循环来遍历,

    (1)遍历赋值

    1     int a[3][4];
    2     for (int i = 0; i < 3; i++)
    3     {
    4         for (int j = 0; j < 4; j++)
    5         {
    6             a[i][j] = i + j;
    7         }
    8     }

    (2)遍历打印:

    1     for (int i = 0; i < 3; i++)
    2     {
    3         for (int j = 0; j < 4; j++)
    4         {
    5             printf("%d ", a[i][j]);
    6         }
    7         printf("
    ");
    8     }

    程序输出:

    0 1 2 3
    1 2 3 4
    2 3 4 5
  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/z-joshua/p/6894428.html
Copyright © 2011-2022 走看看