指针与二维数组

指针与二维数组

数组法及其变式

1
2
3
4
5
6
7
8
9
//数组法1
a==a+0==&a[0]; *a==*(a+0)==a[0];
a+1==&a[1]; *(a+1)==a[1];
//数组法2
a[0]+1==&a[0][1]; *(a[0]+1)==a[0][1];
//数组法3
*(a+1)+2==&a[1][2]; *(*(a+1)+2)==a[1][2];
//数组法4
(*(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];

//列指针的使用方法:(a为m行n列的一个二维数组)
*(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];

//行指针的初始化(a为某数组)(二者任选其一即可)
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是列指针是吧 根据:&列指针==行指针 发现只有用[]的方法表示的时候才可以实现
(&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];

//行指针的初始化(a为某数组)(二者任选其一即可)
p=a; p=&a[0];

//目前p是行指针吧 根据:*行指针==列指针 发现均可以实现
*(*p+i*n+j)==a[i][j]; *p+i*n+j==&a[i][j];//试验可行
(*p)[i*n+j]==a[i][j]; //试验可行