01/10/2018, 16:21

Hỏi về 1 cách khác truy cập tới phần tử mảng 2 chiều

http://diendan.congdongcviet.com/threads/t2154::mang-2-chieu-con-tro-den-con-tro-cap-phat-dong.cpp
mình đang đọc bài viết này đến đoạn này thì ngộ, ko hiểu gì cả
khi ta khai báo 1 mảng, đẻ truy cập phần tử ta cần làm thế này

int array[5][10];
int el;
el = array[2][3]; // cái này không có gì mới
el = *(array + 2)[3];// cái này cũng thế
el = *(*(array + 2) + 3); 

dòng cuối có nghĩa tương tự hai dòng phía trên nó, nhưng mình ko hiểu sao nó lại thế được, mong các bạn giải thích dùm

rogp10 viết 18:36 ngày 01/10/2018

Theo mình thì dòng 2 thấy đúng thì dòng 3 nó cũng vậy thôi

Dòng 2 khi deref int[][N] thì sẽ ra int[N]. Vì vậy array+2 sẽ tăng đúng là 2N slot.
Cả hai đều dùng ct a[i] = *(a+i) thôi.

newbie viết 18:33 ngày 01/10/2018
a[i] = *(a + 1)

a là địa chỉ case 0 trong mảng, để đi đến case n thì ta cần cộng thêm n sau đó dùng " * " để lấy giá trị,
thế nên ở

el = *(*(array + 2) + 3);

ta phải bỏ dấu * đi để lấy được địa chỉ chứ nhỉ, mình nói như vậy có gì sai mong bạn sửa giúp

newbie viết 18:23 ngày 01/10/2018
a[i] = *(a + 1)

a là địa chỉ case 0 trong mảng, để đi đến case n thì ta cần cộng thêm n sau đó dùng " * " để lấy giá trị,
thế nên ở

el = *(*(array + 2) + 3);

ta phải bỏ dấu * đi để lấy được địa chỉ chứ nhỉ, mình nói như vậy có gì sai mong bạn sửa giúp

Quan viết 18:28 ngày 01/10/2018

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] là 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.

Quan viết 18:29 ngày 01/10/2018
el = *(*(array + 2) + 3);
ta phải bỏ dấu * đi để lấy được địa chỉ chứ nhỉ, mình nói như vậy có gì sai mong bạn sửa giúp

Bạn nói rằng Nếu ta bỏ dấu * để lấy được địa chỉ là hoàn toàn đúng. Nhưng ở đây là ta đang access con trỏ để lấy giá trị bạn ơi, là GIÁ TRỊ đó chứ đâu phải địa chỉ. Mà giá trị thì phải thêm dấu * để dereference con trỏ. Nếu không thì bạn sẽ chỉ nhận được giá trị đại loại như kiểu 0x4000FE mà thôi.

newbie viết 18:27 ngày 01/10/2018

thanks bạn vì đã giúp mình

newbie viết 18:33 ngày 01/10/2018

cảm ơn các bạn vì đã giúp mình nha

Bài liên quan
0