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] */
/************************************************************************/