Bài viết mình sẽ giới thiệu về Two Pointer
, đại loại là sử dụng con trỏ kép **
.
Cú pháp
type_data **name_variable;
Ví dụ
#include <stdio.h>
#include <stdlib.h> int main() { int rows = 3; // Số hàng int cols = 4; // Số cột // Khai báo một con trỏ kép int **arr; // Cấp phát bộ nhớ cho mảng chính (chứa các con trỏ hàng) // arr bây giờ là một mảng có 3 phần tử, mỗi phần tử là một con trỏ kiểu int* arr = (int **)malloc(rows * sizeof(int *)); // Kiểm tra xem việc cấp phát có thành công không if (arr == NULL) { printf("Loi: Khong the cap phat bo nho."); return 1; } // Cấp phát bộ nhớ cho từng hàng // Mỗi phần tử của mảng arr (tức là mỗi con trỏ hàng) sẽ trỏ tới một mảng số nguyên for (int i = 0; i < rows; i++) { arr[i] = (int *)malloc(cols * sizeof(int)); if (arr[i] == NULL) { printf("Loi: Khong the cap phat bo nho."); // Giải phóng bộ nhớ đã cấp phát trước đó để tránh rò rỉ for (int j = 0; j < i; j++) { free(arr[j]); } free(arr); return 1; } } // Gán giá trị vào mảng for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { arr[i][j] = i * cols + j + 1; } } // In mảng ra màn hình for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } // Giải phóng bộ nhớ đã cấp phát // Phải giải phóng từng hàng trước for (int i = 0; i < rows; i++) { free(arr[i]); } // Sau đó giải phóng mảng chính free(arr); return 0;
}
Output
1 2 3 4 5 6 7 8 9 10 11 12