Trong int (*x)[10];
x
là một con trỏ đến một mảng của 10 int
sTại sao tuyên bố này không làm việc
Vậy tại sao mã này không biên dịch:
int arr[3] ;
int (*p)[3] =arr;
Nhưng công trình này:
int arr[3];
int (*p)[3] =&arr;
Trong int (*x)[10];
x
là một con trỏ đến một mảng của 10 int
sTại sao tuyên bố này không làm việc
Vậy tại sao mã này không biên dịch:
int arr[3] ;
int (*p)[3] =arr;
Nhưng công trình này:
int arr[3];
int (*p)[3] =&arr;
arr
là một biểu thức đánh giá thành một số int*
(đây là phần nổi tiếng 'phân rã thành con trỏ' ure).
&arr
là một biểu thức đánh giá thành int (*)[3]
.
Tên mảng 'phân rã' thành con trỏ đến thành phần đầu tiên của mảng trong tất cả các biểu thức trừ khi chúng là toán hạng cho các toán tử sizeof
hoặc &
. Đối với hai hoạt động này, các tên mảng giữ lại 'mảng' của chúng (C99 6.3.2.1/3 "Các giá trị, mảng và các hàm thiết kế").
Nó không làm việc cho chính xác lý do tương tự như:
int i;
int* pi = i; // error: no conversion from int to int*
+1: Tôi cũng sẽ chỉ ra rằng, mặc dù của một loại khác nhau, cả hai biểu thức trả về địa chỉ con trỏ tương tự. –