加载中...
从零接触C语言(初览)-VII: 数组

从零接触C语言(初览)-VII: 数组

周四 7月 31 2025
2670 字 · 11 分钟

数组

在C语言中, 你可以定义一个普通的变量来存储一个特定类型的数据, 比如:

C
int age = 10;

定义一个int类型的变量age, 存储一个int类型的数据10, 假设这是存储的一个人的年龄信息

那么现在来思考一个问题: 如果要存储100个人的年龄信息该怎么办?

这样吗:

C
int age1 = 1;
int age2 = 2;
int age3 = 3;
// ....
int age99 = 99;
int age100 = 100;

要定义100次变量吗? 如果你想的话, 当然可以

但是C语言提供了更方便的方式: 数组

什么是数组?

C语言可以使用标准提供的基本数据类型定义变量, 来存储特定类型的数据

这个普通的变量, 就好像程序在内存中开辟了一块空间, 给这块空间起了一个名字, 程序就可以使用这块空间了

定义多个变量, 就会在内存中开辟多块空间, 不同变量的空间 在内存中可能是紧挨着的, 也可能是分离开的, 就像这样:

除了普通的变量之外, C语言还提供了数组变量

数组, 允许你一次性在内存中开辟一大块空间, 这快空间内部又可以分为若干块小空间, 每块小空间的大小均为所使用的数据类型的大小, 每个小空间都可以看作为一个普通变量, 可以单独地随意使用

并且与多个普通变量在内存中的分布不同的是, 一个数组变量开辟出来的若干块小空间, 在内存中一定是连续的, 即 一个数组内的空间在内存中都是紧挨着的, 就像这样:

数组中的每一个小空间, 都可以被称为数组的元素

那么, 用官方一点的话来描述数组: 一组相同类型元素的集合

数组的定义与初始化

普通的变量, 我们知道是这样定义的:

C
int age = 10;

那么, 数组变量如何定义呢?

其实在之前的文章中使用过, 也很简单:

C
int ages[10];
// 或
int ages[10] = { 0 };

数组的定义就是在变量名后加上[整数], 整数表示开辟的特定数据类型的小空间的个数, 一般被称为 数组的长度或数组元素的个数

第一个: int ages[10];就表示要开辟10块int类型大小的小空间, 即 这个ages数组的的长度为10, 也就是元素个数为10

另外一个有些不同: 整个int ages[10] = { 0 };完成的不仅仅是开辟一个长度为10的int类型数组, 还有对数组中每个元素初始化为0的操作

即, 定义数组时, 可以使用{ 数据 }的方式, 将数组中所有元素初始化为目标数据, 这是一种数组初始化的方式:

C
int ages[10] = { 0 };		// 定义一个长度为10的int类型数组, 且每个元素值初始化为0
int chars[10] = { 'A' };	// 定义一个长度为10的char类型数组, 且每个元素值初始化为'A'
...

除此之外, 还有另一种定义数组的方式:

C
int ages[] = { 0, 1, 2, 3, 4 };

即, 在变量名后加[](中间没有整数), 即 不需要明确指定数组长度, 但此时必须通过{ 数据1, 数据2, 数据3, ... }进行初始化

这样定义数组, 数组的长度就是{ 数据 }中数据的个数

数组的使用

数组的定义之后, 肯定是要使用的

那么, 数组该如何使用呢?

我们知道, 数组是开辟了一块大空间, 这块大空间中又可以分为若干块小空间, 小空间的大小均为数据类型的大小

事实上, 数组中的每块小空间是可以看作被标好号的:

即, 数组中的每一个元素, 都拥有一个下标, 通过下标就可以访问数组的这个元素

但要注意的是: 数组的下标是从0开始的

这句话的意思是:

如果一个数组的长度为10, 那么它下标的范围是[0, 9]

即, 访问它的第1个元素应该使用0作为下标, 相应的如果要访问它的第10个元素应该使用9作为下标

用一个简单的循环来实际演示一下:

C
#include <stdio.h>

int main() {
    int ages[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    for (int i = 0; i < 10; i = i + 1) {
        printf("ages[%d]: %d\n", i, ages[i]);
    }

    return 0;
}

先来简单分析一下这段代码:

  1. 首先定义了一个数组ages, 并进行初始化

    C
    int ages[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  2. 使用for循环语句, 目的是循环访问数组的不同元素

    C
    for (int i = 0; i < 10; i = i + 1) {
    }

    循环条件是i < 10, i的初始值为0, 每次循环结束i+1

    那么总循环次数就是10次, 对应i0 ~ 9

  3. 循环体, 使用printf()通过i作为数组下标访问数组元素

    C
    printf("ages[%d]: %d\n", i, ages[i]);

    ages[i]就是访问数组元素的实际操作

关于数组, 可以直接使用下标来访问目标元素

这段代码的运行结果为:

程序的执行没有出现问题

事实上, 要访问定义好的数据的元素, 最简单的方式就是数组名[下标]

但要注意的是, 访问数组元素时使用的下标, 一定不要超出数组范围, 否则就是越界访问, 可能会造成未知的错误

数组的大小

C语言中, 一个普通变量的大小就是数据类型的大小

那么, 数组的大小呢?

从上面介绍的数组来看, 可以推测数组的大小应该是 数据类型的大小×数组的长度

可以用代码验证一下:

C
#include <stdio.h>

int main() {
    int ages[10];
    printf("ages占用空间大小: %lu\n", sizeof(ages));
    printf("10个int类型数据占用空间大小: %lu\n", sizeof(int)*10);

    return 0;
}

从结果来看, 数组的大小确实为数据类型的大小×数组的长度


Thanks for reading!

从零接触C语言(初览)-VII: 数组

周四 7月 31 2025
2670 字 · 11 分钟