C语言指针与二维数组

C语言指针与二维数组
设有m行n列的二维数组
当二维数组的首地址给指针变量p以后,则访问某个元素a[i][j]可以用一下几种方式来访问

*(p+i*n+j),
p[i*n+j],
*(a[0]+i*n+j)

二维数组a不可赋值给一般指针变量p,只能赋值给指向二维数组的行指针变量

#include <stdio.h>

int main(){

	int a[2][3]={{1,2,3},{4,5,6}};
	int *p,i,j;
	p = &a[0][0]; //也可以写成p=a[0];p指向二维数组a的第一个单元
	for(i=0;i<2;i++){
		for (j=0;j<3;j++)
		{
			printf("a[%d][%d]=%d\n",i,j,*(p+i*3+j));
		}
		printf("\n");
	}
	printf("%d\n",*(a[0]+1));//a[0]+1 代表a[0][1]的地址,就是&a[0][1] 推论 a[i]+j  就是a[i][j]的地址  *(a[0]+1) 就是a[0][1]的值
	printf("%d %d %d\n",a[1],*a+1,**(a+1));
	return 0;
}
/************************************************************************/
/* a[i] 即 *(a+i)可以看成 一维数组a[i]的地址&a[i]   
   a[i] 也可以看成二维数组的首地址&a[i][0]                                                                  */
/************************************************************************/

/************************************************************************/
/* a[i][j]等价形式

a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]                                                                    */
/************************************************************************/

/************************************************************************/
/* p指针引用a[i][j]  int (*p)[];

p[i][j]
*(p[i]+j)
*(*(p+i)+j)
*(*(p+i))[j]                                                                                                     */
/************************************************************************/