C 数组

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};

说明:

在创建数组的同时,使用花括号 “{}” 将数组的每一个元素的值依次写在里面,各个元素之间用英文逗号(,)分隔。

注意: 与其他编程语言(如 PythonJavaScript 等)不一样,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 个元素,分析如下图所示。

C 数组的下标

对于 “[]” 中的数字,我们要记住这么一点:如果是在数组定义时,那么它就表示数组的长度。如果不是在数组定义时,那么它就表示数组的下标。比如 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

分析:

数组元素的特点是:使用同一个变量名,以及不同的下标。所以我们可以使用循环语句来改变下标的值,从而获取不同的元素。

上一篇: C goto 语句

下一篇: C 数组长度

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号