Bài 67. Cấp phát động mảng 2 chiều trong C

Bài số 65 trong 69 bài của series Học C Không Khó

Hôm nay Lập trình không khó sẽ cùng bạn thực hiện việc cấp phát động mảng 2 chiều trong C nhé. Mảng 2 chiều là 1 cấu trúc dữ liệu rất là quen thuộc đối với chúng ta. Ở bài trước mình đã có hướng dẫn cấp phát động mảng 1 chiều trong C rồi. Một điều đặc biệt lưu ý khi làm việc với con trỏ là chương trình của ta sẽ không tự giải phóng bộ nhớ cho bạn.

Cấp phát động mảng 2 chiều

Ở bài này mình sẽ đề cập 2 hướng tiếp cận, bao gồm:

  • Cấp phát động mảng 2 chiều sử dụng con trỏ cấp 2
  • Dùng mảng 1 chiều để lưu mảng 2 chiều

Cấp phát dùng con trỏ cấp 2

Mình nói qua về con trỏ đa cấp trước. Bạn hiểu rằng con trỏ được dùng để trỏ tới các biến thông thường, thì con trỏ cấp 2 dùng để trỏ tới con trỏ cấp 1. Tức là khi bạn muốn thay đổi giá trị của con trỏ cấp 1 thì ta dùng con trỏ cấp 2.

Số dấu * thể hiện cấp của con trỏ, và thường chúng ta chỉ dừng lại ở con trỏ cấp 2.

Theo khái niệm, mảng 2 chiều là tập hợp của các mảng 1 chiều. Như vậy, để cấp phát mảng 2 chiều thì ta chỉ cần cấp phát nhiều mảng 1 chiều là được.

Với code trên, ta đang thực hiện cấp phát động so_hang con trỏ 1 chiều – 1 con trỏ 1 chiều tương ứng là 1 hàng, với mỗi con trỏ 1 chiều ta cấp phát so_cot ô nhớ tương đương số lượng phần tử của mỗi hàng. Tức là ta đang cấp phát động cho mảng 2 chiều có kích thước so_hang x so_cot.

Và khi giải phóng mảng, ta phải giải phóng từng hàng rồi mới giải phóng con trỏ cấp 2 nhé.

Dưới đây là code ví dụ:

Kết quả chạy:

Dùng mảng 1 chiều để biểu diễn mảng 2 chiều

Để làm được việc này, ta giả sử cần lưu một mảng 2 chiều có kích thước m x n. Khi đó ta cấp phát 1 mảng 1 chiều am x n ô nhớ.

Khi đó, phần tử ở hàng i, cột j => tạm gọi là a[i][j] tương ứng là phần tử a[i*n + j].

Kết quả chạy:

Như vậy mình vừa cùng các bạn học cách cấp phát động mảng 2 chiều trong C theo 2 cách khác nhau. Xin chào và chúc các bạn học tập tốt!

Theo dõi lập trình không khó tại:

Các bài viết trong SeriesBài trước: Bài 66. Cấp phát bộ nhớ động trong CBài sau: Bài 68. Struct trong C

1 COMMENT

  1. Anh ơi! Trong TH hợp dùng mảng 1 chiều để cấp phát mảng 2 chiều, th này chỉ đúng với ma trận vuông! Còn với ma trận thường thì trường hợp này bị sai vì địa chị của phần tử cuối cùng của hàng (n) sẽ trùng với địa chỉ của phần tử đầu tiên của hàng (n + 1).

LEAVE A REPLY

Please enter your comment!
Please enter your name here