二维数组是一种特殊的一维数组,由类型相同、长度相等的行一维数组组成,存储空间依次相邻。可有公式 loc(a[i][j]) = a +(i*列数+j)*sizeof(元素类型).计算出元素a[i][j]的地址。
二维数组名也代表指针,称为二维数组指针。这个指针与一维数组指针既有联系、又有区别。
例: int a[4][3];
a作为二维数组的首地址,他的基类型是int[3];大小是12byte,a+1是指向一维数组a[1]的指针,a+2是指向一维数组a[2]的指针,a+3是指向一维数组a[3]的指针,因此二维数组指针a也称为行指针,每加1移动一个行数组大小的字节数。
一维数组指针a[0]是指向第一个元素a[0][0],基类型是int,a[0]+1是指向a[0][1]的指针,a[0]+2是指向a[0][2]的指针,算术运算单位是4字节。因此,称一位数组指针是列指针,或一维指针。
二维数组名同样也有两种含义,既是首地址,也是整个二维数组变量空间的名称。指针&a的基类型是int[4][3],sizeof(a)的值为48。
二维数组要传址,只有行指针变量能接受,其基类型也必须是 int[3];
例:int (*p)[3];
p = a;
一维指针数组
所谓一维指针数组,就是数组元素为一维指针变量的数组。
例: char* a[5]; a是长度为5的一位字符型指针数组,一维数组元素a[0]、a[1]、a[2]、a[3]、a[4]都是一级字符型指针变量,他们各自可以指向一维字符数组(字符串)。
由定义,数组a的元素类型是char*,指向数组a的指针类型应是char**,称为二级指针。
char** pa;
pa = a;
为什么要介绍一维指针数组呢,通过一维指针数组与二维数组的比较,大家就会知道指针数组的好处。
例: char cColor[4][7] = {"white","red","orange","pink"};
char *pColor[4]={"white","red","orange","pink"};
cColor是一个4行7列的二维字符数组,共28个元素,占用内存28byte。pColor是指针数组,有4个元素,每个元素占4byte,用于存放指向字符串的指针,共占内存16byte。给二维数组赋值时,必须指明行和列(列长度是字符串长度+1),由于各个字符串的长度不一定相同,列长度必须是最长的那个,这将造成内存空间的浪费。
给指针数组赋值时,数组元素的大小都一定,为4byte,系统根据每个字符串的长短,各自分配合适大小的数组空间(这些数组空间可能不相邻),然后将字符串首地址赋给相应的指针数组元素。