(CED)列指针与行指针的联系与区别

一、列指针(竖为列)

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  行指针和列指针详解

  • 35
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liO_Oil

打赏我,开启隐藏模式。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值