C++语言程序设计

注意：C++不检查引用一个数组元素时的下标值是否在数组要求的下标值范围内。例如，给annual_temp[200]赋值并不会有语法错误，但是，程序运行的结果是难以预料的。它可能导致将数值赋给一个内存单元，但在程序分配的内存空间之外；它也可能导致程序的运行被操作系统终止；它也可能导致将数值赋给一个内存单元，该内存单元在程序分配的内存空间之内，但改变了在该内存单元的其它变量的值或覆盖了在该内存单元的程序代码。同样，读一个值从annual_temp[200]也会产生类似的问题。引用数组元素时，下标超出了允许的范围，称之为下标溢出。下标溢出是一个很容易犯的错误，它常常使程序出现一些很奇怪和难以查找的错误，我们在编程时要十分小心。
数组在内存中如何存储
对于数组定义"int marks[4];"，编译器在内存中为marks保留4个整数内存空间，假定存放一个整数要占用两个字节，存放marks数组内存的起始地址为5000，则marks四个元素在内存中的状态如下图：

| 表6-1

内存地址 | 内容
5000 | 85
5002 | 92
5004 | 95
5006 | 88

假定marks是一个float型数组，每个float型数在内存中占4个字节，则marks四个元素在内存中的状态如下图：

| 表6-2

内存地址 | 内容
5000 | 85.0
5004 | 92.0
5008 | 95.0
5012 | 88.0

对于数组定义"char marks[5] = "Mary";"，假定每个字符占一个内存字节，存放marks数组内存的起始地址为5000，则marks在内存中的状态如下图：

| 表6-3

内存地址 | 内容
5000 | 'M'
5001 | 'a'
5002 | 'r'
5003 | 'y'
5004 | '\0'

前面我们已经定义了名为name的二维数组：
char names[3][6] = {"Mary", "John", "Alice"};
假定每个字符占一个内存字节，存放names数组内存的起始地址为5000，则names在内存中的状态如下图：

| 表6-4

5000 | 5001 | 5002 | 5003 | 5004 | 5005
'M' | 'a' | 'r' | 'y' | '\0' |
5006 | 5007 | 5008 | 5009 | 5010 | 5011
'J' | 'o' | 'h' | 'n' | '\0' |
5012 | 5013 | 5014 | 5015 | 5016 | 5017
'A' | 'l' | 'i' | 'c' | 'e' | '\0

注意：内存地址5005和5011的内容是空的，这是因为name[]的第一个元素和第二个元素都只有4个字符长，因此只占用5个连续的内存地址空间。也要注意：每个字符串以一个空字符（'\0'）结束。