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

线与面

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

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

那么什么时候要用二维数组呢?一般有两种情况, 一种是描述一个二维的事物。比如用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]

C++二维数组讲解、二维数组的声明和初始化相关推荐

  1. java 一维数组_Java 之 一维数组

    一.声明与初始化一维数组 1.声明(两种方式) 数组元素类型 数组名称[]; 数组元素类型[] 数组名字: 数组元素类型:决定了数组的数据类型,即数组要存放什么类型的数据,可以是基本数据类型和引用数据 ...

  2. oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化

    定义: int *pia = new int[10]; //array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该 ...

  3. 【C语言】数组的基本知识详细讲解(一维数组、二维数组、越界、存储.....

    接着上次的操作符的详解,让我们来简单了解C语言里的数组. 目录 一维数组的创建和初始化 一维数组的使用 一维数组的存储 二维数组的创建与初始化 二维数组的存储 数组的越界 总结 一维数组的创建和初始化 ...

  4. 一、二维数组的使用以及数组的几种排序算法讲解

    数组的使用 Eclipse 安装教程 HelloWrold 数组 特点 分类 快速上手 数组的查找 排序算法 衡量排序算法的优劣 分类 内部排序 外部排序 排序的五大特征 冒泡排序 Arrays工具类 ...

  5. c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?

    C++| 匠心之作 从0到1入门学编程[免费]​yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...

  6. php 数组与数组之间去重,PHP开发中一维数组与二维数组去重功能实现教程

    本篇文章讲述了PHP实现一维数组与二维数组去重功能示例.希望对在php学习和开发的同学有所帮助! 数组中重复项的去除 一维数组的重复项: 使用array_unique函数即可,使用实例如下: ? $a ...

  7. javascript二维数组转置_VBA数组拆分及维数的转换

    不以物喜,不以己悲,看庭前花开花落,宠辱不惊.淡然,是人生的最高境界,是对人生的态度,是一种风度,一种力量,一种原则.淡若清风,是现在需要的态度.静下心,为后疫情时代做知识的储备,后疫情时代将演绎一场 ...

  8. C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】

    所谓数组,是指将那些具有相同类型的.数量有限的若干个变量通过有序的方法组织起来的一种便于使用的形式.数组属于一种构造类型,其中的变量被称为数组的元素.数组元素的类型可以是基本数据类型,也可以是特殊类型 ...

  9. 如何利用一维数组实现二维数组的多列自由升降序排序过程详解

    如何利用一维数组实现二维数组的多列自由升降序排序过程详解 本例只说明多列排序的实现方式,一维数组的排序已经有过讲解不在赘述.所以本文是在已经完成了一维数组排序的函数封装的基础上完善多列排序的过程的详解 ...

最新文章

  1. python3 bytes和bytearray总结
  2. removelogo使用方法_怎么给视频去水印?这三种方法简单又高效
  3. 多线程导出excel_【开源资讯】MyExcel 3.7.0 发布,屏蔽多线程处理细节
  4. 【今晚7点】:圆桌PI回归 继续聊聊开源的故事
  5. html不继承父级背景色,javascript – 如何获取从父元素继承的计算背景颜色样式...
  6. 常见的几种异常类型-熟记
  7. Mac安装apktool/dex2jar/jd-gui逆向工具
  8. python库--pandas--Series
  9. Linux如何运行exe驱动,在Linux下可用Wine安装和运行360驱动大师、CCleaner
  10. 三星note10 android q,【极光ROM】-【三星NOTE10/NOTE10+/5G N97XX-9825】-【V6.0 Android-Q-TG1】...
  11. PHP简单同学录(连接数据库)
  12. JavaScript prototype原型实现继承
  13. dos命令查看电脑配置
  14. 题解报告:hdu 2647 Reward(拓扑排序)
  15. 雷锋工厂模式(笔记)
  16. 我也写写致青春观后感
  17. 图像分割之常用损失函数-Dice Loss
  18. 宝塔Linux面板问题QA汇总
  19. 面试题之利用call或者apply实现bind功能
  20. SQL Server全外链接

热门文章

  1. python 怎么爬桌软件数据_如何利用Python爬取并分析红岭创投的数据?
  2. Spring事务管理(详解+实例)
  3. 你必须学会的Git入门基本操作
  4. 论文返修(response letter)最有用的开场白
  5. Python-OpenCV 处理图像(四)(五):图像直方图和反向投影 图像中边界和轮廓检测
  6. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
  7. 第六章 深度学习(中下)
  8. Python的冷技巧小技巧
  9. 排序算法:希尔、归并、快速、堆排序
  10. 视频转码能力哪家强?腾讯云、阿里云、七牛云多维度对比