Làm việc với mảng hai chiều (ma trận) trong C

Giới thiệu về Mảng Hai Chiều

Mảng hai chiều trong C được lưu trữ tuyến tính trong bộ nhớ, nhưng về mặt logic, nó được xem như một bảng có hàng và cột. Việc hiểu rõ cách khởi tạo và thao tác với mảng hai chiều là nền tảng quan trọng để nắm vững con trỏ và mảng.

1. Các Cách Khởi Tạo Mảng Hai Chiều

Cách 1: Khởi tạo toàn bộ giá trị trong một cặp ngoặc nhọn

Do mảng hai chiều lưu trữ tuyến tính, ta có thể liệt kê tất cả phần tử trong một khối:

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

Cách 2: Nhóm từng hàng bằng ngoặc nhọn con

Cách này giúp hình dung rõ cấu trúc hàng-cột hơn:

int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
// hoặc xuống dòng
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

Cách 3: Chỉ khởi tạo một số phần tử

Những phần tử không được gán sẽ tự động có giá trị 0:

int arr[3][4] = {{1}, {5}, {9}};

Cách 4: Gán tất cả phần tử cùng một giá trị

Để khởi tạo toàn bộ mảng với một giá trị duy nhất, chỉ cần đặt giá trị đó trong ngoặc:

// Gán tất cả phần tử bằng 0
int arr[3][4] = {0};

Cách 5: Chỉ định cụ thể phần tử bằng chỉ số

Sử dụng cú pháp [hàng][cột] để khởi tạo các vị trí nhất định:

int arr[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3};

Cách 6: Bỏ qua số lượng hàng

Khi khai báo, ta có thể không ghi số hàng, nhưng bắt buộc phải có số cột:

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

2. Chuyển vị Ma Trận

Chuyển vị ma trận là quá trình hoán đổi hàng thành cột và ngược lại. Kết quả là ma trận gốc 3x4 sẽ thành 4x3.

Đoạn mã dưới đây minh họa cách in ra ma trận chuyển vị ngay trong vòng lặp, mà không cần tạo mảng mới:

#include <stdio.h>

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

    printf("\n===========================\nMa trận gốc:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf(" [%d][%d] = %2d ", i, j, data[i][j]);
        }
        printf("\n");
    }

    // In ma trận chuyển vị: hoán đổi chỉ số hàng và cột
    printf("\n===========================\nMa trận chuyển vị:\n");
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 3; j++) {
            printf(" [%d][%d] = %2d ", i, j, data[j][i]);
        }
        printf("\n");
    }

    return 0;
}

Kết quả thực thi:

===========================
Ma trận gốc:
 [0][0] =  1  [0][1] =  2  [0][2] =  3  [0][3] =  4
 [1][0] =  5  [1][1] =  6  [1][2] =  7  [1][3] =  8
 [2][0] =  9  [2][1] = 10  [2][2] = 11  [2][3] = 12

===========================
Ma trận chuyển vị:
 [0][0] =  1  [0][1] =  5  [0][2] =  9
 [1][0] =  2  [1][1] =  6  [1][2] = 10
 [2][0] =  3  [2][1] =  7  [2][2] = 11
 [3][0] =  4  [3][1] =  8  [3][2] = 12

Thẻ: C mang-hai-chieu ma-tran chuyen-vi-ma-tran khoi-tao-mang

Đăng vào ngày 28 tháng 5 lúc 14:30