问个指针的有关问题

问个指针的问题
现有如下代码:
char   cArray1[3][2]={{1,1},{2,2},{3,3}};
char   cArray2[2][2]={{4,4},{5,5}};
char**   pArray2DArray[2]={(char**)cArray1,(char**)cArray2};
int   nLengthArray[2]={3,2};

char**   p2DArray;
char   cTemp;
for   (int   i=0;i <2;++i)
{
p2DArray=pArray2DArray[i];
for   (int   j=0;j <nLengthArray[i];++j)
{
cTemp=???
}
}
我想得到cArray1数组里面的值,打问号的地方该怎么写?
请大家指教!


------解决方案--------------------
a[i]从形式上看是a数组中的第i个元素。如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元的内容。a[i]是有物理地址的,是占内存单元的。但如果a是二维数组,则a[i]是代表一维数组名。它只是一个地址(如同一维数组名只是一个指针常量一样。) a,a+i,a[i],*(a+i),*(a+i)+j,a[i]+j都是地址。 *(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]的值。
举例说明一下:
int a[3][4]={…………};
a,*a; 第0行首地址和0行0列元素地址
a[0],*(a+0); 第0行0列元素地址
&a[0],&a[0][0];第0行元素首地址和0行0列元素地址
a[1],a+1; 第1行0列元素地址和1行首地址
&a[1][0],*(a+1)+0; 1列0行元素地址
a[2],*(a+2);2行0列元素地址
&a[2],a+2;第2行元素首地址
a[1][0],*(*(a+1)+0);第1行0列元素的值。
------解决方案--------------------
二维数组 和 指针的指针 是不同的概念,他们的内存布局是完全不一样的,不能混这用!

多维数组是数组的数组,绝对不是指针的指针(我周围就有人是这么认为的);也不是指针的数组(main 的 argv 参数是一个指针的数组);但在某些情况下可以认为是数组的指针.可能有些乱,可以用下表来描述一下:

类型 在某些情况下认为是
数组 指针
数组的数组 数组的指针
指针的数组 指针的指针
数组的数组的数组 数组的数组的指针
指针的数组的数组 指针的数组的指针


http://www.adintr.com/subject/blog/index.htm?id=43&view=articles 上有图画出了二维数组和指针的指针之间的区别
------解决方案--------------------
ctemp=*p2DArray(*(p2DArray+j)+i) //应该是ctemp=*(*(p2DArray+j)+i)吧?
ctemp=p2DArray[j][i];

这两句都不对,p2DArray只是指向指针的指针,p2DArray + 1 之后p2DArray的值加4,而如果cArray1 + 1 的话,cArray的值加8。

adlay(www.adintr.com)(无可奈何天)说得很明白,二维数组 和 指针的指针 是不同的概念,他们的内存布局是完全不一样。
------解决方案--------------------
上面第一句改为
char* pArray2DArray[2]={&cArray1[0][0], &cArray2[0][0]};
更合理一些。
------解决方案--------------------
不好意思,上面说错了,我宿舍哥们做了一下总结:
一维数组名就是一个指针,但是二维数组名也是一个指针,不同的是他是一个二维指针,二维指针可以看成是由一维指针构成的。
int a[2][2];
a可以看成由两个一维指针a[0],a[1],所以四个元素可以用如下形式表示出来:
*a[0]=a[0][0],*(a[0]+1)=a[0][1];
*a[1]=a[1][0],*(a[1]+1)=a[1][1];
但是a+1 表示加一维,a原来指向a[0],加一就指向a[1]了;

( *ptr )[2]是一个二维指针,指向a后ptr+1表示加一行,就是数组的一维,这样
*(*(ptr)),*(*ptr+1))
*(*(ptr+1)),(*(ptr+1)+1))
分别表示上面数组的四个元素
其中
*ptr=a[0];
*(ptr+1)=a[1];
对比一下可以发现他们是等同的。

**ptr是一个二重指针跟二维指针是有区别的
ptr=(int**)a;虽然没有语法错误,但是是没有意义的,这样转后配ptr指向a

cout < <*((*ptr+1)+1) < <endl
*ptr=a[0][0]=1;(*ptr+1)+1=3
由于ptr是二重指针,*ptr指向的区域是地址(*ptr+1)+1=3,而取地址3指向的值肯定会报一个内存违规的错误。