数组指针和指针数组,行指针列指针

首先,需要理解一下数组指针指针数组这两个名词:

“数组指针”和“指针数组”,只要在名词中间加上“的”这个字,就知道中心了

数组的指针:是一个指针指向数组的指针
指针的数组:是一个数组装着指针的数组

还有一件事需要牢记:
优先级:()> [ ] > *

(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,
        这是“数组的指针”,即数组指针;
*p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,
       这是“指针的数组”,即指针数组。

根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。

综上所诉:
(*p)[n]:数组指针:是指针——指向数组的指针。
*p[n]:指针数组:是数组——装着指针的数组。

数组指针是一个指针变量,占有内存中一个指针的存储空间;
指针数组是多个指针变量,以数组的形式存储在内存中,占有多个指针的存储空间。

接下来讲解行指针与列指针:
这两种特殊的指针是针对C语言中的二维数组来说的。
二维数组,可以理解为数组的数组
所以对于一个数组:

int a[2][3] = {1,2,3,4,5,6};

他相当于:数组成员为一维数组的一维数组,这就是二维数组

int a[2][3] = {{1,2,3},{4,5,6}};

内存中的存储形式:
在这里插入图片描述
接下来引入一个概念:数组的首地址
比如a就是这个数组的首地址,首地址存储的是:这个数组的第一个元素的地址
而这个数组的第一个元素,就是这个数组里面的第一个一维数组
所以数组名a就是这个数组的第一行的地址,并不是指某个具体元素
而数组名a又是这个“特殊的”一维数组的名称,也就是首地址(常量地址),也就是第一个元素的地址
对于这种,我们称之为“行指针”。同理:a+0,a+1,a+2,都是行指针

接下来,我们来看其首行,首行的元素分别是:a[0][0],a[0][1],a[0][2],a[0][3]。
将其看作一个独立的一维数组,那么 a[0]就是这个数组的名称,也就是这个数组的首地址。
也就是第一个元素的地址,也就是a[0]+0。a[0]和a[0]+0都是指具体的元素。
对于这种,我们称之为列指针

综上所述:
行指针:指向某一行,不指向具体的元素。
列指针:指向行中具体的元素。

也就是说,列指针只要在同一行,不管它们指向这一行中的哪个元素,它们的行地址都是在同一行的地址,所以它们的行地址都一样

行指针转换成:列指针列指针等价表示内容内容等价表示含义
a或a+0*aa[0]*a[0]*(*a)a[0][0]
a+1*(a+1)a[1]*a[1]*(*a+1)a[1][0]
a+2*(a+2)a[2]*a[2]*(*a+2)a[2][0]

对于元素a[1][2],其地址用列指针表示为a[1]+2,等价表示为*(a+1)+2,那么内容是*(*(a+1)+2);
这样看来:星号进行运算时,
如果表达式中有一个星号,则表示这个元素的地址
如果表达式中有两个星号,则表示这个元素的内容(值)

例如在这个数组中:

int a[2][3] = {{1,2,3},{4,5,6}};

在这里插入图片描述
本文稍有借鉴,欢迎指正!

  • 16
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纳萨斯瓦德

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值