zoukankan      html  css  js  c++  java
  • 数组 内存结构

    17.1 数组与内存

    变量需要占用内存空间,内存空间有地址。不同数据类型的变量,可能占用不同的内存大小及有不同的内存结构。

    以前我们所学都称为“简单数据类型”,如:int,char,float,double,bool。像 char,bool,只占用一个字节,所以我们不去管它的的“结构”,其余如int,float,double占用多个字节,但比较简单,适当的时候我们会去探讨4个字节是如何组成一个整数。

    后来我们学习了数组。数组变量占用内存的大小是不定的,因为不同的数组变量除了类型可以不同,还可以拥有不同个数的元素,这两点都影响它的大小。

     

    因此,数组是我们第一个要着力研究它的结构的数据类型。和后面我们还要学习的更多数据类型相比,数组的结构还是相当简单的。简单就简单在它的各个元素大小一致,整整齐齐地排列。

     

    17.1.1 数组的内存结构

    变量需要占用内存空间,内存空间有地址。

     

    声明一个整型变量

     

    int a;

     

    系统会为该变量申请相应大小的空间,一个int类型的变量时,需要占用4个字节的空间,如下图:

    也就是说,一个 int 类型的变量,它的内存结构就是 “4个连续的字节”。

     

    当我们声明一个数组:int arr[100];

     

    我们可以想像,arr数组在内存中占用了100 * sizeof(int) 个字节。

     

    现在请大家打开Windows的画笔程序,家画一个数组的内存结构示意图。

     

    17.1.2 数组的内存地址

     

    一个int类型变量,占用4个字节的内存,其中第一个字节的位置,我们称为该变量的内存地址。

    同样,一个数组变量,占用一段连续的内存,其中第一个字节的位置,我们称为该数组变量的内存地址。

     

    还记得 & 这个符号吗?通过它我们可以得到指定变量的内存地址。

     

    int a;

    cout << &a << endl;

     

    & 称为“取址符”。如果你有点记不清,可以查看以前的课程。

     

    本章第一个需要你特别注意的内容来了:

    查看数组变量的地址,不需要使用 & 。下面的话是一个原因也是一个结论,你必须记住。

     

    C,C++语言中,对数组变量的操作,就相当于直接对该数组变量的地址的操作。

     

    因此,想要查看一个数组变量的地址,代码为:

     

    int arr[10];

    cout << arr << endl;  //注意,arr之前无需 &

     

    现在,请大家打开CB,然后将上面代码写成完整的一个控制台程序,看看输出结果。

     

    17.1.3 数组元素的内存地址

     

    一个数组变量包含多个连续的元素,每一个元素都是一个普通变量。因此,对就像对待普通变量一样可以通过&来取得地址:

     

    //查看数组中第一个元素的地址:

    int arr[10];

    cout << &arr[0] << endl;

     

    例一:

    现在,请大家在CB里继续上一小节的代码,要求:用一个for循环,输出数组arr中每一个元素的地址。

    如果你已完成,现在来看我的答案。

     

    #include <iostream.h>

    ...

    int arr[10];

     

    for(int i=0; i<10; i++)

        cout << &arr[i] << endl;

    ...

    cin.get();

     

    我们把它和前面输出数组地址的例子结合起来,然后观察输出结果。

     

    ...

    int arr[10];

     

    //输出数组的地址:

    cout << "数组arr的地址: " << arr << endl;

     

    //输出每个元素的地址:

    for(int i=0; i<10; i++)

        cout << "元素arr[" <<i <<"]的地址:" << &arr[i] << endl;

     

    ...

     

    输出结果:

     

    第一个要注意的的是头两行告诉我们,整个数组变量arr的地址,和第一个元素arr[0],二者的地址完全一样。

    事实上,数组和元素,是对同一段内存的两种不同的表达。把这一段内存当成一个整体变量,就是数组,把这段内存分成大小相同的许多小段,就是一个个数组元素。

     

    请参看下图:

    (分开一段段看是一个个元素,整体看称为一个数组,但二者对应的是同一段内存)

  • 相关阅读:
    [翻译]TempDB剩余空间监视与纠错
    SQL Server 检查SQL连接错误问题的步骤
    SQL 根据父节点查询所有子节点
    ASP.NET 回滚事务
    SQL 根据子节点查询所有父节点
    .Net 夯实基础
    WCF学习笔记(六)WCF基础
    离下班还有几分钟,做个小玩意儿
    c#预处理指令
    .Net垃圾回收
  • 原文地址:https://www.cnblogs.com/silva/p/1755336.html
Copyright © 2011-2022 走看看