二维数组和数组元素地址

举报
陈言必行 发表于 2021/08/13 23:09:14 2021/08/13
【摘要】 二维数组和数组元素的地址   先给出一下定义: int *p,a[3][4]; 1.二维数组a由若干个以为数组组成 像上面定义的数组a,我们可以理解为由a[0],a[1],a[2]三个元素组成,而他们有分别是一个一维数组 通过我们前面学过的知识可以知道,数组名是一个地址,其值是第一个元素的地址,而此地址的基类型就是数组元素的类型,而二维数组中同样a[0]...

二维数组和数组元素的地址

 

先给出一下定义:

int *p,a[3][4];

1.二维数组a由若干个以为数组组成

像上面定义的数组a,我们可以理解为由a[0],a[1],a[2]三个元素组成,而他们有分别是一个一维数组

通过我们前面学过的知识可以知道,数组名是一个地址,其值是第一个元素的地址,而此地址的基类型就是数组元素的类型,而二维数组中同样a[0],

a[1],a[2]都是一维数组名,同样也代表了一个不可变的地址常量。由于他是一个常量,所有这样的就错了:a[0]++, 而a[0]+1这就表示向后移动一个单位长度。

对于有一个指针变量P的基类型与a[i]相同,则p=a[i]这是正确的。

 

2.二维数组名也是一个地址常量

二维数组名同样也是一个存放地址常量的指针,其值为二维数组中的第一个元素的地址。以上a的值与a[0]的值是相同的。

a[0] a+0 第0行的首地址

a[1] a+1 第1行的首地址

...

 

象他们这样的,还有两位一个名称---行地址。所以二维数组名应理解为一个行指针。

 

3.二维数组元素的地址

int a[3][4];

a 数组元素 地址用以下的五种方式表示:

&a[i][j];

a[i]+j;

*a(a+i)+j;

&a[0][0]+4*i+j;

a[0]+4*i+j;

 

a 数组元素 可以用以下五种表达式来引用:

a[i][j];

*(a[i]+j);

*(*(a+i)+j);

(*(a+i))[j];

*(&a[0][0]+4*i+j)

 

通过建立一个指针数组引用二维数组元素

int*p[3], a[3][2] ,i,j // 指针数组

说明符*p[3],中也遵照运算符的优先级,一对[]的优先级高于*号,因此p首先与结合,构成*p[3],说明了P是一个数组名,系统将他开辟了3个连学的存储单元,在他前面*号则说明了数组p是指针类型,他的每个元素都是基本类型为int 的指针。

如有:

for(i = 0, i<3;i++)

p[i] = a[i];

这就意味着每个指针都指向了a数组的每行的开头。

所以对于数组a的元素,我们也通过这样的指针来表示了

 

通过建立一个行指针引用二维数组元素

若有以下定义:

int a[3][2] ,(*prt)[2] //列标必须对应

为什么要先加一个()?这是因为想要 prt 与 * 先结合,说明prt是一个指针变量。然后再也[2]结合,说明指针变量prt的基本类型是一个包含有开那个给int元素的数组。

因为prt与a的类型相同所以prt = a 就是一个合法表达式。当prt指向啊数组的开头时,可以通过以下形式来引用

a[i][j];

*(prt[i]+j);

*(*(prt+i)+j);

(*(prt+i))[j];

prt[i][j];

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/76266610

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。