// 输出二维数组的有关数据
#include <stdio.h>
int main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
int *p,i,j;
p = a[0];
printf("%d\t%d\t%d\t",a,*a,p); //0行首地址和0行0列元素地址
printf("//0行首地址和0行0列元素地址\n");
printf("\n");
printf("%d\t%d\t%d\t",a[0],*(a + 0),(p + 0)); //0行0列元素地址
printf("//0行0列元素地址\n");
printf("\n");
printf("%d\t%d\t%d\t",&a[0],&a[0][0],&p[0]); //0行首地址和0行0列元素地址
printf("//0行首地址和0行0列元素地址\n");
printf("\n");
printf("%d\t%d\t%d\t",a[1],a + 1,p + 4); //1行0列元素地址和1行首地址, p + 4才是指向1行0列
printf("//1行0列元素地址和1行首地址, p + 4才是指向1行0列\n");
printf("\n");
printf("%d\t%d\t\t",&a[1][0],*(a + 1) + 0); //1行0列元素地址
printf("//1行0列元素地址\n");
printf("\n");
printf("%d\t%d\t%d\t",a[2],*(a + 2),p + 8); //2行0列元素地址, p + 8才是指向2行0列
printf("//2行0列元素地址, p + 8才是指向2行0列\n");
printf("\n");
printf("%d\t%d\t\t",&a[2],a + 2); //2行首地址
printf("//2行首地址\n");
printf("\n");
printf("小结:指针是按存贮方式指向,p + 1则指向0行1列,p + 2则指向0行2列\n");
printf("因此,a[i][j]在数组中的地址为:p + (i * m + j),(每行有 m 个元素)\n");
for (p = a[0];p < a[0] + 12;p++) // 使 p 依次指向下一个元素
{
if((p - a[0]) % 4 == 0) // p 移动4交换行
{
printf("\n");
}
printf("%4d",*p); // 输出 p 指向的元素的值
}
printf("\n");
printf("\n");
p = a[0];
scanf("%d,%d",&i,&j); // 指定要输出的数组的行和列
printf("a[%d,%d] = %d\n",i,j,*(*(a + i) + j)); // 输出指定元素的值
printf("a[%d,%d] = %d\n",i,j,*(p + i * 4 + j)); // 输出指定元素的值
return 0;
}