Trong mã:
static int a[3] = {1, 2, 3};
Loại một là không phải con trỏ, nhưng mảng int. Tuy nhiên, nó được tự động chuyển đổi thành con trỏ, ví dụ: trong tiêu chuẩn C:
Ngoại trừ khi nó là toán hạng của toán tử sizeof hoặc toán tử đơn và toán tử, hoặc là chuỗi ký tự được sử dụng để khởi tạo mảng, biểu thức có loại '' mảng kiểu '' được chuyển thành một biểu thức với loại '' con trỏ để gõ '' trỏ đến phần tử ban đầu của đối tượng mảng và không phải là một giá trị.
Vì vậy, nếu a là mảng, hơn = {1, 2, 3} là khởi tạo, không phải là một loại mảng riêng biệt. Tôi không biết nếu nó được xác định chính xác ở đâu đó, nhưng theo nghĩa này nó được sử dụng xuyên suốt tiêu chuẩn.
Sửa để làm sáng tỏ sự nhầm lẫn của một số độc giả: theo tiêu chuẩn trích dẫn, nếu bạn viết:
int arr[4] = { };
arr[0] = 1; //arr here has here type int*
size_t sz = sizeof(arr); //here it is not type int*, sizeof is exception
trỏ gì bạn đang đề cập đến? –
Tôi đang tham chiếu đến con trỏ "a" (& a [0]). – Silas
Biểu thức '& a [0]' mà 'a' mở rộng trong hầu hết các ngữ cảnh không phải là một giá trị. Đó là một địa chỉ và không phải là một con trỏ. Chỉ có một định danh được xác định và đây là mảng. Vì không có số nhận dạng khác, không có gì để áp dụng 'tĩnh'. –