解析数组名

来源:互联网 发布:课程表数据库设计 编辑:程序博客网 时间:2024/06/05 12:42

                                   解析数组名

                                                                                 作者:黑色印记


很多刚接触C语言的朋友总会觉得数组和指针是十分复杂的,特别对于多维数组的问题,感到头痛无比。我认为困惑大家的是对于数组名的理解不清晰所造成的。在这里,我将从一维数组名,二维数组名,三维数组名,向大家解析其中的注意事项。


在进入正题前,我想让大家知道,数组名是一个指针常量,保存的是首元素的地址。(因此,数组名不能做自加操作)

一维数组:

例:int   a [ 2 ] ;

a           保存的是数组首元素的地址          a +1,增加4个字节 

&a      保存的是数组的地址a +1,增加8个字节

  (一个是元素地址,一个是一维数组的地址,注意区分两者的区别)

     由  *(&a) = a

  可知: 对数组的地址取值等于数组首元素的地址.


二维数组:

例:int   a[ 2 ] [ 2 ] ;

由于a是二维数组的数组名,所以它的首元素是一个一维数组。

a + i            第i个一维数组的地址

*( a + i ) + j                    第i个一维数组的第j个元素的地址

*(*(a + i) + j)第i个一维数组的第j个元素的值

因为a是一维数组的地址,所以,要用数组指针来接。即:

int(*pa)[ 2 ]   =  a ;       pa + 1   ,加8个字节


因为&a是二维数组的地址,所以,要用二维数组指针来接。即:

int(*pa)[2][2]  = &a;  pa + 1 , 加16个字节


三维数组:

例:   inta[2][2][2];

和二维数组同理,同学们可以尝试自己理解一下。

a + i第i个二维数组的地址

*(a + i) + j第i个二维数组的第j个一维数组的地址

*(*(a + i) + j) + k第i个二维数组的第j个一维数组的第k个元素的地址


int(*pa)[2][2]  =  a;pa + 1,     加16个字节

int (*pa)[2]  =  *a  ;pa + 1,加8个字节

int     (*pa)      = **a ;pa + 1,加4个字节

int (*pa)[2][2][2]  = &a;pa + 1,加32个字节


如果用画图的方式表示数组中的元素,在内存中的存放方式,会更加容易理解,有条件的同学可以试一试。

















1 0
原创粉丝点击