Access mảng 2 chiều bằng con trỏ. - QuânSysAd's Blog

26 tháng 6 2018

Access mảng 2 chiều bằng con trỏ.

Nhiều khi các bạn mới học C hay gặp trường hợp sau:
int array[5][10];
int el;

el = array[2][3];
el = *(array + 2)[3];
el = *(*(array + 2) + 3);
Bản chất 3 dòng cuối là tương đương nhau. Nhưng có khi bạn đọc vào dòng cuối cùng có khi không hiểu, thật ức chế. Hãy cùng tôi thông não hơn. Dưới đây là cách tôi giải thích. Cái này phải hiểu bản chất của mảng và con trỏ.
Khi ta khai báo mảng thì mảng xuất hiện trên một vùng nhớ, lúc này tên mảng tham chiếu tới giá trị đầu tiên của mảng array[0], phần tử mảng này là kiểu int, vì vậy nó có độ rộng 4kb (cái này tuỳ hệ điều hành), vì thế array[2] sẽ cách array[0] 2 block 4kb trên bộ nhớ. Vì thế để access array[2] bằng cấu trúc con trỏ ta có thể sử dụng *(array+2)
Tuy nhiên đối với mảng 2 chiều thì từng phần tử mảng lại là một mảng vì thế lúc này *(array+2) lại tham chiếu tới địa chỉ đầu tiên của mảng khác. Lúc này để access phần tử thứ 3 của mảng *(array+2) thì ta phải dùng *(*(array+2)+3)
Khi ta khai báo mảng 2 chiều lúc này từng phần tử của mảng 1 chiều lại chứa 1 mảng khác.

Không có nhận xét nào: