二维数组a,a[i],*(p+i)等价,他们都是一维数组的首地址。a[i]+j和*(p+i)+j的值都是a[i][j]的地址,*(a[i]+j)或*(*(p+i)+j)即为a[i][j]。
Datatype *p
Datatype是某数据类型,因为p是指向Datatype的,所以显然p++的操作就让p指向的区域移动了sizeof(Datatype)个字节
int a[3][4],(*p)[4];
中的p指向的元素是一个长度为4的数组,对于a[3][4],你也可以这么看,a[3]是一个一维数组,它的元素是长度为4的数组,显然p指向的元素和a对应了
a[3][4]在内存中的储存顺序:
a[0][0],a[0][1],a[0][2],a[0][3],
a[1][0],a[1][1],a[1][2],a[1][3],
.....
一开始p指向a[0][0]这个地址,p++之后,因为p要移动4个int的大小,也就是移动到了a[1][0],如果p指向int:int *p),p++后p只要移动一个int的大小也就到了a[0][1]
PS:如果指针和数组对应引用元素的时候用数组的形式也可以,看起来方便些.比如
int a[3][4],(*p)[4];
p=a;这样要引用a[i][j]就可以直接写p[i][j]当然也可以*(*(p+i)+j)
[此贴子已经被作者于2006-7-8 8:48:03编辑过]