zoukankan      html  css  js  c++  java
  • 数组的内存布局

    先看下面的例子:

    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语言深度剖析》。

  • 相关阅读:
    【转载】天才与柱子
    Windows Phone 7 隔离存储空间资源管理器
    (收藏)让你平步青云的十个谈话技巧
    (收藏)《博客园精华集》设计模式分册
    (收藏)C#开源资源大汇总
    (收藏)生活物语
    (收藏)C# ORM/持久层框架
    (收藏)《博客园精华集》AJAX与ASP.NET AJAX部分
    小型项目总结之五
    VS 打包完美解决方案
  • 原文地址:https://www.cnblogs.com/haore147/p/3647211.html
Copyright © 2011-2022 走看看