C语言快速入门教程
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
  • 基础教程

    • Hello World 深入理解
    • 变量详解
    • 数据类型详解
    • 运算符详解
    • 输入输出详解
    • 条件判断 if-else
    • 循环语句
    • 函数详解
    • 数组详解

数组详解

数组就像一排有编号的盒子,用来存储一组相同类型的数据!

什么是数组?

想象一个班级的座位:

[座位0] [座位1] [座位2] [座位3] [座位4]
  张三    李四    王五    赵六    钱七

数组的声明和初始化

语法

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

示例

#include <stdio.h>

int main() {
    // 声明并初始化
    int scores[5] = {85, 90, 78, 92, 88};
    
    // 部分初始化(其余为0)
    int nums[5] = {1, 2, 3};  // {1, 2, 3, 0, 0}
    
    // 全部初始化为0
    int zeros[5] = {0};
    
    // 自动推断大小
    int auto_arr[] = {1, 2, 3, 4, 5};  // 大小为5
    
    return 0;
}

访问数组元素

使用下标(索引)访问,从0开始!

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    
    printf("第1个元素:%d\n", arr[0]);  // 10
    printf("第2个元素:%d\n", arr[1]);  // 20
    printf("第5个元素:%d\n", arr[4]);  // 50
    
    // 修改元素
    arr[2] = 100;
    printf("修改后第3个元素:%d\n", arr[2]);  // 100
    
    return 0;
}

注意

数组下标从0开始,长度为n的数组,有效下标是0到n-1!

int arr[5];
arr[0] = 1;  // ✅ 正确
arr[4] = 2;  // ✅ 正确
arr[5] = 3;  // ❌ 越界!未定义行为

遍历数组

使用for循环

#include <stdio.h>

int main() {
    int scores[5] = {85, 90, 78, 92, 88};
    
    printf("所有成绩:\n");
    for (int i = 0; i < 5; i++) {
        printf("scores[%d] = %d\n", i, scores[i]);
    }
    
    return 0;
}

计算数组长度

int arr[10];
int length = sizeof(arr) / sizeof(arr[0]);

解释

  • sizeof(arr) - 整个数组的字节数
  • sizeof(arr[0]) - 单个元素的字节数
  • 相除得到元素个数

数组作为函数参数

#include <stdio.h>

// 方法1
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 方法2(等价)
void printArray2(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    printArray(nums, size);
    
    return 0;
}

重要

数组作为参数传递时,传递的是地址,不是副本! 所以在函数内修改数组,会影响原数组。

多维数组

二维数组

#include <stdio.h>

int main() {
    // 3行4列的二维数组
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 访问元素
    printf("第2行第3列:%d\n", matrix[1][2]);  // 7
    
    // 遍历
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

输出:

  1   2   3   4
  5   6   7   8
  9  10  11  12

实战案例

案例1:求数组最大值

#include <stdio.h>

int findMax(int arr[], int size) {
    int max = arr[0];
    
    for (int i = 1; i < size; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    
    return max;
}

int main() {
    int nums[] = {23, 67, 12, 89, 45, 34};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    int max = findMax(nums, size);
    printf("最大值:%d\n", max);
    
    return 0;
}

案例2:计算平均分

#include <stdio.h>

float calculateAverage(int scores[], int size) {
    int sum = 0;
    
    for (int i = 0; i < size; i++) {
        sum += scores[i];
    }
    
    return (float)sum / size;
}

int main() {
    int scores[] = {85, 90, 78, 92, 88};
    int size = sizeof(scores) / sizeof(scores[0]);
    
    float avg = calculateAverage(scores, size);
    printf("平均分:%.2f\n", avg);
    
    return 0;
}

案例3:数组反转

#include <stdio.h>

void reverseArray(int arr[], int size) {
    for (int i = 0; i < size / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[size - 1 - i];
        arr[size - 1 - i] = temp;
    }
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    printf("原数组:");
    printArray(nums, size);
    
    reverseArray(nums, size);
    
    printf("反转后:");
    printArray(nums, size);
    
    return 0;
}

案例4:冒泡排序

#include <stdio.h>

void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int nums[] = {64, 34, 25, 12, 22, 11, 90};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    printf("排序前:");
    for (int i = 0; i < size; i++) {
        printf("%d ", nums[i]);
    }
    printf("\n");
    
    bubbleSort(nums, size);
    
    printf("排序后:");
    for (int i = 0; i < size; i++) {
        printf("%d ", nums[i]);
    }
    printf("\n");
    
    return 0;
}

案例5:统计成绩等级

#include <stdio.h>

int main() {
    int scores[] = {85, 92, 78, 65, 95, 88, 72, 55, 90, 60};
    int size = sizeof(scores) / sizeof(scores[0]);
    
    int gradeCount[5] = {0};  // A, B, C, D, F
    
    for (int i = 0; i < size; i++) {
        if (scores[i] >= 90) {
            gradeCount[0]++;  // A
        } else if (scores[i] >= 80) {
            gradeCount[1]++;  // B
        } else if (scores[i] >= 70) {
            gradeCount[2]++;  // C
        } else if (scores[i] >= 60) {
            gradeCount[3]++;  // D
        } else {
            gradeCount[4]++;  // F
        }
    }
    
    printf("=== 成绩统计 ===\n");
    printf("A(90-100):%d人\n", gradeCount[0]);
    printf("B(80-89):%d人\n", gradeCount[1]);
    printf("C(70-79):%d人\n", gradeCount[2]);
    printf("D(60-69):%d人\n", gradeCount[3]);
    printf("F(0-59):%d人\n", gradeCount[4]);
    
    return 0;
}

练习题

练习1:查找元素

在数组中查找指定元素,返回其下标(找不到返回-1)。

练习2:数组去重

从数组中删除重复元素。

练习3:二维数组求和

计算二维数组每行和每列的和。

答案参考

查看答案

练习1:

#include <stdio.h>

int search(int arr[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

int main() {
    int nums[] = {10, 20, 30, 40, 50};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    int index = search(nums, size, 30);
    if (index != -1) {
        printf("找到了,下标:%d\n", index);
    } else {
        printf("未找到\n");
    }
    
    return 0;
}

知识点总结

  • ✅ 数组存储相同类型的多个数据
  • ✅ 下标从0开始
  • ✅ sizeof(arr)/sizeof(arr[0]) 获取长度
  • ✅ 数组作参数传递的是地址
  • ✅ 二维数组:arr[row][col]

下一步

👉 指针详解

最近更新: 2025/12/26 14:29
Prev
函数详解