8.1.1 什么是数组
可以用一个实例来理解数组。假设在一个程序中要存储100个人的年龄,可以写成下面的代码来定义100个整型变量。
- int age1=12;
- int age2=18;
- int age3=15;
- ………
- int age100=21;
如果这样编写程序,程序中会产生大量相似的语句,在调用变量时,变量名没有统一的规则。可以将所有同类的数据存放在一个数组变量中。所有人的年龄可以建立一个数组,然后用编号来表示数组的一个变量。可以用下面的代码来表示这些数据。- int a[100];
- age[0]=12;
- age[1]=18;
- age[2]=15;
- ………
- age[99]=21;
这样就可以用一个变量名和一个下标来表示数组中的一个变量。例如age[0]表示数组中的第一个变量,age[1]表示数组中的第二个变量。age是这个数组的变量名,后面方括号内的数字称为数组下标。例如范例8-1所示的程序,定义了一个有10个整型变量的数组,然后用循环语句对数组赋值10~19。再用循环语句输出这些数据变量。
【范例8-1】使用循环语句为一个包含10个元素的数组赋值,实例代码如下所示。
实例代码8-1
- 01 #include <stdio.h>
- 02 int main()
- 03 {
- 04 int a[10];
- 05 int i;
- 06 for(i=0;i<=9;i++)
- 07 {
- 08 a[i]=i+10;
- 09 }
- 10 for(i=0;i<=9;i++)
- 11 {
- 12 printf("%d ",a[i]);
- 13 }
- 14 return 0;
- 15 }
【执行结果】编译并运行这个程序,结果如下所示。- 10 11 12 13 14 15 16 17 18 19
【代码解析】实例代码8-1的代码解析如下:
代码第04行定义了一个具有10个元素的数组a。
代码第06~09行使用for循环为数组元素赋值。
代码第10~13行输出数组a中所有元素的值。
在使用数组时,需要注意下面这些下标和数据类型的问题。
在定义数组时,已经定义了数组的数据类型,在访问时需要按照数组的数据类型进行访问和赋值。
对于一个已经定义的数组,数组中所有的元素都是相同的数据类型。
数组的下标是从0开始的向后排列整数,不能是其他的下标。第一个下标是0而不是1。下标n表示第n+1个变量。
定义数组a[n]以后,有n个元素,但是没有a[n]这个元素。访问不存在的数组变量时,程序就会发生数组下标越界错误。
注意:数组下标越界是指访问了不存在的数组元素,导致访问了非法的内存区域而产生的错误。在C语言中一定要避免内存越界之类的错误。
在本质上,数组是内存上一组同类信息列出的一个表。假设上面例子中的数组a[10]是从内存地址为0x1000的存储单元开始存储的,数组的内容和值可用表8.1表示(假设使用32位CPU的Linux操作系统)。
表8.1 数组的存储与值
|
变量< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
a[7] |
a[8] |
a[9] |
|
值 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
|
存储
地址 |
0x1000 |
0x1004 |
0x1008 |
0x< xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />100C |
0x1010 |
0x1014 |
0x1018 |
0x101C |
0x1020 |
0x1024 |