C语言数组
虽然变量也能存储数据,但变量所能存储的数据很有限。这时就可以用数组、链表等等,来存放数据。
数组是最简单的一种,它可以存储一个固定大小的相同类型元素的顺序集合,因此满足以下条件:
- 这些数的类型必须相同。
- 这些数在内存中必须是连续存储的。
一维数组
一维数组的定义方式如下:
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"。