这是整形数组指针....
#include <stdio.h>
void main()
{
int a[2][2]={{1,2},{3,4}};
int (*p)[2];
int i,j;
p=a;
i=1;
j=1;
printf("%d\n%d\n%d\n%d\n",*p,*p+1,*p+2,*p+3);
printf("%d\n%d\n%d\n%d\n\n",*p,*p+1,*(p+1),*(p+1)+1);
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
getch();
}
在这里就要说到多维数组的内存地址分配了,
例如a[2][2],它在内存中分配的是一片连续空
间,假如首地址a即a[0][0]的地址为56,
那a[0][1]即为58,a[1][0]为60,
a[1][1]为62,所以在程序中
printf("%d\n%d\n%d\n%d\n",*p,*p+1,*p+2,*p+3);
显示出的就是数组各元素的地址值.大家也看到了
下面这句也可以得到同样的结果
printf("%d\n%d\n%d\n%d\n\n",*p,*p+1,*(p+1),*(p+1)+1);
所以这一句才是按数组下标访问多维数组的正确方式.
为什么呢?
因为int (*p)[2];定义的是一个指针数组,即此数组的任一
元素值也是一个指针,楼主程序中
printf("a[%d,%d]=%d\n",i,j,*((*p+i)+j));
这句中的(*p+i)因为*优先级高过+的优先级,所以是先取*p
的值,再进行加1.那*p的值是多少?是56,它+1即后移
一元素是多少?是58,*((*p+i)+j)中,58再后移一个是
60,对应的数组第三个元素,即3.故楼主程序结果是3.
*(p+1)是先把地址移动到数组的第二维上即a[1][0],再取出
其值,在这个值上+1即*(p+1)+1,这才移动到楼主想要的位置.
讲得有点晕,不知大家有看的明白不.呵呵..