C语言数组

虽然变量也能存储数据,但变量所能存储的数据很有限。这时就可以用数组、链表等等,来存放数据。

数组是最简单的一种,它可以存储一个固定大小的相同类型元素的顺序集合,因此满足以下条件:

  1. 这些数的类型必须相同。
  2. 这些数在内存中必须是连续存储的。

一维数组

一维数组的定义方式如下:

int num[10];

数据类型 数组名[数据个数];

该例子表示,定义了一个有10个元素的整型数组num

这里的元素就是变量的意思,数组中习惯上称为元素

数组元素可以通过编号区分表示。数组元素的编号又叫下标,数组中的下标是从 0 开始的(而不是 1)。

由此我们可以通过下标来访问数组的元素。

字符数组

在计算机世界中字符也是以数字的形式存储,因此在读取一连串字符时要有一个标识符\0来表示字符串结束。

因此在字符数组中数据个数要多加一个。如:

char s[6]="hello";

多维数组

有时候一维数组并不能很好的存储数据,这时可以使用多维数组。下面以二维数组举例。

int a[3][4];

数据类型 多维数组名[数据个数][数据个数];

在本质上,多维数组是一个一维数组的列表。因此我们同样可以通过下标访问数组中的元素。

!

初始化数组

一维数组初始化

完全初始化

定义数组时给所有元素赋初值,这叫完全初始化。例如:

int num[5] = {1, 2, 3, 4, 5};

如此初始化之后,num[0]=1,num[1]=2,num[2]=3,num[3]=4,num[4]=5,即从左到右依次赋给每个元素。需要注意的是,初始化时各元素间是用逗号隔开的,不是用分号。

不完全初始化

可以只给一部分元素赋值,这叫不完全初始化。例如:

int num[5] = {1, 2};

这表示只给前面两个元素 a[0]、a[1] 初始化,而后面三个元素都没有被初始化。不完全初始化时,没有被初始化的元素自动为 0

需要注意的是,“不完全初始化”和“完全不初始化”不一样。如果“完全不初始化”,即只定义int num[5];而不初始化,那么各个元素的值就不是0了,所有元素都是垃圾值

也不能写成int num[5]={};,这算是语法错误。可以写成int num={0},这时所有元素都是0。

字符串初始化

字符串初始化1:

char s[6]="hello";

字符串初始化2:

char s[6]={'h','e','l','l','0','\0'};

未知初始化

有时我们并不知道或数据过长,导致我们不清楚元素具体个数时,可以不写数据个数,编译器会自己帮我们数清楚。

char s[]="hello";

多维数组初始化

多维数组通常都是完全初始化,可以通过在括号内为每行指定值来进行初始化。如下:

int a[3][4] = {  
 {0, 1, 2, 3} ,  
 {4, 5, 6, 7} ,   
 {8, 9, 10, 11}
};

内部嵌套的括号只是便于人读程序,下面的初始化与上面是等同的:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

C99拓展

在C99之前,数组的长度是确定的且不可变的,但是为了顺应时代,在C99标准中数组长度开始可变。如下:

int n;
char s[n];

n=6;
s[0]="h";
s[1]="e";
s[2]="l";
s[3]="l";
s[4]="o";
s[5]="\0";

这时s[n]="hello\0"。