数组(array)是若干同类变量的聚合,允许通过统一的名字引用其中的变量。其特定元素通过下标(index)访问。C语言的数组由连续的内存区构成,最低地址对应首元素,最高地址对应末元素。 保存数组所需要的内存量直接与基类型和数组大小有关。对一维数组而言,以字节为单位的总内存量可以这样来确定: 总字节数 = sizeof (基类型)×数组长度 例如,一维数组x int x[100];
它所占内存字节数目为sizeof(int)×100=4×100=400个字节数。它在内存中排列如下:
元素 x[0] x[1] x[2] ... x[98] x[99] 地址 0x004000 0x004004 0x004008... 0x004260 0x004264 0x004268
可见,一维数组就是在连续内存中按下标顺序存储的同类信息组成的表。 在C语言中,框住下标的方括号([])实际上被看成一个运算符,与圆括号(())具有相同的优先级。下表归纳了一些运算符的优先级(从上到下递减): 运 算 符 | 结 合 性 | 类 型 | () [] | 从左到右 | 最高 | ++ -- !(type) | 从右到左 | 单目运算符 | * / % | 从左到右 | 乘除运算符 | + - | 从左到右 | 加减运算符 | < <= > >= | 从左到右 | 关系运算符 | == != | 从左到右 | 相等测试运算符 | && | 从左到右 | 逻辑与 | || | 从左到右 | 逻辑或 | ? : | 从右到左 | 条件运算符 | = += -= *= /+ %= | 从右到左 | 赋值运算符 | , | 从左到右 | 逗号运算符 |
C语言中最常用的数组是串(string),它是以空(null)字符结束的一位字符数组。
数组声明和初始化 一维数组的定义形式: type var_name[size]; 这里,type定义了数组的基类型(base-type),即数组中各元素的类型。size定义了数组的元素数目。C89规定,必须用常数指定数组的大小。如: double balance[100]; 数组通过下标引用数组名来访问它的元素。如: balance[13] = 12.34; /* 为balance的3号元素赋值 */ 注意,C语言的数组的首元素的下标是0。 示例:加载由0~99组成的一个整型数组。 1 #include <stdio.h> 2 3 int main(void) 4 { 5 int x[100]; /* 定义一个100元素的整型数组 */ 6 int t; 7 8 /* 初始数组x,其值从0到99 */ 9 for ( t=0; t<100; ++t ) x[t] = t; 10 11 /* 显示x,100行 */ 12 printf( "Index\tValue\n", x[t] ); 13 for( t=0; t<100; ++t ) printf( "%d\t%d\n", t, x[t] ); 14 15 return 0; 16 } 数组在声明时,其各个元素的值是随机的,可以在数组声明时初始化它,如例子中的第五行 5 int x[100]; 可以这样来写以初始化: 5 int x[100] = { 0 }; 这表示数组x的首个元素被初始化为0,由于初始化值的个数比数组元素个数少,因此其余的99个元素都被自动初始化为0。也可以这样为数组初始化: int y[5] = { 33, 2, 0, 6, 54 }; 这样就为一个五个元素的整型数组初始化全部值。但下面的做法是错误(语法错误): int y[5] = { 33, 2, 0, 6, 54, 45 }; 由于声明为数组只有五个元素,因此初始化的值也只能小于等于五。 有时,如果声明数组的同时初始化它,可以省略声明的数组的大小,其元素个数由初始化值的列表数目确定: int y[] = { 33, 2, 0, 6, 54 }; 这是一个具有五个元素的数组。 注意,C语言不检查数组的边界,因此程序可以在数组的两边越界。如上例第九行可以这样写,尽管这导致溢出: for ( t=0; t<=100; ++t ) x[t] = t; 这时, x[100] = 100; 已经越界,这可以通过编译,运行时也不一定会发生错误。程序员必须在必要时加入边界检查。
|