zoukankan      html  css  js  c++  java
  • C++二维数组讲解、二维数组的声明和初始化

    我们知道,一维空间是一条线,数学中用一条数轴来表达;二维空间是一个平面,数学中用平面坐标系来表达。那么二维数组又是什么样的呢?

    线与面

    我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线上的点。而所有的数据都是存储在一条线上。如果我们采用两个下标,就能形成一个平面,犹如一张表格,有行有列,所有的数据就能够存放到表格里。

    我们把二维数组的两个下标分别称为行下标和列下标,在前面的是行下标,在后面的是列下标。

    那么什么时候要用二维数组呢?一般有两种情况,一种是描述一个二维的事物。比如用1表示墙,用0表示通路,我们可以用二维数组来描述一个迷宫地图;用1表示有通路,0表示没有通路,我们可以用二维数组来描述几个城市之间的交通情况。还有一种是描述多个具有多项属性的事物。比如有多个学生,每个学生有语文、数学和英语三门成绩,我们就可以用二维数组来描述。

    对于第二种情况,我们要注意各项属性应该是同一种数据类型,比如三种学科的成绩都是整数。如果出现了姓名(字符串属性),就不能将他们组合到一个二维数组里去。所以不要企图将不同数据类型的属性整合到一个二维数组中去。

    二维数组的声明和初始化

    二维数组的声明和一维数组是类似的,不同之处只是多了一个下标:
        数据类型数组名[行数][列数];

    要注意,二维数组的下标也都是从0开始的。

    二维数组的初始化分为两种,一种是顺序初始化,一种是按行初始化,我们来看一段程序,就能够对它们有所了解了:(程序7.4.1)
    #include "iostream.h"
    #include "iomanip.h"
    int main()
    {
       int array1[3][2]={4,2,5,6};//顺序初始化
       int array2[3][2]={{4,2},{5},{6}};//按行初始化
       cout <<"array1" <<endl;
       for (int i=0;i<3;i++)//输出数组array1
       {
          for (int j=0;j<2;j++)
         {
             cout <<setw(2) <<array1[i][j];
          }
          cout <<endl;
       }
       cout <<"array2" <<endl;
       for (int k=0;k<3;k++)//输出数组array2
       {
          for (int l=0;l<2;l++)
          {
             cout <<setw(2) <<array2[k][l];
          }
          cout <<endl;
       }
       return 0;
    }

    运行结果:
    array1
    4 2
    5 6
    13 4
    array2
    4 2
    5 8
    6 8

    我们可以看出,所谓按顺序初始化就是先从左向右再由上而下地初始化,即第一行所有元素都初始化好以后再对第二行初始化。而按行初始化则是用一对大括号来表示每一行,跳过前一行没有初始化的元素,在行内从左向右地进行初始化。对于没有初始化的元素,则都是一个不确定的值。

    省略第一维的大小

    我们在第一节学到,一维数组的大小可以省略。可是二维数组的元素个数是行数和列数的乘积,如果我们只告诉电脑元素个数,电脑无法知道究竟这个数组是几行几列。所以,C++规定,在声明和初始化一个二维数组时,只有第一维(行数)可以省略。比如:
        int array[][3]={1,2,3,4,5,6};
    相当于:
        int array[2][3]={1,2,3,4,5,6};

    二维数组在内存中的存储情况

    先前已经说明,内存是依靠地址来确定内存中的唯一一个存储单元的,即只有一个参数。所以在内存中,所有的数据都是像一维数组那样顺序存储的。那么具有两个下标的二维数组是怎样存放到内存中的呢?

    在内存中,先将二维数组的第一行按顺序存储,接着就是第二行的数据,然后是第三行的数据……右图(图7.4)所示的就是一个二维数组在内存中的存储情况。

    向函数传递二维数组

    我们知道,数组作为参数传递给函数的是数组首元素的地址。对于二维数组来说亦是如此。不过有两个问题,一个是我们必须让函数知道行数和列数,这就像我们要让函数知道一维数组的大小一样,防止发生越界访问。另一个就是我们必须让电脑知道这个二维数组是怎样的一个表格,即必须告知数组的列数。这和只能省略二维数组的行数道理是一样的。下面我们就来看一个向函数传递二维数组的程序:
    #include "iostream.h"
    #include "iomanip.h"
    void disp(int a[][2],int r,int c);//告知数组的列数
    int main()
    {
       int array[3][2]={4,2,5,6,3,1};
       cout <<"array" <<endl;
       disp(array,3,2);
       return 0;
    }
    void disp(int a[][2],int r,int c)
    {
       for (int i=0;i<r;i++)
       {
          for (int j=0;j<c;j++)
          {
             cout <<setw(2) <<a[i][j];
          }
          cout <<endl;
       }
    }

    运行结果:
    array
    4 2
    5 6
    3 1

    二维数组转化成一维数组

    有些时候,我们觉得用二维数组来描述一样事物很方便。比如我们用二维数组来画一个迷宫地图,行下标和列下标就如同直角坐标系一样。可是在某些情况下,不能使用二维数组,或者难以制造一个二维数组。二维数组在内存中的存储情况和一维数组是相同的,所以我们只好用一个一维数组来代替它了。

    于是,我们不难总结出一个结果,一个二维数组元素a[x][y]在一维数组b中,是:
        a[x][y]=b[x*列数+y]
     
     
     
     
     
     
     
     
  • 相关阅读:
    golang通知协程退出
    Linux Centos7下安装Elasticsearch
    es
    Laravel 别名 Facades的用法
    SVN使用时遇到的小问题
    http 重定向到 https
    Git-版本回退
    selenium---上传文件(非input标签)
    selenium---生成BeautifulReport报告
    windows搭建ngnix图片服务器
  • 原文地址:https://www.cnblogs.com/huhu0013/p/3934467.html
Copyright © 2011-2022 走看看