第十章 数组和指针

一 数组

数组由一系列相同的元素构成。

告诉编译器需要一个数组的方式叫数组声明(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的好处:更适合做数值运算;限制:声明时不能初始化。

猜你喜欢

转载自www.cnblogs.com/chitanta/p/9440252.html