C语言数组入门:定义、初始化与常用操作全解析

键盘旁的猫
键盘旁的猫
发布时间:2026-10-16| 6人浏览过
原创

深入了解 C 语言中数组的底层机制与应用技巧。从基础语法出发,详述一维/二维数组的定义规则与多种初始化策略,重点演示如何通过循环结构实现数据的遍历、极值查找以及逆序排列。文中还包含对主流排序算法(冒泡、选择、直接插入)的代码级拆解,并专门探讨了字符数组在处理字符串输入输出时的特殊性。

1 数组的基本概念

数组是 C 语言中的一种构造数据类型,由类型相同的若干个数据元素组成。这些元素在内存中以连续的区域顺序存放。数组的存在使得批量处理相同类型的对象变得更为高效。

2 数组定义规范

C 语言编译器要求在编译期间就必须确定数组的内存大小,因此数组的维度必须是确定的:

  • 基本语法:数组类型 数组名[数组大小]。
  • 长度约束:数组大小决定可容纳的元素数量,必须是大于 0 的正整数。
  • 类型限制:方括号内的内容只能是常量或常量表达式,不支持使用变量来动态指定数组大小(传统静态数组)。

3 一维数组的定义与初始化

第1步:全部初始化

在定义数组的同时提供完整的初始值列表。要求大括号内的元素个数必须与数组大小严格一致。

int arr[5] = {1, 2, 3, 4, 5};
// 结果: arr[0]=1, arr[1]=2 ... arr[4]=5

注意:初始化列表仅能在定义时配合使用,定义完成后无法再次使用此语法赋值。

第2步:部分初始化

当提供的初始值少于数组大小时,剩余元素将自动补零。这在开发中常用于将数组清零。

int arr[5] = {1, 2, 3};
// 结果: arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=0, arr[4]=0

常见用法:使用 int arr[100]={0}; 快速清空数组。

第3步:省略长度赋初值

如果提供了初始化列表且未明确指定长度,编译器会根据列表中元素的个数自动推断数组大小。

int arr[] = {1, 2, 3, 4, 5};
// 等效于 int arr[5]

4 一维数组的实际应用场景

第4步:计算统计指标(最大值、最小值、平均值)

利用循环遍历数组,累加求和并在比较中保留当前最大或最小值。以下是完整实现代码:

#include <stdio.h>
int main(void)
{
    int arr[10];
    int i, sum, max, min;

    // 1. 读入数据
    for(i=0; i<10; i++) {
        scanf("%d", &arr[i]);
    }

    // 2. 初始化边界值
    sum = 0;
    max = arr[0];
    min = arr[0];

    // 3. 计算统计量
    for(i=0; i<10; i++) {
        sum += arr[i];
        if(max < arr[i]) max = arr[i];
        if(min > arr[i]) min = arr[i];
    }

    // 4. 输出结果
    printf("平均值为:%.2f\n", (float)sum/10);
    printf("最大值为:%d\n", max);
    printf("最小值为:%d\n", min);
    return 0;
}

第5步:数组逆置

通过双指针思维,让首尾对应位置的元素互换。只需遍历数组的前半部分即可完成整个数组的反转。

#include <stdio.h>
int main(void) {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i, temp;

    // 逆置逻辑
    for(i=0; i<10/2; i++) {
        temp = arr[i];
        arr[i] = arr[10-i-1];
        arr[10-i-1] = temp;
    }

    // 验证输出
    for(i=0; i<10; i++) {
        printf("%d\n", arr[i]);
    }
    return 0;
}

第6步:经典排序算法实现

数组最常用的场景之一是排序。以下展示三种基础且易于理解的方法:

6.1 冒泡排序 (Bubble Sort)

原理:两两比较相邻元素,将最大的值“冒泡”至末尾。需进行 N-1 轮比较。

for(i=0; i<10-1; i++) {
    for(j=0; j<10-i-1; j++) {
        if(arr[j] > arr[j+1]) {
            temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
}

6.2 选择排序 (Selection Sort)

原理:每一轮在未排序序列中找到最小值,然后与未排序部分的第一个位置交换。

for(i=0; i<10-1; i++) {
    int min = i;
    for(j=i+1; j<10; j++) {
        if(arr[min] > arr[j]) {
            min = j;
        }
    }
    if(min != i) {
        temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

6.3 直接插入排序 (Insertion Sort)

原理:构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。适用于少量元素的数据。

for(i=1; i<10; i++) {
    temp = arr[i]; // 保存当前待插入元素
    for(j=i-1; j>=0 && arr[j]>temp; --j) {
        arr[j+1] = arr[j]; // 后移元素
    }   
    arr[j+1] = temp; // 插入正确位置
}

5 二维数组的处理逻辑

二维数组本质上是“数组的数组”。在内存中依然是线性存储,但在逻辑上可以看作行和列组成的表格。定义时需遵循 类型 名称[行数][列数] 的规则。

第7步:二维数组的初始化策略

  • 分行赋初值:int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; 清晰直观。
  • 按顺序赋初值:元素按行优先原则依次填入,可省略第一维(行数),但不可省略第二维(列数)。
    示例:int arr[][3] = {{1, 2}, {3, 4}}; // 系统推断为 [2][3]
  • 部分初始化:未指定的元素同样默认补 0。

第8步:二维数组的应用案例(成绩统计)

假设数据结构为 arr[3][4](3 门课,4 位学生)。

任务分解:

  1. 按行遍历:固定课程(i),遍历所有学生(j),计算该课程的平均分。
  2. 按列遍历:固定学生(j),遍历所有课程(i),计算该学生的平均分。

核心逻辑示意:

// 计算每门课的平均成绩 (按行)
for(i=0; i<3; i++) {
    sum = 0;
    for(j=0; j<4; j++) {
        sum += arr[i][j];
    }
    aver1[i] = sum / 4.0;
}

// 计算每个学生的平均成绩 (按列)
for(j=0; j<4; j++) {
    sum = 0;
    for(i=0; i<3; i++) {
        sum += arr[i][j];
    }
    aver2[j] = sum / 3.0;
}

6 字符数组与字符串管理

C 语言中没有原生的 String 类型,字符串是通过字符数组实现的。判断一个字符数组是否为字符串的标准是:是否存在终止符 '\0'(ASCII 码为 0)。

第9步:字符数组的初始化对比

char s1[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; // 手动添加结束符
char s2[6] = "abcde"; // 系统自动追加 '\0',效果等同

第10步:获取与输出字符串的差异

  • scanf 局限性:scanf("%s", str) 遇到空格、制表符或换行符就会停止读取,且数组名前不能加 &。若输入中包含空格,只能截取第一部分。
  • gets 的功能:gets(str) 能够读取整行内容,直到遇到换行符为止,支持包含空格的完整句子。(注:在现代工程实践中 gets 因安全隐患常被弃用,此处仅作概念说明)。
  • puts 的优势:puts(str) 打印字符串后会自动附加一个换行符,比 printf("%s\n") 更简洁。

总结

数组是 C 语言程序设计的基石。掌握其定义规则能避免越界访问风险;理解初始化细节有助于减少调试成本;而熟悉如冒泡、选择等基础排序算法则是处理数据流的前提。此外,区分普通字符数组与以 '\0' 结尾的字符串,正确使用 I/O 函数,是保证文本处理稳定性的关键。以上就是 C 语言数组使用详解的详细内容,更多关于 C 语言编程入门的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。