一 数组
数组由一系列相同的元素构成。
告诉编译器需要一个数组的方式叫数组声明(array declaration),声明需要告诉编译器数组元素的个数和类型。
初始化
int main(void) { int powers[8] = {1,2,4,8,16,32,64,128};
... }
未初始化的数组元素值为内存中的实际值,此值是不确定的,不过如果初始化了部分数组,编译器会将剩下的元素初始化为0.
一种确定数组长度的方法:sizeof(powers)/sizeof(powers[0]),这种方法无法测定出有效数组元素的长度。
指定初始化项目(C99)
C99新特性:此特性允许选择对某些元素进行初始化。比如,只对数组最后一个元素初始化:
//传统语法: int arr[6] = {0,0,0,0,0,212}; //C99语法: int arr[6]={[5]=212}; //C99语法高级用处:结果为:31 29 0 0 31 30 31 0 0 0 0 0 0 int days[12] = {31,28,[4]=31,30,31,[1]=29};
赋值
声明后的数组可借助其索引(即下标)对其进行赋值
错误的赋值方式:
#define SIZE 5 int main(void) { int oxen[SIZE] = {5,3,2,8}; int yaks[SIZE]; yaks = oxen;//不允许 yaks[SIZE] = oxen[SIZE];//不正确 yaks[SIZE] = {5,3,2,8];//不起作用 }
数组边界
处于C信任程序员的原则,C编译器不检查索引的合法性。以让C程序的运行速度更快。
减少程序员出错可以记住一点:数组从0计数,以及在数组声明中使用符号常量,以保证整个程序中数组大小始终一致。
指定数组大小
int n =5;//可以 int m=8;//可以 float a1[5];//可以 float a2[5*2+1];//可以 float a3[sizeof(int)+1];//可以,sizeof表达式被认为是一个整数常量,而const值却不是整数常量 float a4[-4];//不可 float a5[0];//不可 float a6[2.5];//不可 float a7[(int)2.5];//可以 float a8[n];//c99之前不可以 flaot a9[m];//c99之前不可以
C99允许这两个声明,但这创建了一种新数组,称为变长数组(variable-length array) 简称VLA。VLA的好处:更适合做数值运算;限制:声明时不能初始化。