c++二维数组和二级指针

#include <iostream.h>
void main()
{
int a[2][3];
int**p=a;
}

请问为什么是错误的??(请不要说数组名是一个指针这个我知道,我想知道为什么不能用二级指针指向二维数组)

第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];
第2个回答  2009-11-25
类型不匹配,一个是双重指针,一个是指针。

int **p=(int **)a;就可以了
第3个回答  2009-11-25
指针必须指向指针类型的值,否则编译器会提示出错。
int**p =a的效果为:*p=&a[0],或p=&(&a[0])),但你要注意,&a[0]是a[0]的地址,而不是一个变量或常量,你问他地址,把它赋给p,编译器也不知道给你什么值啊
相似回答