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

C语言二维数组的定义、初始化和赋值(附带示例)

二维数组是C语言中一种重要的数据结构,它可以用来存储和处理表格形式的数据。本文将详细介绍C语言中二维数组的定义、初始化和赋值方法,帮助读者深入理解这一概念。

二维数组的定义

在C语言中,二维数组可以看作是“数组的数组”,它由多个一维数组组成,每个一维数组都是二维数组的一行。定义二维数组的一般语法如下:

数据类型 数组名[行数][列数];

例如,要定义一个 3 行 4 列的整型二维数组,可以这样写:

int matrix[3][4];

这里,matrix 是数组名,3 表示数组有 3 行,4 表示每行有 4 个元素。需要注意的是,C语言中数组的下标是从 0 开始的,所以这个数组的有效下标范围是 [0,2] 和 [0,3]。

二维数组的初始化

所谓初始化,就是在定义的同时进行赋值。C语言提供了多种方式来初始化二维数组,以下是几种常见的初始化方法:

1. 完全初始化

在定义数组时,我们可以直接为所有元素赋初值,这种方法称为完全初始化:

int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

在这个例子中,我们定义了一个 3x4 的整型数组,并为每个元素都指定了初始值。外层大括号包含了整个数组的初始化列表,内层大括号分别对应每一行的初始化。

2. 部分初始化

如果我们只想初始化部分元素,可以采用部分初始化的方式:

int matrix[3][4] = {
    {1, 2},
    {5},
    {9, 10, 11}
};

在这个例子中,未被明确初始化的元素会被自动初始化为 0。因此,上面的初始化等价于:

int matrix[3][4] = {
    {1, 2, 0, 0},
    {5, 0, 0, 0},
    {9, 10, 11, 0}
};

3. 一维数组形式的初始化

我们还可以将二维数组看作一个大的一维数组来进行初始化:

int matrix[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

这种初始化方式会按行依次填充数组元素,它等价于上面完全初始化的例子。

4. 省略行数的初始化

在初始化二维数组时,我们可以省略第一个维度(行数),编译器会根据初始化列表自动计算:

int matrix[][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

在这个例子中,编译器会自动计算出数组有 3 行。但是,我们不能省略第二个维度(列数),因为编译器需要知道每行的大小来正确分配内存。

二维数组的赋值

初始化之后,我们可能需要修改数组中的某些元素。在C语言中,我们可以通过下标来访问和修改二维数组的元素。
 

要为二维数组的单个元素赋值,我们需要指定该元素的行索引和列索引:

int matrix[3][4];
matrix[1][2] = 100;  // 将第 2 行第 3 列的元素赋值为 100

记住,C语言的数组索引是从 0 开始的,所以 matrix[1][2] 实际上是指第 2 行第 3 列的元素。
 

如果我们需要为整个数组或者数组的一部分赋值,通常会使用嵌套循环:

int matrix[3][4];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        matrix[i][j] = i * 4 + j + 1;
    }
}

这段代码会将 matrix 数组初始化为:

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


对于有经验的C程序员来说,使用指针来操作二维数组是一种常见的做法。虽然这种方法可能看起来更复杂,但在某些情况下可以提高程序的效率:

int matrix[3][4];
int *p = &matrix[0][0];
for (int i = 0; i < 3 * 4; i++) {
    *p++ = i + 1;
}

这段代码的效果与上面的嵌套循环相同,都会将 matrix 数组初始化为 1 到 12 的连续数字。

二维数组的内存布局

理解二维数组的内存布局对于深入掌握二维数组的使用非常重要。在C语言中,二维数组在内存中是以行主序(row-major order)存储的,这意味着同一行的元素在内存中是连续存储的。

例如,对于一个 3x4 的数组:

int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

在内存中的实际存储顺序是:

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

理解这一点对于使用指针操作二维数组,以及在函数间传递二维数组都很有帮助。

二维数组的应用

二维数组在许多实际应用中都有重要作用,例如,我们可以用二维数组来表示图像(每个元素表示一个像素),或者用来存储表格数据(如学生的成绩表)。下面是一个简单的例子,展示如何使用二维数组来计算学生的平均成绩:

#include <stdio.h>

#define STUDENTS 3
#define SUBJECTS 4

int main() {
    float grades[STUDENTS][SUBJECTS] = {
        {85, 90, 75, 88},
        {92, 78, 86, 95},
        {89, 93, 82, 79}
    };
    
    for (int i = 0; i < STUDENTS; i++) {
        float sum = 0;
        for (int j = 0; j < SUBJECTS; j++) {
            sum += grades[i][j];
        }
        float average = sum / SUBJECTS;
        printf("学生 %d 的平均成绩是: %.2f\n", i + 1, average);
    }
    
    return 0;
}

这个程序的输出结果会是:

学生 1 的平均成绩是: 84.50
学生 2 的平均成绩是: 87.75
学生 3 的平均成绩是: 85.75

通过这个例子,我们可以看到二维数组如何在实际问题中发挥作用,它不仅可以方便地存储多维数据,还能让我们轻松地进行各种计算和数据处理。

相关文章