
Gửi bởi
theiron97
Các bạn phân biệt hộ mình 2 cách viết này với :
int *A[3];
int (*A)[3];
Mình cảm ơn.
Để đọc khai báo trong C/C++, bạn cần nắm rõ thứ tự ưu tiên của các phép toán (operators). Đây là các phép toán, liệt kê theo thứ tự ưu tiên từ cao đến thấp, mà mình nghĩ bạn nên thuộc:
- (): hàm, []: mảng (hai toán tử này có cùng độ ưu tiên)
- *: con trỏ
Chú ý () cũng được dùng cho cặp ngoặc đơn, và nó luôn có độ ưu tiên cao nhất.
Khi đọc một khai báo thì nên bắt đầu với tên biến/tên hàm (identifier) trước. Toán tử nào có độ ưu tiên cao thì đọc trước. Trong ví dụ của bạn:
int *a[3]: Bắt đầu với a và nó có hai toán tử * và []. Toán tử [] có độ ưu tiên cao hơn *, nên đọc nó trước, và a sẽ là mảng 3 phần tử. Tiếp theo là *, nên các phần tử sẽ là kiểu con trỏ. a là mảng 3 con trỏ kiểu int.
int (*a)[3]: Cặp () có ưu tiên cao hơn [], nên * sẽ được đọc đầu tiên, và a sẽ là con trỏ. Tiếp theo là [], nên con trỏ sẽ trỏ tới mảng 3 phần tử kiểu int. a là con trỏ tới mảng 3 phần tử kiểu int.
Khai báo sẽ phức tạp hơn khi có cả mảng và con trỏ hàm (function pointers). Ví dụ:
int (*p)(void): p là con trỏ tới hàm trả về kiểu int.
int *(*p)(void): p là con trỏ tới hàm trả về kiểu con trỏ int.
int (*a[10])(void): a là mảng 10 con trỏ tới hàm trả về kiểu int.
int (*f(void))[10]: f là hàm (do () hàm có độ ưu tiên cao hơn *) trả về con trỏ (dấu *) tới mảng 10 int.
int (*f(void))(void): f là hàm trả về con trỏ tới hàm trả về int.
Thực ra thì bạn chỉ cần đọc một vài khai báo "chuối" là sẽ quen. Dưới đây cũng là một khai báo trong C/C++. Bạn có thể thử xem nó khai báo gì:
Mã:
int (*(*(*hell[1])(void *(*)(void)))[1])(void *(*)(void));
Dĩ nhiên là trong thực tế chắc sẽ không có khai báo kiểu này. Nó chỉ để luyện tập thôi.
NGUỒN SỈ ÁO KHOÁC DENIM NỮ TPHCM CHẤT LƯỢNG CAO Bạn muốn nhập sỉ áo khoác denim nữ để bắt đầu việc buôn bán Online phong cách nhưng lại chưa có kinh nghiệm, muốn sắm xưởng sỉ xống áo vừa có thể giải...
Xưởng sỉ áo khoác jeans denim giá...