跳转到内容

C 语言二维数组

来自代码酷

C语言二维数组[编辑 | 编辑源代码]

二维数组是C语言中一种重要的数据结构,它允许开发者以表格形式(行和列)存储和处理数据。理解二维数组对于处理矩阵、表格数据或任何需要网格状结构的场景至关重要。

定义与声明[编辑 | 编辑源代码]

二维数组的声明语法如下:

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

例如:

int matrix[3][4]; // 声明3行4列的整型数组

内存表示[编辑 | 编辑源代码]

二维数组在内存中是按行优先连续存储的。对于一个数组int arr[2][3],内存布局如下:

graph LR A[arr[0][0]] --> B[arr[0][1]] --> C[arr[0][2]] --> D[arr[1][0]] --> E[arr[1][1]] --> F[arr[1][2]]

初始化方法[编辑 | 编辑源代码]

二维数组有多种初始化方式:

1. 完全初始化

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

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

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

3. 省略行数初始化(编译器自动推断):

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

访问元素[编辑 | 编辑源代码]

通过双重索引访问元素,索引从0开始:

int value = matrix[1][2]; // 访问第2行第3列元素

示例程序[编辑 | 编辑源代码]

以下程序演示二维数组的基本操作:

#include <stdio.h>

int main() {
    // 声明并初始化
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    
    // 打印数组
    printf("二维数组内容:\n");
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 计算总和
    int sum = 0;
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            sum += matrix[i][j];
        }
    }
    printf("数组元素总和:%d\n", sum);
    
    return 0;
}

输出:

二维数组内容:
1 2 3 
4 5 6 
数组元素总和:21

实际应用案例[编辑 | 编辑源代码]

学生成绩管理系统[编辑 | 编辑源代码]

二维数组非常适合存储多个学生的多科成绩:

#include <stdio.h>
#define STUDENTS 3
#define SUBJECTS 4

int main() {
    float grades[STUDENTS][SUBJECTS] = {
        {78.5, 82.0, 90.5, 87.0},
        {85.0, 88.5, 92.0, 84.5},
        {90.0, 91.5, 89.0, 93.5}
    };
    
    // 计算每个学生的平均分
    for(int i = 0; i < STUDENTS; i++) {
        float sum = 0;
        for(int j = 0; j < SUBJECTS; j++) {
            sum += grades[i][j];
        }
        printf("学生%d的平均分:%.2f\n", i+1, sum/SUBJECTS);
    }
    
    return 0;
}

矩阵运算[编辑 | 编辑源代码]

二维数组是矩阵运算的基础:

#include <stdio.h>
#define ROWS 2
#define COLS 2

void matrixAddition(int a[ROWS][COLS], int b[ROWS][COLS], int result[ROWS][COLS]) {
    for(int i = 0; i < ROWS; i++) {
        for(int j = 0; j < COLS; j++) {
            result[i][j] = a[i][j] + b[i][j];
        }
    }
}

int main() {
    int matrix1[ROWS][COLS] = {{1, 2}, {3, 4}};
    int matrix2[ROWS][COLS] = {{5, 6}, {7, 8}};
    int sum[ROWS][COLS];
    
    matrixAddition(matrix1, matrix2, sum);
    
    printf("矩阵相加结果:\n");
    for(int i = 0; i < ROWS; i++) {
        for(int j = 0; j < COLS; j++) {
            printf("%d ", sum[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

高级主题[编辑 | 编辑源代码]

指针与二维数组[编辑 | 编辑源代码]

二维数组名是指向第一行的指针。对于数组int arr[3][4]

  • arr 的类型是 int (*)[4]
  • arr[i] 的类型是 int *

动态分配[编辑 | 编辑源代码]

可以使用指针数组动态分配二维数组:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;
    int **matrix = (int **)malloc(rows * sizeof(int *));
    
    for(int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }
    
    // 使用矩阵...
    
    // 释放内存
    for(int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    
    return 0;
}

常见问题[编辑 | 编辑源代码]

  • 数组越界:C语言不检查数组边界,访问超出范围的元素会导致未定义行为
  • 内存布局误解:二维数组在内存中是连续的,不是"数组的数组"
  • 初始化错误:列数必须在声明时指定,行数可以省略

数学表示[编辑 | 编辑源代码]

二维数组可以表示为数学中的矩阵: Am×n=[a0,0a0,1a0,n1a1,0a1,1a1,n1am1,0am1,1am1,n1]

总结[编辑 | 编辑源代码]

二维数组是C语言中处理表格数据的强大工具。通过本教程,您应该已经掌握了:

  • 二维数组的声明和初始化方法
  • 元素的访问和遍历技巧
  • 实际应用场景的实现
  • 高级主题如指针关系和动态分配

理解这些概念将为学习更复杂的数据结构和算法奠定坚实基础。