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],二者的地址完全一样。
事实上,数组和元素,是对同一段内存的两种不同的表达。把这一段内存当成一个整体变量,就是数组,把这段内存分成大小相同的许多小段,就是一个个数组元素。
请参看下图:
(分开一段段看是一个个元素,整体看称为一个数组,但二者对应的是同一段内存)