第1个回答 2009-11-25
char x[3],此x是什么类型?答曰:char[3]类型,即此类型的变量内存组织形式为三个连续的char变量,sizeof(a)值为3,这就是一维数组,其实写char[3] x这种更合适。C语言里没有二维数组,或者说是由一维数组实现的。a[2][3]即是存储两个char[3]类型的元素(不是指针,之前说错了),承接上面说的,定义成char[3] a[2]更合适。如果char a[3]这样定义的a可以退化成指针char *的话,那么char[3] a[2]中的a就应该退化成char (*)[3],事实也是如此。
char ** 与char (*)[3],类型差得还是比较远的(编译器认为),当然强制转换的话任何指针都是可以互相转换的。 强制转换的话,二级指针可以指向二维数组,但注意不要越。甚至一维指针也是可以的,如
int a[2][3] = {{1,2,3},{4,5,6}};
int i=0;
int * p = (int *)a;
for(;i<6;++i)
printf("%d",*(p++));
绝对正确打印123456,因为二维数组实际上也是一段连续的内存,即int a[2][3]在内存上完全等价于int a[6],如果首地址相同的话。
PS:
动态申请二维数组方法如下:
char **p;
int x,y;//程序运行时初始化
...
p = new (char *)[x];
for(i = 0;i<x;++i)
p[i] = new char[y];