C 数组是什么?
在之前的学习中可以知道:一个变量可以存储一个值。比如想要存储一个整数 10,可以这样写。
int a = 10;如果让你使用变量来存储 5 个整数:10、20、30、40、50,这个时候大家应该怎么做呢?很多人立马就写出下面这段代码。
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;写完之后,是不是觉得这种方式很笨?假如我让你存储十几个甚至几十个整数,那你岂不是每一个整数都要定义一个变量来保存?如果采用这种低级重复的语法,我们这些 “程序猿” 早晚也会累死呢。
在 C 语言中,我们可以使用 “数组” 来存储一组 “相同数据类型” 的数据。数组中每一个元素都相当于一个独立的变量。其实数组就是 “一组数”,就这么简单。
我们再回到例子中,像上面的一堆变量,使用数组实现如下。
int arr[5] = [10, 20, 30, 40, 50];简单来说,我们可以用一个数组来保存多个值。现在来看,是不是感到非常清晰明了呢?如果想要得到数组的某一项,比如 10 这一项,可以使用 arr[0] 来获取。
C 创建数组
在 C 语言中,我们可以按照下面的语法格式来创建一个数组。
语法:
数据类型 数组名称[数组长度];说明:
“数据类型” 表示数组中存储的数据是什么类型的,比如 int 表示存储整数,char 表示存储字符,float 表示存储单精度浮点数,double 表示存储双精度浮点数等。
“数组名称” 表示数组的名字,最好能够做到 “见名知意”。
“数组长度” 表示数组中可以存放多少个 “相同数据类型” 的数据。数组的长度在声明时必须指定。C99 标准引入了变长数组,允许使用变量定义长度。
示例 1:创建一个可以存储 5 个整数的数
int arr[5];上面代码表示创建了一个名称为 arr 的数组,该数组可以存储 5 个 int 类型的整数。此时数组中的每一个元素都没有进行初始化,所以里面的值是不确定的。
C 初始化数组
在 C 语言中,数组可以在创建的同时进行初始化(即赋初始值),也可以先创建然后再赋值。
语法:
类型 数组名[长度] = {元素1, 元素2, …, 元素n};说明:
在创建数组的同时,使用花括号 “{}” 将数组的每一个元素的值依次写在里面,各个元素之间用英文逗号(,)分隔。
注意: 与其他编程语言(如 Python、JavaScript 等)不一样,C 语言中数组的元素是用大括号 “{}” 括起来的,而不是使用中括号 “[]” 括起来的。
示例 2:C 定义数组
int arr[3] = {10, 20, 30}; // 创建一个包含 3 个元素的数组实际上,C 语言提供了 3 种定义数组的方式,下面 3 种方式效果是相同的。
// 第 1 种
int arr[3] = {10, 20, 30};
// 第 2 种
int arr[] = {10, 20, 30};
// 第 3 种
int arr[3];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;对于第 2 种方式,C 语言会自动根据后面元素的个数来确定数组的长度。特别注意,如果使用这种方式,我们必须同时在等号后面给数组赋值,否则编译就会报错。下面这种方式是错误的。
// 错误方式
int arr[];
arr[0] = 12;
arr[1] = 24;
arr[2] = 36;在使用 C 语言数组时,我们还需要注意以下 3 点。
(1)数组的元素必须是相同类型的,不允许存在不同类型。
// 正确
int arr[3] = {10, 20, 3};
// 错误
int arr[3] = {10, 20, 3.14};(2)“{}” 内元素的个数不能超过数组定义时 “[]” 的长度。
// 正确
int arr[3] = {12, 24};
// 错误
int arr[3] = {12, 24, 36, 48}; (3)元素个数可以少于数组长度。其中未赋值的元素的值会自动取 0。下面 2 种方式是等价的。
// 方式 1
int arr[3] = {12, 24};
// 方式 2
int arr[3] = {12, 24, 0}; C 数组的常见问题
1. “[]” 是一种运算符,这个说法正确吗?
从 “C 语言运算符优先级” 这一节可以知道,其实 “()” 和 “[]” 都是运算符。“[]” 表示数组的下标,表示取哪一个元素。
C 访问数组元素
在 C 语言中,想要访问数组元素(也就是获取数组某一项的值),我们都是使用 “下标” 的方式来获取。
int arr[3] = {12, 24, 36};上面表示创建了一个名为 arr 的数组,该数组中有 3 个元素:12、24、36。如果我们想要获取 arr 某一项的值,就可以使用下标的方式来获取。其中,arr[0] 表示获取第 1 项的值(即 12)。arr[1] 表示获取第 2 项的值(即 24),以此类推。
注意: 数组的下标是从 0 开始的,而不是从 1 开始的。如果你以为获取第 1 项应该用 arr[1] 的话,那就理解错了。初学者很容易犯这种错误!
示例 3:获取数组某个元素的值
#include <stdio.h>
int main(void)
{
int arr[5] = {12, 24, 36, 48, 60};
printf("%d", arr[2]);
return 0;
}运行结果如下。
36分析:
arr[2] 表示获取数组 arr 的第 3 个元素,而不是第 2 个元素,分析如下图所示。

