二维数组
1、二维数组的内存映像
(1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的,由多个内存单元组成。
(2)从内存角度来看,一维数组和二维数组没有本质差别。
(3)二维数组int a[2][5]和一维数组int b[10]其实没有本质差别。我们可以把两者的同一单元的对应关系写下来。
a[0][0] a[0][1] a[0][4] a[1][1] a[1][4]
b[0] b[1] b[5] b[6] b[9]
(4)既然二维数组都可以用一维数组来表示,那么二维数组存在的意义和价值在哪里?
二维数组和一维数组在内存使用效率、访问效率上是完全一样的。在某种情况下使用二维数组而不使用一维数组的原因在
于二维数组好理解、代码好写、利于组织。
(5)总结:我们使用二维数组(C语言也提供二维数组),并不是必须,而是一种简化编程的方式。其实一维数组的出现
其实也不是必然的,也是为了简化编程。
2、哪个是第一维,哪个是第二维?
(1)二维数组int a[2][5]中,2是第一维,5是第二维。
(2)结合内存映像来理解二维数组的的第一维和第二维的意义。首先第一维是最外边一层的数组,所以int [2][5]这个数
组有两个元素;其中每一个元素又是一个含有5个元素的数组(这个数组是第二维)。
(3)总结:二维数组的第一维是最外部的那一层,第一维本身是个数组,这个数组存储的元素也是一个数组;二维数组的
第二维是里边的那一层,第二维本身是个数组,这个数组中存的元素是普通元素,第二维这个数组本身作为元素存储在第一
维的数组中。
3、二维数组的下标式访问和指针式访问
(1)一维数组的两种访问方式:以int b[10]为例,int *p = b;
b[0]等同于*(p + 0); b[9]等同于*(p + 9); b等同于*(p + i);
(2)二维数组的两种访问方式:以int [2][5]为例,(合适类型的)p = a;
a[0][0]等同于*(*(p + 0) + 0); a[j]等同于*(*(p + i) + j);
4、二维数组的定义方式
第一种:int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
第二种:int a[2][5] = {1,2,3,4,5,6,7,8,9,10};
int *p = a;//编译器会报错的,因为类型不匹配
|