多维数组

矩阵与表格数据

多维数组用于存储矩阵、表格等复杂结构数据。东巴文(db-w.cn) 将带你深入理解多维数组,掌握其核心应用。

💡 东巴文观点:多维数组是数组的数组,通过多个下标访问元素,是处理矩阵和表格数据的基础。

多维数组概述

什么是多维数组?

东巴文说明:多维数组是数组的数组,通过多个下标访问元素,用于存储矩阵、表格等复杂结构。

东巴文多维数组特点

多维数组特点
├── 多个维度
├── 多个下标访问
├── 内存连续
├── 长度固定
└── 可视为矩阵/表格

二维数组

二维数组的声明与初始化

#include <stdio.h>

int main() {
    printf("=== 东巴文二维数组声明与初始化 ===\n\n");
    
    // 声明
    int matrix1[3][4];
    
    // 完全初始化
    int matrix2[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 部分初始化
    int matrix3[3][4] = {
        {1, 2},
        {5},
        {9, 10, 11}
    };
    
    // 自动推断行数
    int matrix4[][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8}
    };
    
    // 打印matrix2
    printf("matrix2:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%2d ", matrix2[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

二维数组的访问

#include <stdio.h>

int main() {
    printf("=== 东巴文二维数组访问 ===\n\n");
    
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    // 访问元素
    printf("matrix[0][0] = %d\n", matrix[0][0]);
    printf("matrix[1][1] = %d\n", matrix[1][1]);
    printf("matrix[2][2] = %d\n", matrix[2][2]);
    
    // 修改元素
    matrix[1][1] = 50;
    printf("修改后 matrix[1][1] = %d\n", matrix[1][1]);
    
    // 遍历二维数组
    printf("\n遍历二维数组:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

二维数组的内存布局

#include <stdio.h>

int main() {
    printf("=== 东巴文二维数组内存布局 ===\n\n");
    
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    printf("二维数组内存布局:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("&matrix[%d][%d] = %p, 值 = %d\n", 
                   i, j, &matrix[i][j], matrix[i][j]);
        }
    }
    
    printf("\n数组首地址:%p\n", matrix);
    printf("数组大小:%zu 字节\n", sizeof(matrix));
    printf("行数:%zu\n", sizeof(matrix) / sizeof(matrix[0]));
    printf("列数:%zu\n", sizeof(matrix[0]) / sizeof(matrix[0][0]));
    
    return 0;
}

东巴文说明

  • 二维数组在内存中按行存储
  • 相邻元素地址连续
  • 二维数组可视为一维数组的数组

二维数组的应用

矩阵运算

#include <stdio.h>

int main() {
    printf("=== 东巴文矩阵运算 ===\n\n");
    
    int matrix1[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    int matrix2[2][3] = {
        {7, 8, 9},
        {10, 11, 12}
    };
    
    int sum[2][3];
    
    // 矩阵加法
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            sum[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }
    
    printf("矩阵1:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix1[i][j]);
        }
        printf("\n");
    }
    
    printf("\n矩阵2:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix2[i][j]);
        }
        printf("\n");
    }
    
    printf("\n矩阵和:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", sum[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

矩阵转置

#include <stdio.h>

int main() {
    printf("=== 东巴文矩阵转置 ===\n\n");
    
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    int transpose[3][2];
    
    // 转置
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            transpose[j][i] = matrix[i][j];
        }
    }
    
    printf("原矩阵(2x3):\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    printf("\n转置矩阵(3x2):\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

学生成绩管理

#include <stdio.h>

int main() {
    printf("=== 东巴文学生成绩管理 ===\n\n");
    
    // 3个学生,4门课程
    int scores[3][4] = {
        {85, 90, 78, 92},
        {76, 88, 95, 87},
        {90, 85, 88, 93}
    };
    
    char *courses[] = {"数学", "英语", "物理", "化学"};
    
    // 计算每个学生的总分和平均分
    printf("学生成绩统计:\n");
    for (int i = 0; i < 3; i++) {
        int sum = 0;
        printf("\n学生%d:\n", i + 1);
        for (int j = 0; j < 4; j++) {
            printf("  %s:%d\n", courses[j], scores[i][j]);
            sum += scores[i][j];
        }
        printf("  总分:%d\n", sum);
        printf("  平均分:%.2f\n", (double)sum / 4);
    }
    
    // 计算每门课程的平均分
    printf("\n课程平均分:\n");
    for (int j = 0; j < 4; j++) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += scores[i][j];
        }
        printf("%s:%.2f\n", courses[j], (double)sum / 3);
    }
    
    return 0;
}

图像处理

#include <stdio.h>

#define ROWS 5
#define COLS 5

// 打印图像
void printImage(int image[ROWS][COLS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%2d ", image[i][j]);
        }
        printf("\n");
    }
}

// 图像旋转90度
void rotateImage(int image[ROWS][COLS], int rotated[COLS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            rotated[j][ROWS - 1 - i] = image[i][j];
        }
    }
}

int main() {
    printf("=== 东巴文图像处理 ===\n\n");
    
    int image[ROWS][COLS] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15},
        {16, 17, 18, 19, 20},
        {21, 22, 23, 24, 25}
    };
    
    int rotated[COLS][ROWS];
    
    printf("原图像:\n");
    printImage(image);
    
    rotateImage(image, rotated);
    
    printf("\n旋转90度后:\n");
    for (int i = 0; i < COLS; i++) {
        for (int j = 0; j < ROWS; j++) {
            printf("%2d ", rotated[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

二维数组与函数

二维数组作为函数参数

#include <stdio.h>

#define ROWS 3
#define COLS 4

// 打印二维数组
void printMatrix(int rows, int cols, int matrix[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

// 计算矩阵元素和
int sumMatrix(int rows, int cols, int matrix[rows][cols]) {
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

int main() {
    printf("=== 东巴文二维数组与函数 ===\n\n");
    
    int matrix[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    printf("矩阵:\n");
    printMatrix(ROWS, COLS, matrix);
    
    int sum = sumMatrix(ROWS, COLS, matrix);
    printf("\n矩阵元素和:%d\n", sum);
    
    return 0;
}

三维数组

三维数组的声明与使用

#include <stdio.h>

int main() {
    printf("=== 东巴文三维数组 ===\n\n");
    
    // 2层,3行,4列
    int arr[2][3][4] = {
        {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        },
        {
            {13, 14, 15, 16},
            {17, 18, 19, 20},
            {21, 22, 23, 24}
        }
    };
    
    // 遍历三维数组
    for (int i = 0; i < 2; i++) {
        printf("第%d层:\n", i + 1);
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 4; k++) {
                printf("%2d ", arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
    
    return 0;
}

三维数组应用:RGB图像

#include <stdio.h>

#define HEIGHT 3
#define WIDTH 3
#define CHANNELS 3  // R, G, B

int main() {
    printf("=== 东巴文RGB图像 ===\n\n");
    
    // RGB图像:3x3像素,每个像素有R、G、B三个通道
    unsigned char image[HEIGHT][WIDTH][CHANNELS] = {
        {{255, 0, 0}, {0, 255, 0}, {0, 0, 255}},      // 红、绿、蓝
        {{255, 255, 0}, {255, 0, 255}, {0, 255, 255}}, // 黄、品红、青
        {{255, 255, 255}, {128, 128, 128}, {0, 0, 0}}  // 白、灰、黑
    };
    
    printf("RGB图像数据:\n");
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf("像素[%d][%d]: R=%3d, G=%3d, B=%3d\n", 
                   i, j, image[i][j][0], image[i][j][1], image[i][j][2]);
        }
    }
    
    return 0;
}

多维数组的应用实例

迷宫问题

#include <stdio.h>

#define ROWS 5
#define COLS 5

// 打印迷宫
void printMaze(int maze[ROWS][COLS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (maze[i][j] == 0) {
                printf("□ ");  // 通路
            } else {
                printf("■ ");  // 墙壁
            }
        }
        printf("\n");
    }
}

int main() {
    printf("=== 东巴文迷宫问题 ===\n\n");
    
    // 0表示通路,1表示墙壁
    int maze[ROWS][COLS] = {
        {0, 1, 0, 0, 0},
        {0, 1, 0, 1, 0},
        {0, 0, 0, 1, 0},
        {0, 1, 1, 1, 0},
        {0, 0, 0, 0, 0}
    };
    
    printf("迷宫:\n");
    printMaze(maze);
    
    printf("\n图例:□ = 通路, ■ = 墙壁\n");
    
    return 0;
}

生命游戏

#include <stdio.h>

#define ROWS 5
#define COLS 5

// 打印生命游戏状态
void printLife(int grid[ROWS][COLS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%c ", grid[i][j] ? '●' : '○');
        }
        printf("\n");
    }
}

// 计算邻居数量
int countNeighbors(int grid[ROWS][COLS], int row, int col) {
    int count = 0;
    for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
            if (i == 0 && j == 0) continue;
            int newRow = row + i;
            int newCol = col + j;
            if (newRow >= 0 && newRow < ROWS && 
                newCol >= 0 && newCol < COLS) {
                count += grid[newRow][newCol];
            }
        }
    }
    return count;
}

int main() {
    printf("=== 东巴文生命游戏 ===\n\n");
    
    int grid[ROWS][COLS] = {
        {0, 1, 0, 0, 0},
        {0, 0, 1, 0, 0},
        {1, 1, 1, 0, 0},
        {0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0}
    };
    
    printf("初始状态:\n");
    printLife(grid);
    
    printf("\n图例:● = 活细胞, ○ = 死细胞\n");
    
    return 0;
}

东巴文最佳实践

1. 使用宏定义数组大小

#include <stdio.h>

#define ROWS 3
#define COLS 4

int main() {
    printf("=== 东巴文使用宏定义数组大小 ===\n\n");
    
    // ✅ 推荐:使用宏定义
    int matrix[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    printf("矩阵:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

2. 初始化多维数组

#include <stdio.h>

int main() {
    printf("=== 东巴文初始化多维数组 ===\n\n");
    
    // ✅ 推荐:初始化为0
    int matrix1[3][4] = {0};
    
    // ✅ 推荐:完全初始化
    int matrix2[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    printf("matrix1:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", matrix1[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

3. 边界检查

#include <stdio.h>

#define ROWS 3
#define COLS 4

int main() {
    printf("=== 东巴文多维数组边界检查 ===\n\n");
    
    int matrix[ROWS][COLS] = {0};
    
    // ✅ 正确:检查边界
    int row = 2, col = 3;
    if (row >= 0 && row < ROWS && col >= 0 && col < COLS) {
        matrix[row][col] = 100;
        printf("matrix[%d][%d] = %d\n", row, col, matrix[row][col]);
    } else {
        printf("索引越界\n");
    }
    
    return 0;
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解多维数组的概念
  • 掌握二维数组的声明与初始化
  • 掌握二维数组的访问
  • 掌握二维数组的应用
  • 了解三维数组
  • 掌握多维数组与函数
  • 掌握最佳实践

下一步学习

掌握多维数组后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文多维数组提示:多维数组是处理矩阵和表格数据的基础,掌握多维数组是开发复杂应用的关键。在 db-w.cn,我们会通过大量实例帮你掌握多维数组的使用!