二维数组和数组元素地址
二维数组和数组元素的地址
先给出一下定义:
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
- 点赞
- 收藏
- 关注作者
评论(0)