Bài 64. Mối quan hệ giữa con trỏ và mảng

Trong bài học này, Lập trình không khó sẽ cùng các bạn đi tìm hiểu mối quan hệ giữa con trỏ và mảng trong ngôn ngữ lập trình C. Bạn sẽ học thêm về một số toán tử của con trỏ, sử dụng các toán tử đó để duyệt mảng. Do đó, bạn sẽ biết thêm 1 cách mới để lặp qua mảng sử dụng con trỏ. Tất nhiên, mục tiêu cao hơn hết là giúp bạn hiểu sâu hơn, biết thêm các kiến thức về con trỏ trong ngôn ngữ C.

Trước khi bạn bắt đầu bài học này, bạn cần chắc chắn mình nắm rõ các kiến thức dưới đây:

Các phần tử của mảng là các ô nhớ liên tiếp

Nhắc lại khái niệm về mảng: “Mảng là một tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ“.

Các bạn đặc biệt lưu ý tới tính chất được lưu trên các ô nhớ liên tục, bây giờ chúng ta sẽ chứng minh tính đúng đắn của nó bằng ví dụ dưới đây:

Mình xin 5 phút quảng cáo nha =))

Kết quả chạy chương trình trên:

Nhận xét:

  • Các phần tử liên tiếp có địa chỉ cách nhau 4 giá trị, bởi vì 1 phần tử kiểu int có kích thước 4 bytes (máy tính x64). Nên ta chắc chắn các phần tử mảng được xếp cạnh nhau trong bộ nhớ.
  • Một điều đặc biệt nữa, như mình có nói là khi truyền mảng vào hàm thì mặc định là truyền theo tham chiếu. Và trong ví dụ này bạn thấy đó, địa chỉ của biến mảng chính là địa chỉ của phần tử đầu tiên của mảng. Và giá trị của biến mảng cũng chính là địa chỉ của phần tử đầu tiên của mảng.
  • Như vậy, &arr[0] tương đương &arr và tương đương arr. Điều đó có được là do biến arr trỏ tới phần tử đầu tiên của mảng.

Toán tử tăng và giảm của con trỏ

Giống như biến thông thường, con trỏ cũng có toán tử tăng và giảm. Nhưng cách toán tử tăng/ giảm trên con trỏ làm việc như nào.

Kết quả chạy:

Như bạn thấy:

  • Khi dùng toán tử tăng/ giảm trên biến con trỏ, nó sẽ nhảy sang ô nhớ liền kề chứ không phải tăng địa chỉ mà nó đang trỏ lên 1. Do con trỏ p là kiểu int nên mỗi bước tăng, giá trị của p tăng thêm 4 giá trị. (Lưu ý: giá trị của con trỏ là địa chỉ mà nó đang trỏ tới)
  • Nếu bạn muốn tăng giá trị của địa chỉ nơi con trỏ đang trỏ tới, hãy dùng cách dưới đây:

Mối quan hệ giữa con trỏ và mảng trong C

Tới đây chắc hẳn bạn đã hình dung được sự liên hệ giữa con trỏ và mảng, mình sẽ cùng các bạn đi tới các kết luận về con trỏ và mảng nhé.

Bài 65. Mối quan hệ giữa con trỏ và mảng
Mối quan hệ giữa con trỏ và mảng trong C

Với mảng trong ảnh phía trên, ta có:

  • &x[0]x có cùng giá trị, và x[0] hay *x là tương đương nhau.
  • &x[1] tương đương với x+1x[1] tương đương với *(x+1).
  • &x[2] tương đương với x+2x[2] tương đương với *(x+2).
  • Tóm lại, &x[i] tương đương với x+ix[i] tương đương với *(x+i).

Hãy thử nhập xuất mảng theo cách mới nào:

Kết quả chạy:

Lưu ý: Trong hầu hết trường hợp, tên biến mảng được chuyển đổi thành 1 con trỏ. Do đó, bạn có thể sử dụng con trỏ để truy cập các phần tử của mảng. Tuy nhiên, bạn cần lưu ý con trỏ và mảng không phải là một nhé. Có 1 số trường hợp ngoại lệ, bạn xem chi tiết tại: When does array name doesn’t decay into a pointer?

Ví dụ mối quan hệ giữa con trỏ và mảng

Bạn cũng có thể sử dụng một biến con trỏ khác để duyệt mảng, xem ví dụ bài tập tính tổng các phần tử trong mảng 1 chiều sử dụng con trỏ dưới đây:

Kết quả chạy chương trình:

Bài viết này mình đã cùng bạn đi làm rõ mối liên hệ giữa con trỏ và mảng trong C. Giờ đây bạn có thêm 1 cách để duyệt mảng cực ngầu. Hơn hết, bạn hiểu nhiều hơn về mối quan hệ giữa con trỏ và mảng, ứng dụng của con trỏ trong mảng. Ở các bài sau chúng ta sẽ tiếp tục khám phá về con trỏ nhé.

Tài liệu tham khảo

  1. https://www.programiz.com/c-programming/c-pointers-arrays
avatar
  Subscribe  
Notify of