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

2025-05-07 20:58:55
推荐回答(4个)
回答1:

类型不匹配,a 不是 int ** 类型的 ,虽然一维数组的数组名是一个指针 ,但是二维数组却不同 ,因为它所指向的东西是有大小的 ,举例来说 ,你这个 a 他是 int[2][3] 类型的 , 编译器需要知道要操作的单元的大小,就是说如果你用 p++; 的话编译器要能知道移动多少个字节,所以说可以改为:
int (*p)[3] = a ;
这样的话 p 所指向的每个数据单元大小便明确了

回答2:

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 p[i] = new char[y];

回答3:

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

回答4:

类型不匹配,一个是双重指针,一个是指针。

int **p=(int **)a;就可以了