数组的内存布局

 

先看下面的例子:

int a[5];

 

1.内存布局的示意图


  所有人都明白这里定义了一个数组,其包含了5个int型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0],a[1]…吗?看下面的示意图:

如上图所示,当我们定义一个数组a时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a一旦与这块内存匹配就不能被改变。a[0],a[1]等为a的元素,但并非元素的名字。数组的每一个元素都是没有名字的。

 

2.利用sizeof来研究数组的内存结构关系

 

  那现在再来解决sizeof关键字时的几个问题(本文最下方的参考书): (我想起了王泽梁老师给我们上数据结构课时,介绍数据类型data type的概念:定义了一些数据data,以及基于这些数据的操作operation。)

sizeof(a)的值为sizeof(int)*5,32位系统下为20。
sizeof(a[0])的值为sizeof(int),32位系统下为4。
sizeof(a[5])的值在32位系统下为4。

  

  sizeof(a[5])的值在32位系统下为4。并没有出错,为什么呢?

  因为这里肯定没有访问a[5]这个元素,sizeof只是获取a[5]类型,而对于a[5]的内容不感兴趣。

  sizeof是关键字不是函数。函数求值是在运行的时候,而关键字sizeof求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其。所以这里使用a[5]并不会出错。

sizeof(&a[0])的值在32位系下为4,这很好理解。取元素a[0]的首地址。计算a[0]的首地址的长度。
sizeof(&a)的值在32位系统下也为4,这也很好理解。计算数组a[]的首地址的长度。陈正冲老师VC++老师上做了测试,结果是20。

 

3. 省政府和市政的区别----&a[0]和&a的区别

 

  数组首地址 VS 数组首元素的首地址

  湖南的省政府所在地  VS 长沙的市政府所在地
  

  这里&a[0]和&a到底有什么区别呢?a[0]是一个元素,a是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。举个例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,但其代表的意义完全不同。这里也是同一个意思。

 

  这个经典例子来源陈正冲老师。

 

 

 

 

 

参考:陈正冲老师的《c语言深度剖析》。

posted @ 2014-04-05 14:34  二郎那个三郎  阅读(1997)  评论(0编辑  收藏  举报