Việc kê khai đầu tiên cho trình biên dịch mà someArray
là ít nhất dài 100 yếu tố. Điều này có thể được sử dụng để tối ưu hóa. Ví dụ, nó cũng có nghĩa someArray
là không bao giờ NULL
.
Lưu ý rằng Tiêu chuẩn C không yêu cầu trình biên dịch chẩn đoán khi một lệnh gọi hàm không đáp ứng các yêu cầu này (nghĩa là đó là hành vi không xác định im lặng).
Khai báo thứ hai chỉ đơn giản là khai báo someArray
(không phải someArray
là các phần tử!) Là const, tức là bạn không thể viết someArray=someOtherArray
. Nó giống như nếu tham số là char * const someArray
.
Cú pháp này chỉ có thể sử dụng được trong phạm vi trong cùng []
của một bộ khai báo mảng trong danh sách tham số hàm; nó sẽ không có ý nghĩa trong các bối cảnh khác.
Văn bản Tiêu chuẩn, bao gồm cả hai trường hợp trên, nằm trong C11 6.7.6.3/7 (là 6.7.5.3/7 trong C99):
Một khai báo của một tham số là '' mảng loại '' sẽ được điều chỉnh thành '' con trỏ đủ điều kiện để nhập '', trong đó các loại vòng loại (nếu có) là những loại được chỉ định trong [
và ]
dẫn xuất loại mảng. Nếu từ khóa tĩnh cũng xuất hiện bên trong [
và ]
của đạo hàm kiểu mảng, thì với mỗi lệnh gọi hàm, giá trị của đối số thực tế tương ứng sẽ cung cấp quyền truy cập vào phần tử đầu tiên của một mảng có ít nhất nhiều phần tử như được chỉ định bởi biểu hiện kích thước.
int foo(struct bar [static 1]);
thay vìint foo(struct bar *);
làm chữ ký cho các chức năng không chấp nhận con trỏ NULL. (Tôi biết gcc có cú pháp không chuẩn thay thế để gắn cờ các chức năng đó để trình biên dịch có thể đưa ra cảnh báo ..)