一、列指针(竖为列)
1、列指针相关定义
列指针:被称为是指针变量指向二维数组的某个元素
一般使用时会有如下定义:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p;
而上述代码定义的指针p,一般按照下表方式指向二维数组a中的元素:
语法 | 样例 | 说明 | |
指向任意元素 | 指针变量=&数组名[下标1][下标2] | p=&a[1][2] | p指向的元素为7 |
指向首元素 | 指针变量=&数组名[0][0] 指针变量=*二位数组名 | p=&a[0][0] 或p=*a | p指向首元素,即数值1所在的位置 |
当指针p指向二维数组a的首元素后,p+1指向第2个元素,p+2指向第三个元素,如下表:
p(对应的内容:1) | p+1(对应的内容:2) | p+2(对应的内容:3) | p+3(对应的内容:4) |
p+4(对应的内容:5) | p+5(对应的内容:6) | p+6(对应的内容:7) | p+7(对应的内容:8) |
p+8(对应的内容:9) | p+9(对应的内容:10) | p+10(对应的内容:11) | p+11(对应的内容:12) |
因为这种定义下的指针p,每执行加1操作后,将会指向下一列的一个元素,因此称为“列指针”
2、列指针公式
当指针p指向了M行N列的二维数组a,则其中任意一个元素a[i][j]的相关信息可以表示为:
元素名称 | 元素地址 | 元素内容 |
a[i][j] | p+i*N+j | *(p+i*N+j) |
二、行指针(横成行)
1、行指针相关定义
行指针:指针变量指向二维数组的某一行
一般使用时,有如下定义:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];//定义行指针,其“4”要和定义的二维数组的列数目“4”相同
p=a; //行指针p指向二维数组a的首行
对于行指针,可以按如下解释理解:
可以将二维数组的首行视为一个特殊的元素,而这个特殊的元素其实就是一个一维数组。那么上述代码定义的二维数组即为一个由三个特殊元素组成的“一维数组”。此时a即是这个一维数组的名称,按照一维数组的定义及知识可得,a是这个一维数组的数组名,也是首地址,也就是第一个元素的地址,也就是第一行的首地址,指的是首行一整行。所以,a+0.a+1,a+2都是行指针。(橘黄色和橘黄色对应,绿色和绿色对应)
所以就有如下表格(描述指向各行的行指针):
表示方法 | 说明 | 指针类型 |
a或者a+0 | 指向第0行 | 行指针 |
a+1 | 指向第1行 | 行指针 |
a+2 | 指向第2行 | 行指针 |
有了行指针之后,我们以第0行为例,展开说明行里的各个元素的表示方法等:
表示方法 | 说明 | 指针类型 |
a[0] | 是一维数组名称,首地址,第0个元素的地址(a[0]+0) | 列指针 |
a[0]+1 | 第0行,第1个元素 | 列指针 |
a[0]+2 | 第0行,第2个元素 | 列指针 |
a[0]+3 | 第0行,第3个元素 | 列指针 |
注:为了方便起见,我这里的元素排序从0开始,即第0个,第1个,与数组的下标对应。
2、行指针公式
当指针p指向了M行N列的二维数组a,则其中任意一个元素a[i][j]的相关信息可以表示为:
元素名称 | 元素地址 | 元素内容 |
a[i][j] | *(a+i)+j或a[i]+j | *(*(a+i)+j)或*(a[i]+j) |
注:元素a[i][j]的地址可表示为a[i]+j,由于a[i]等价于*(a+i)(根据一维数组的定义可知),因此其地址可表示为*(a+i)+j。
至此,行指针与列指针的的区别介绍完毕!
三、列指针和行指针的联系
先明白两个前文说的两个事情:
行指针:指的是一整行,不指向具体元素。
列指针:指的是二维数组中某一行的某个具体元素。
可以将列指针认为是行指针的具体元素,行指针是列指针的地址。
两者间的具体转化:
*行指针--->列指针
&列指针--->行指针
*是指针运算,&取址运算。*后面必须是指针变量,&后面则什么变量都可以。
行指针代码:
#include<stdio.h>//行指针输入8个元素,再输出
int main()
{int a[2][4];//定义二维数组int i=0,j=0;int (*p)[4];//定义行指针p=a;//将行指针指向二维数组第0个元素int n=0;for(i=0;i<2;i++){for(j=0;j<4;j++){scanf("%d",*(p+i)+j);//输入数字}}//p=a;for(i=0;i<2;i++){for(j=0;j<4;j++){printf("%2d",*(*(p+i)+j));//输出n++;if(n%4==0)printf("\n");}}return 0;
}
参考:RockeyQin 行指针和列指针详解