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

线与面

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

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

那么什么时候要用二维数组呢?一般有两种情况, 一种是描述一个二维的事物。比如用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. 大雁塔为什么七层_西安旅游的打卡景点,大雁塔是干嘛的?怎么来的?
  2. Spring的单元测试
  3. 'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件
  4. CodeForces 516E Drazil and His Happy Friends(数学+最短路)
  5. 列表生成式,生成器表达式,模块的使用
  6. 自信不疑的人不会做的15件事
  7. ×××保障再上层楼:侠诺×××备援实例
  8. 小米变了?红米Note7今日开售 坚持了9分36秒...
  9. 开发黑名单功能demo_突然让你开发Electron应用-electron特性练习操场-所见即所得的electron...
  10. 在excel工作表中c1单元格_Excel工作表中的11个逻辑函数应用技巧,中文解读,动图演示!...
  11. ABP .Net Core 部署到IIS 问题汇总
  12. Predicting Lymph Node Metastasis Using Histopathological Images Based on Multiple Instance Learning
  13. PHP slideup,jQuery.slideUp() 函数使用详解
  14. linux终端下如何分屏,ubuntu terminal 终端分屏
  15. Typora崩溃 与 设置备份
  16. ArcGIS教程:区域填充
  17. 网络攻防-20169213-刘晶-第五周作业
  18. 学习 Java ,是看书学习快,还是看视频学习快呢 ?
  19. 大佬分享:180+道Java面试题目!含答案解析!
  20. 程序员爆笑瞬间:不小心把“上传”按钮写成了“上床”……

热门文章

  1. 本月 上月 php,显示本月,上月,今天,今年以及各时间起点与
  2. 漫谈promise使用场景
  3. 《深度探索C++对象模型》--2 构造函数语意学
  4. 【c++】13.必须用指针取值的情况.md
  5. Git 分支 - rebase 变基
  6. Maven的pom文件那些事
  7. 彻底理解JAVA动态代理
  8. 鸟哥的Linux私房菜(服务器)- 第五章、 Linux 常用网络指令
  9. 排序算法:希尔、归并、快速、堆排序
  10. 【OpenCV3】图像最大轮廓检测——cvFindBiggestContour()封装