指针与二维数组的本质
基础:(指针与一维数组)本质: a[i]<=>*(a+i)变换: a[i]<=>*(a+i)<=>*(i+a)<=>i[a]
指针与二维数组:
1. 本质:type a[10],*p;
p=a;
以后,可以用P代替a,引用数组中的各元素,即瀀嬀椀崀 <=> a[i]; 设type类型为int[20]
type a,b;<=>int[20] a,b;<=>int a[20],b[20];
type a[10],*p;<=>int[20]a[10],*p;<=>int a[10][20],(*p)[20];
int *p[20];<=>int* p[20];<=>type p[20];猀椀稀攀漀昀(p)=80B(字节) p是由20个int*(整形指针)为数组元素组成的数组,p+1将移动4B;
int (*p)[20]; <=>int[20] *p;<=>type *p;猀椀稀攀漀昀(p)=4B(字节) p是一个指类(指针所指向的空间的数据类型)为int[20]的指针变量,p+1将移动80B;
int a[10][20];<=>int[20]a[10];<=>type a[10];愀是一个指类为int[20]的指针常量,a+1将移动80B;
int (*p)[20];指针变量的指类为int[20],意味着p+1将移动80B,相当于移动了a[10][20]整整一行的空间,所以变量p又称为行指针,因此,在a[10][20]中,数组名称
a,实质上就是“行指针”常量,且a+1将移动整整一行!又名:数组指针常量。
2. 二维数组的引用(行的引用)
char s[10][20];int i;
下标为i的那行首地址的表达(每一行首地址,等价于该行首元素首地址):
&s[0][0]<=>&*(s[0]+0)<=>s[0]+0<=>s[0];
&s[1][0]<=>&*(s[1]+0)<=>s{1]+0<=>s[1];
&s[2][0]<=>&*(s[2]+0)<=>s[2]+0<=>s[2];
...
&s[i][0]<=>&*(s[i]+0)<=>s[i]+0<=>s[i];
...
二维数组的“一维表现形式”正好对应那一行首地址。
3. int a[M][N],i,j;/*设i取值范围:[0,M),j的取值范围:[0,N),a[i][j]有一下几种合法表达式:
1) a[i][j]
2)*(a[i]+j)
3)*(*(a+i)+j)
4)(a[i])[j]
(*(a+i))[j]
4. 嵌套过程如下(基础: a[i]<=>*(a+i) ),
*(a+i)[j]
<=>*((a+i)[j])<=>*(*(a+i +j))<=>*(*(a+i+j)<=>*(*(a+(i+j)))<=>*(a[i+j])<=>*(a[i+j]+0)<=>a[i+j][0]