Thắc mắc sự khác nhau giữa int *a[5] và int (*a)[5] trong c/c++

Em đang đọc về mảng 2 chiều thì gặp vấn đề như trên:

Em hiểu int *a[5]; là khai báo mảng 5 con trỏ; còn int (*a)[5]; là gì ạ? Tại sao 2 cái này lại khác nhau?

Em đọc thêm thì thấy mảng (vd: int arr[5] ) thực chất không phải là một con trỏ mà được dùng như 1 con trỏ. M.n có thể giải thích bản chất của arr là sao không ạ? arr có kiểu là gì? Em thấy người ta dùng:

int arr[5]  = {1, 2, 3, 4, 5};
int (*a)[5];
a = &arr; // Là sao @@
cout << (*a)[2]; // Sẽ in ra 3

Tks!

int *a[5] : khai báo mảng a gồm 5 phần tử, mỗi phần tử có kiểu int*(tức con trỏ kiểu int hay 1 mảng int) - Có thể hiểu đây là 1 mảng 2 chiều nhưng fixed 1 chiều có size là 5.
int (*a)[5]: khai báo con trỏ a trỏ tới 1 mảng 5 phần tử, mỗi phần tử có kiểu int.

do a là 1 con trỏ trỏ tới 1 mảng gồm 5 phần tử nên bạn có thể gán địa chỉ của mảng đó (địa chỉ phần tử đầu tiên của mảng) cho con trỏ a để nó quản lý.
Bạn đã nghe câu "con trỏ cũng như 1 mảng, còn mảng cũng như con trỏ nhưng có điều tên mảng là 1 hằng con trỏ "bao giờ chưa?

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?