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]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。