这里需要注意的是,如果省略了数组长度,编译器在使用计算出的长度时会报错。
数组初始化
定义变量时,我们可以定义并赋值初始值,数组也是如此,但定义和初始化数组的方式有以下几种:
1.定义并给出所有初始值
int a[3] = {1, 2, 3};
或
int a[] = {1, 2, 3};
即初始值用{}包裹,各个元素之间用逗号分隔。
对于也给出初始值的定义,我们可以省略数组长度,因为编译器会根据初始值的内容来确定数组长度。
2.定义并给出一些初始值
int a[3] = {1, 2};
此时数组长度不能省略,否则会认为数组只有两个元素。 数组a的前两个元素分别是1和2,第三个元素的值未知。
3.定义字符数组
字符数组的定义和初始值写入与其他基本类型的定义不同。
char s[6] = "hello";
char s[] = "hello";
上面两者是等价的,即定义了一个数组长度为6的字符数组。
细心的读者可能会发现,hello只有5个字符,那么为什么它有6个元素长呢?
这是因为双引号内的字符串(也是字符数组)在末尾隐式包含一个 '\0' 字符来指示字符串的结尾。 因此,该类型字符串的长度为双引号内的字符数加1。如果使用运算符计算s的长度,则返回值为6。
字符数组(无论是char还是char)有一种特殊的初始化方法——定义并清除所有数组元素值为零:
char s[100] = {0};
unsigned char us[100] = {0};
这时数组的长度就不能省略了,不仅数组的第一个元素被初始化,而且数组的所有元素值都被设置为0。
这种写法仅限于清算。 如果使用其他值,就会变成部分初始化。
数组元素
事实上,数组本质上是一个连续的内存空间,与我们变量文章中的停车场示例非常相似。
事实上,数组的每个元素都是一个变量。
我们再以停车位的使用为例,看看数组元素是如何使用的。 这里,我们假设实例镜头最近的停车位位置记录为0,距离加1,并假设该行有10个停车位。
那么将这样一排停车位转换成C语言可以定义如下:
int parking_area[10];
之所以定义为整数,是因为每个车型都可以用唯一的整数来代替其名称,即车名与整数之间存在映射关系。
这时,一辆宝马驶进了第一个停车位。 我们假设宝马对应的整数是1000,那么代码可以写为:
parking_area[0] = 1000; //上面提到过第一个车位的位置为0
这里,我们使用数组下标运算符。
在本文中,数组元素是通过下标访问的。 指针对元素的访问将在后续的指针文章中讨论。
数组中下标的个数等于数组的长度,下标值从0开始依次加1,即上例中的下标为0到9。
这时,又来了一辆奔驰(对应的整数记录为1001),停在第二个车位上。 代码如下:
parking_area[1] = 1001;
如果宝马开走了(假设没有停车记录为0),那么代码可以写为:
parking_area[0] = 0;
一个可编译可运行的示例
#include
int main(void)
{
char a[10] = {0};
int i;
for (i = 0; i < sizeof(a); ++i) {
printf("%d\n", a[i]);
}
return 0;
}
您可以编译并运行该示例。 这里定义了数组a,并将其所有元素清为0。然后使用数组下标配合循环语句,完成对数组元素的遍历访问。 循环的内容将在后续文章中给出。
多维数组
上面讨论的示例都涉及一维数组,即每个数组元素都是数值而不是数组。
接下来我们将介绍一些复杂的数组形式。 我们以二维数组为例进行演示。
int a[2][3];
这里我们定义一个二维数组a,它类似于一个2行3列的表格或矩阵。
对于这个二维数组,可以使用以下方法来定义同时初始化:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
或
int a[][3] = {{1, 2, 3}, {4, 5, 6}};
可以看到,最外面的数组包含两个元素,它们是两个长度相同的一维数组。
同时,定义同时初始化时,第一维的数组长度可以省略,编译器会自动用初始值中的元素个数填充。