对于 “[]” 中的数字,我们要记住这么一点:如果是在数组定义时,那么它就表示数组的长度。如果不是在数组定义时,那么它就表示数组的下标。比如 int arr[5] = {12, 24, 36, 48, 60}; 中的数字 “5” 是用于数组定义部分,所以它表示的是数组的长度为 5。如果不是放在数组的定义部分,那么它就表示一个下标。
由于数组的最大下标比数组的长度要小 1,所以在非数组定义时,我们只能使用 arr[4],而不能使用 arr[5]。这是因为 arr[5] 表示的是第 6 个元素,而数组本身是不存在第 6 个元素的,所以 arr[5] 这种写法就是错误的。
示例 4:获取未赋初值的数组元素
#include <stdio.h>
int main(void)
{
int arr[5] = {12, 24, 36};
printf("%d\n", arr[2]);
printf("%d\n", arr[3]);
printf("%d", arr[4]);
return 0;
}运行结果如下。
36
0
0分析:
在 C 语言中,我们可以只对部分元素赋初始值,而对于没有赋初始值的元素会自动取 0。所以 int arr[5] = {12, 24, 36}; 其实等价于 int arr[5] = {12, 24, 36, 0, 0};。
然后 arr[2] 表示数组的第 3 个元素,arr[3] 表示获取数组的第 4 个元素,arr[5] 表示获取数组的第 5 个元素。
示例 5:使用循环来创建数组
#include <stdio.h>
int main(void)
{
int arr[5];
for (int i = 0; i < 5; i++)
{
printf("输入第 %d 个整数:", i+1);
scanf("%d", &arr[i]);
}
printf("%d", arr[4]);
return 0;
}运行之后,我们依次输入 10、20、30、40、50,输出结果如下。
50分析:
使用 for 循环,我们可以很方便地输入多个数,从而组合成一个数组。需要注意的是,这里的判断条件不能是 “i <= 5”。原因很简单,数组的最大长度为 5,而 arr[4] 获取的就是最后一个元素了。
访问 arr[5] 会导致数组越界,这是一个非常危险的操作,可能会导致程序崩溃或产生不可预测的结果。C 语言不会自动检查数组的越界问题,需要我们自己负责确保访问的索引在有效范围内。
C 修改数组元素
在 C 语言中,访问数组元素的值我们是知道了,如果想要修改数组某个元素的值,此时又该怎么做呢?其实也是通过数组下标来实现的。
语法:
数组名[i] = 新值; 示例 6:修改数组元素的值
#include <stdio.h>
int main(void)
{
int arr[5] = {12, 24, 36, 48, 60};
arr[1] = 100; // 修改第 2 个元素
arr[2] = 200; // 修改第 3 个元素
printf("%d\n", arr[1]);
printf("%d", arr[2]);
return 0;
}运行结果如下。
100
200分析:
在这个例子中,arr[1] = 100; 表示给第 2 个元素重新赋值为 100,也就是 24 被替换成了 100。然后 arr[2]=200; 表示给第 3 个元素重新赋值为 200,也就是 36 被替换成了 200。
从上面可以知道,数组最终的值为:{12, 100, 200, 48, 60}。小伙伴们可以使用 for 循环把数组每一个元素打印出来就知道了。
C 遍历数组
在 C 语言中,我们可以使用循环(比如 for 循环、while 循环)来遍历数组的所有元素。
示例 7:遍历数组
#include <stdio.h>
int main(void)
{
int arr[5] = {12, 24, 36, 48, 60};
for(int i = 0; i < 5; i++)
{
printf("%d\n", arr[i]);
};
return 0;
}运行结果如下。
12
24
36
48
60分析:
遍历数组,指的是获取数组的每一项,这个使用 for 循环就可以轻松实现了。
示例 8:计算数组所有元素之和
#include <stdio.h>
int main(void)
{
int arr[5] = {12, 24, 36, 48, 60};
int sum = 0;
for (int i = 0; i < 5; i++)
{
sum += arr[i];
};
printf("%d", sum);
return 0;
}运行结果如下。
180分析:
数组元素的特点是:使用同一个变量名,以及不同的下标。所以我们可以使用循环语句来改变下标的值,从而获取不同的元素。
