说明:指针变量中“*”的作用:
1.声明指针变量
2.取相应地址的内容
//要学会运用行列指针引用二维数组元素就要先理解二维数组的行列地址,下面对二维数组的行列地址进行解释。
一.二维数组的行列地址
就以二维数组啊a[3][4]为例:
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
行地址
二维数组名a可看做一个双重指针,a[i]为二维数组i+1行的首地址,a[i]可看做一个指向含有四个元素数组的数组指针。故二维数组名a为二维数组第一行的首地址的地址。以此类推,a+i为二维数组第i+1行的首地址的地址。即:
a+1(&a[1]),a+2(&a[2]),a+i(&a[i])
a[0] | 第一行的首地址 |
a[1] | 第二行的首地址 |
。。。 | 。。。 |
列地址
在行地址的基础上,进行加减运算,便是列地址
a[0]+0—— a[0][0]的地址 | a[0]+1 ——a[0][1]的地址 | 。。。 |
。。。 | 。。。 | 。。。 |
二.用行指针和列指针引用二维数组
行指针
int (*p)[4];//定义了一个指向含有四个元素的数组的数组指针
p=a;//将a的地址赋给了指针变量p;等效于p=&a[0];
经过上述定义后,对于二维数组中的元素a[i][j],就可运用以下几种行指针的方式来表示啦:
1.*(p[i]+j)
2.*(*(p+i)+j)
3.(*(p+i))[j]
可以通过下图(二维数组与相应指针在内存中的储存方式)加深对行指针表示元素的理解
内容 | 地址 |
a[i][0] | &a[i][0] |
&a[i][0] | a[i]数组指针 |
a[i] | a+i |
列指针
运用列指针,就要将二维数组视为一长串连续的一维数组
int *p;
p=*a;//等价于p=a[0];p=&a[0][0];
经过上述定义后,对于二维数组中的元素a[i][j],就可运用以下几种列指针的方式来表示啦:
1.*(p+i*n+j)
2.p[i*n+j]