首页 > 编程笔记 > C语言笔记

C语言数组的定义和使用(附带示例)

在C语言中,数组是一种强大而灵活的数据结构,它允许我们在连续的内存位置存储相同类型的多个元素(多个数据)。一维数组是最简单的数组形式,可以被想象成一排整齐排列的盒子,每个盒子里都可以放置一个特定类型的值。

数组的概念

数组可以被视为相同数据类型的元素的有序集合。这些元素在内存中连续存储,可以通过索引快速访问。数组的索引通常从 0 开始,这意味着第一个元素的索引是 0,第二个是 1,依此类推。

这种设计使得数组操作非常高效,特别是在需要遍历或随机访问元素时。


例如,一个包含 6 个整数的数组可以表示为:
 

C语言一维数组示意图


数组的优势在于它能够有效地组织和管理大量相同类型的数据。例如,我们可以使用一个数组来存储一个班级的学生成绩,而不是为每个学生单独创建变量。

数组的声明

在C语言中,声明一个数组需要指定其数据类型和大小。声明语法如下:

数据类型 数组名[元素数量];

例如,声明一个包含 10 个整数的数组:

int scores[10];

这行代码告诉编译器为名为 scores 的数组分配足够存储 10 个整数的内存空间,并且数组的索引范围是从 0 到 9。

数组的初始化

数组可以在声明时进行初始化,也可以在后续代码中逐个赋值。以下是几种常见的初始化方法:


1. 声明时完全初始化:

int numbers[5] = {1, 2, 3, 4, 5};


2. 部分初始化(未指定的元素将被自动初始化为 0):

int partial[5] = {1, 2, 3}; // 等同于 {1, 2, 3, 0, 0}


3. 省略数组大小(编译器会根据初始化列表自动计算大小):

int auto_size[] = {1, 2, 3, 4, 5}; // 大小为 5


4. 使用循环进行初始化:

int dynamic[10];
for (int i = 0; i < 10; i++) {
    dynamic[i] = i * 2;
}

数组元素的访问

数组元素的访问是通过索引实现的,索引从 0 开始,最大值为数组长度减 1。使用方括号[ ]来指定要访问的元素的索引,具体格式为:

数组名[索引]

下面是一个简单的例子:

int scores[5] = {85, 92, 78, 90, 88};
printf("第三个学生的成绩是:%d\n", scores[2]); // 输出 78

我们也可以使用循环来遍历数组的所有元素:

for (int i = 0; i < 5; i++) {
    printf("第 %d 个学生的成绩是:%d\n", i+1, scores[i]);
}

需要注意的是,C语言不会自动检查数组边界,访问超出数组范围的元素可能导致未定义的行为,这是很多程序错误的来源。因此,确保访问的索引在有效范围内是程序员的责任。

数组和指针的关系

在C语言中,数组名实际上是一个指向数组第一个元素的指针,这意味着我们可以使用指针算术来访问数组元素:

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // ptr 指向 numbers[0]

printf("第一个元素:%d\n", *ptr);     // 输出 10
printf("第二个元素:%d\n", *(ptr+1)); // 输出 20

这种数组和指针的紧密关系使得C语言在处理大量数据时非常高效。

常见错误和注意事项

使用数组时,需要注意以下几点:


例如,以下代码演示了一个常见的数组越界错误:

int arr[5] = {1, 2, 3, 4, 5};
arr[5] = 6; // 错误!数组索引超出范围

综合示例:学生成绩管理

让我们通过一个综合示例来展示一维数组的实际应用。这个程序将管理一个班级的学生成绩:

#include <stdio.h>

#define CLASS_SIZE 5

int main() {
    int scores[CLASS_SIZE];
    int sum = 0;
    float average;

    // 输入学生成绩
    for (int i = 0; i < CLASS_SIZE; i++) {
        printf("请输入第 %d 个学生的成绩:", i + 1);
        scanf("%d", &scores[i]);
        sum += scores[i];
    }

    // 计算平均分
    average = (float)sum / CLASS_SIZE;

    // 输出所有成绩和平均分
    printf("\n学生成绩如下:\n");
    for (int i = 0; i < CLASS_SIZE; i++) {
        printf("学生 %d:%d\n", i + 1, scores[i]);
    }
    printf("\n班级平均分:%.2f\n", average);

    // 找出最高分和最低分
    int max = scores[0], min = scores[0];
    for (int i = 1; i < CLASS_SIZE; i++) {
        if (scores[i] > max) max = scores[i];
        if (scores[i] < min) min = scores[i];
    }
    printf("最高分:%d\n", max);
    printf("最低分:%d\n", min);

    return 0;
}

运行结果:

请输入第 1 个学生的成绩:90↙
请输入第 2 个学生的成绩:95↙
请输入第 3 个学生的成绩:100↙
请输入第 4 个学生的成绩:82↙
请输入第 5 个学生的成绩:77↙

学生成绩如下:
学生 1:90
学生 2:95
学生 3:100
学生 4:82
学生 5:77

班级平均分:88.80
最高分:100
最低分:77


这个程序展示了一维数组的多种用法:


通过这个例子,我们可以看到一维数组如何在实际编程中发挥作用,帮助我们组织和处理相关的数据集合。数组的灵活性和效率使它成为许多算法和数据处理任务的基础。


声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。