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

爷,独闯天下 提交于 2019-11-29 16:42:44

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

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

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

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

(*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 *a a[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}};

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!