指针与二维数组
数组法及其变式
1 2 3 4 5 6 7 8 9
| a==a+0==&a[0]; *a==*(a+0)==a[0]; a+1==&a[1]; *(a+1)==a[1];
a[0]+1==&a[0][1]; *(a[0]+1)==a[0][1];
*(a+1)+2==&a[1][2]; *(*(a+1)+2)==a[1][2];
(*(a+1))[2]==a[1][2];
|
列指针法
1 2 3 4 5 6 7 8 9 10 11 12
| int *p;
p=a[0] ; p=*a ; p=&a[0][0];
p=a[i][j];p=a[2][1];
*(p+i*n+j)==a[i][j]; p+i*n+j==&a[i][j]; p[i*n+j]==a[i][j];
|
|
语法 |
样例 |
说明 |
| 指向任意元素 |
指针变量=&数组名[下标1][下标2] |
p=&a[1][2] |
p指向的元素为7 |
| 指向首个元素 |
指针变量=&数组名[0][0] 指针变量=*二维数组名 |
p=&a[0][0]或p=*a |
p指向首个元素,即数值1所在位置 |
| p |
p+1 |
p+2 |
p+3 |
| p+4 |
p+5 |
p+6 |
p+7 |
| p+8 |
p+9 |
p+10 |
p+11 |
| 表示方法 |
说明 |
指针类型 |
| a[0] |
是一维数组名称,首地址 第0个元素地址(a[0]+0) |
列指针 |
| a[0]+1 |
第0行,第1个元素 |
列指针 |
| a[0]+2 |
第0行,第2个元素 |
列指针 |
| a[0]+3 |
第0行,第3个元素 |
列指针 |
行指针法
1 2 3 4 5 6 7 8 9 10 11
| int (*p)[4];
p=a; p=&a[0];
p[i][j]==a[i][j]; *(*(p+i)+j)==a[i][j]; *(p+i)+j==&a[i][j]; *(p[i]+j)==a[i][j]; p[i]+j==&a[i][j]; (*(p+i))[j]==a[i][j];
|
二维数组的名字默认是行指针
| 表示方法 |
说明 |
指针类型 |
| a或a+0 |
指向第0行 |
行指针 |
| a+1 |
指向第1行 |
行指针 |
| a+2 |
指向第2行 |
行指针 |
行指针和列指针的联系
行指针:指的是一整行,不指向具体元素。
列指针:指的是二维数组中某一行的某个具体元素。
可以将列指针认为是行指针的具体元素,行指针是列指针的地址。
两者间的具体转化:
*行指针—>列指针
&列指针—>行指针
| 行指针 |
转换成:列指针 |
| a或a+0 |
*a或a[0] |
| a+1 |
*(a+1)或a[1] |
| 列指针解引用 |
内容等价表示 |
含义 |
| *a[0] |
*(*a) |
a[0][0] |
| *a[1] |
*( *(a+1)) |
a[1][0] |
| 某一行的列指针 |
转换成:某一行的行指针 |
| a[0] |
&a[0]或&a或&(a+0) |
| a[1] |
&a[1]或&(a+1) |
行指针和列指针转换试验结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| int *p;
p=a[0] ; p=*a ; p=&a[0][0];
p=a[i][j];p=a[2][1];
(&p)[i][j]==a[i][j]; *(*(&p+i)+j)==a[i][j]; *(&p+i)+j==&a[i][j]; *(&p[i]+j)==a[i][j]; &p[i]+j==&a[i][j]; (*(&p+i))[j]==a[i][j];
int (*p)[4];
p=a; p=&a[0];
*(*p+i*n+j)==a[i][j]; *p+i*n+j==&a[i][j]; (*p)[i*n+j]==a[i][j];
|
Harbin Institute of Technology, Shenzhen 计算机科学与技术 本科在读