令人疑问的二维数组问题,望师哥指点!!!!
源代码
int a[6][6]={5};
int *(*b);
b=(int **)a;
cout < <a < <endl < <*a < <endl < <**a < <endl < <b < <endl;
cout < <(*b) < <endl < <a[2][1] < <endl;
结果:
0x0012FEF0
0x0012FEF0
5
0x0012FEF0
0x00000005
0
结果*b为什么是0x00000005
而**b为什么不能访问???
b为什么不能和a一样使用(如b[1][2]等)
望师哥指点,偶是学生,水平太菜。。。。谢谢
[解决办法]
/*搞清楚最基本的指针,复杂的就好解决了.
int a;
int *pa=&a;
int **ppa=&pa;
int ***pppa=&ppa;
也就是说,多级指针总是由一串指针形成的指针链指向最终的数据.只要其中的某个环节指向了非法的地方就出错了.
这里:
*pppa得到ppa
**pppa得到pa
***pppa得到a
由双指针动态生成的模仿2维数组,虽然在访问上跟2维数组一样,但语意是不一样的.
int ** arr;*/
int main()
{
typedef int* pt;
const int row=10;
const int col=20;
int ** arr;
arr=(int **)malloc(sizeof(pt)* row);
for(int i=0;i <row;++i)
{
arr[i]=(int*)malloc(sizeof(int) * col);
}
//这时就生成了一个10行20列的动态数组.
for(int r=0;r <row;++r)
{
for(int c=0;c <col;++c)
{
arr[r][c]=r*c;//虽然它的访问方式方法和普通的2维数组相同
//但实际的逻辑和结构是不同的
//第一,相邻两行的头尾不一定象普通的2维数组是连续的
//(当然也可采用一定方法做为连续的)
//第二,多了10个行指针.也就是说,arr[r]实际上得到10个行指针.
//arr[r][c]分别得到第r个行指针指向的一维数组.
}
}
return 0;
}
[解决办法]
分析一把
int a[6][6]={5};
int *(*b);
b=(int **)a;
cout < <a < <endl < <*a < <endl < <**a < <endl < <b < <endl;
cout < <(*b) < <endl < <a[2][1] < <endl; 由于b指向的a,*b是取当前地址的内容,也是一个地址,正好4个字节是0x00000005,所以**b就没有办法访问了.