C++中的二维数组
之前在一维数组的时候,超市老板统计了各个商品的价格,并且按一定顺序排列下去,但是现在要优化,有准确统计出到底是那一个商品架上的第几个商品,那么肯定会出现这种情况,沐浴露在X号架-第X位,之前的统计表只能说是第X号的商品,现在通过改造后使得管理商品更加方便、更易于对商品定位,而且在统计更大的、需要清晰体现的数据时,这种方法往往会体现出一定的优点。
要说二维的话我们可以先从一维说起,一维可以看成是一条数轴:
既然在a数组中的每一个元素可以是除了void类型以外的数据类型,那我可不可以是一个数组,即一个一维数组里面的每个元素都是一维数组,这样的:
这样a数组里面一个元素就是一个数组,所以取值时如a[0]取得一个数组的地址,a[0][1]则是取得该数组中的第二个元素,可以这样理解:先走到某商品架,再从商品架中取得某一位置上的商品。
所以定义一个二维数组的格式是这样:数据类型 数组名[列数][行数](有些书籍可能是 [行数]在前);或者也可以这样定义:
#include<iostream>
using namespace std;
int main() {
typedef int m[5];//定义一个一维整数数组m
m n[3]; //定义一个是m类型的数组n,这时n就是一个二维数组了
//相当于
int n[3][5]//三个m类型的元素,而m又是一个数组,所以是有三个m数组。
}
///这里补充一下,一维数组也可以这样定义:
#include<iostream>
using namespace std;
int main() {
typedef int m;//定义一个整数变量m
m n[3]; //定义一个是m类型的数组n,这时n就是一个一维数组了
}
/
上面用typedef定义二维数组的例子,可以看成两个一维经过组合成二维数组。
定义了二维数组后,系统也会为它分配一块连续的内存空间,所以例如int类型的二维数组a[m][n](其中m、n必须是常量表达式)占的内存空间大小的计算方法如下:
sizeof(a);
或
m * sizeof(a[0]);
或
m* n * sizeof(int);
此计算二维数组所占内存大小的方法和计算一维数组所占内存大小的方法类似,可以参考我的博客中的文章《C++的一维数组》。
二维数组的初始化与一维数组的初始化类似,也用初值表,分两种初始化方式,一是嵌套初值表;二是线性初值表:
/一,下面是嵌套初值表:
#include<iostream>
using namespace std;
int main() {
typedef int m[5];//定义一个整型一维数组m
m n[3] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} }; //定义并初始化了一个是m类型的数组n,这时n就是一个二维数组了,相当于 int n[3][5].
}
在二维数组a[m][n]中,m为高维元素个数,n为低维元素元素:
int a[][3] = { {1,2,3},{4,5,6} };//省略了高维元素个数
只有高维元素个数可以省略,低维元素个数不可以省略。省略了高维元素个数时,其高维元素个数就是{}里面{}的个数,和一维数组省略了常量表达式一样。
/二,下面是线性初值表:
int a[2][3] = { 1,2,3,4,5,6 };//初始化了全部元素
int b[][3] = { 1,2,3,4,5,6,7,8,9 };
上面第一个初始化语句中,高维元素个数和低维元素个数都有标明,则初始表中最多能添加的元素个数是2*3=6;
上面第二个初始化语句中,高维元素被省略了,则 高维元素个数=向上取整(线性初始表元素个数/低维元素个数) (向上取整是不小于其的最小整数)例如 int i[][3]={1,2,3,4};的改为元素个数为2
///
二维数组的存取格式:
数组名[下标m][下标n];
下标都是从0开始,a[m][n]表示取得第m个数组中的第n个元素;
若定义数组a[m][n],则有 第一维大小为n,第二维大小为m,
所以
a[i][j]的排列位置为 第一位大小ni+j+1;
a[i][j]的地址为 a的起始地址+(第一维大小ni+j)*sizeof(数据类型)
数组的地址只可以读取,二维数组a[m][n]的地址表达式:
a[0]和a //为数组a的起始地址,即a[0][0]的地址
a[i] //为数组的第i+1行的地址,即a[i][0]的地址
a[i]+j //为数组的第i+1行的第j+1元素的地址,即a[i][j]的地址
a+k //为数组的第k+i行的地址,即a[k][0]的地址
地址的读取也可以用&标识符 如 a[i][j]的地址可以是:&a[i][j];
当然数组也可以是其他数据类型(除了void类型)。
///
当然一个一维数组的元素也可以是二维数组,这样就是构成了三维数组。
类似地可以构成多维数组。
这里就简单说一下三维数组,其实三维及以上的多维数组很少用到,二维在多数情况下也够用了。
三维数组可以这样理解:大学有很多栋宿舍楼,宿舍楼有很多层,每层有很多的房间,比如说 一间宿舍可以这样精确表示:一号宿舍楼的四层的六号房,在这里面就包含了三维关系。所以这样理解三维数组的话可能就容易点。
定义三维数组的方法有两种:
一、int a[2][3][5];//这样子也可以这样理解为 两栋宿舍楼,每一栋都有三层,每一层都有5个房间,这样每一个房间就存放一个元素,所以总的元素有235=30个;
二、
typedef int a[3][5];
a b[2];
先定义一个a[3][5]的类型
然后在定义一个存放二维数组的一维数组b 这样b就是一个三维数组相当于b[2][3][5];
三维数组的地址也和二维的类似
如:b[1][2]+4;//相当于b[1][2][4]的地址;
如果读取的地方超过个数组下标范围,则会获得其他地方的地址,这是就会获取得到其他的值,一维二维也会如此。
而关于地址的指向C++中有一种变量——指针,当指针指向的地址超出范围或者非理想的地址时,可能会对系统造成一些伤害,关于使用指针的文章也会发布在我的博客中。
(若对以上有任何异议的伙伴,可以在评论中提出,3Q!)