指针可以替代数组名
1.在一维数组中:int a[9]; int *p=a;
一维数组名指向的是列!(后面总结,迷得话不用慌)
则想要获取a[i]的地址方法:a+i; 、p+i; 、p[i];
获取a[i]元素方法:*(a+i);、*(p+i);、*(p[i]);
2.在二维数组中:int a[4][9]; int (*p)[9]; p=a; //指针变量p指向包含4个整形元素的一维数组 //*p[9]是指针数组,后续文章介绍
二维数组名指向的是行!eg:a+1;//代表指向a[1][0]的地址
则想要获取a[i][0]的地址方法:a+i; 、p+i; 、p[i];
则想要获取a[0][i]的地址方法:*a+i; 、*p+i; ;
则想要获取a[i][j]的地址方法:*(a+i)+j; 、*(p+i)+j; 、*(p[i])+j;
则想要获取a[i][j]的元素方法:*(*(a+i)+j); 、*(*(p+i)+j); 、*(*(p[i])+j );
3.二维数组表现形式与对应地址:
二维数组难点
1.一维数组、二维数组对比:
一维数组名a指向列,a+1中的1表示向第一行的第一列后移一位,变成一行二列a[0][1];
二维数组名a指向行,a+1中的1表示向第一行下移一位,变成二行一列a[1][0];
2.二维数组指向行列变换(*、&):
a表示指向行(a[0][0]),a+1指向a[1][0];
公式:*指行 ->指列 、 &指列 -> 指行
*a,*(a+1)指向列:*a+1=a[0][1]; 、 *(a+1)+1=a[1][1];
&a[0]指向行(a[0]=a[0][0]):&a[0]+1=a[1][0];
( a[0] 与*(a+0)等价==》&a[0] 与&*a等价 == a,指向0行 )
3. int (*p)[4]; 在一维数组和二维数组中赋值:
一维数组:p=&a; //p指向一维数组,因为只有一列,所以:&指列->指行
(*p)[3] ==a[3];
二维数组:p=a; //p指向二维数组的0行
*(p[i])+j ==&a[i][j]; *(*(p[i])+j) ==a[i][j];
【C语言】指针表达进阶:指针在一维数组 二维数组的应用(如何用指针表达一维数组 二维数组的元素的地址 元素值)