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
  • 相关阅读:
    如何在Eclipse中彻底修改一个项目名称
    用JS在html页面实现打印功能
    关于git提交、还原使用
    maven package:Max maven Unsupported major.minor version 51.0
    Tomcat 启动报错:javax.naming.NamingException: No naming context bound to this class loader
    maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
    tripwire检查文件完整性
    设置mysql表名不区分大小写
    mysql-零基础安装
    nginx-0基础安装篇
  • 原文地址:https://www.cnblogs.com/z-joshua/p/6894428.html
Copyright © 2011-2022 走看看