QuânSysAd's Blog: pointer
Hiển thị các bài đăng có nhãn pointer. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn pointer. Hiển thị tất cả bài đăng

16 tháng 7 2018

Coding Style: Khai báo con trỏ trong C và khoảng trắng

Đôi khi bạn sẽ thấy có nhiều kiểu khai báo con trỏ như sau:

someType* somePtr;

someType *somePtr;


someType * somePtr;

Tất cả là như nhau hết. Nhưng đôi khi phong cách của người lập trình nhằm mục đích nhấn mạnh ý nghĩa của nó.

Cách đầu tiên nhấn mạnh vào kiểu của biến con trỏ.

Cách thứ 2 là nhấn mạnh kiểu của dữ liệu mà con trỏ trỏ tới.

Cách thứ 3 là trung lập. Không muốn nhấn mạnh cái gì cả.

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.