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