2014-07-08 23 views
13

Tôi đã sau mã ví dụ C:const cho các biểu thức kích thước mảng trên lập luận

int f(const int farg[const 5]) 
{ 
} 

gì const bổ sung cho các kích thước mảng làm gì? Và sự khác biệt khi tôi bỏ qua const ở đó là gì?

+3

[Có thể liên quan] (http://stackoverflow.com/q/17559631/596781) –

+0

'const' thứ hai đã cho tôi 4 lỗi trình biên dịch – mch

+2

@mch đảm bảo trình biên dịch của bạn hỗ trợ C99 hoặc C11. (-std = c11 chẳng hạn). clang 3.4 với -std = c11 ăn cái này mà không có vấn đề gì. – WhozCraig

Trả lời

13
int d(const int darg[5]) 

Phương tiện darg là một con trỏ đến constint.

int e(int earg[const 5]) 

Phương tiện earg là một con trỏ const để int. Đây là tính năng c99. T A[qualifier-list e] tương đương với T * qualifier-list A trong khai báo tham số.

Và tất nhiên (từ trên cao):

int f(const int farg[const 5]) 

Phương tiện farg là một con trỏ const-constint.

1

const bổ sung cho kích thước mảng là gì?

C11: 6.7.6.3:

Một tuyên bố của một tham số là '' mảng của loại '' sẽ được điều chỉnh để '' con trỏ đủ điều kiện để loại '', trong đó các loại vòng loại (nếu có) là các giá trị được chỉ định trong các số [] của dẫn xuất loại mảng.

Điều này có nghĩa

int f(const int farg[const 5]) 

sẽ được điều chỉnh để

int f(const int *const farg) 

Và sự khác biệt là những gì khi tôi bỏ qua const đó?

Sau khi bỏ đi, nó tương đương với

int f(const int frag[5]) //or int f(const int frag[]) 

đó là cuối cùng tương đương với

int f(const int *farg) 
+3

'const int farg [const 5]' được điều chỉnh thành 'const int * const farg' không thành' const int const * farg'. – ouah

+0

@ouah; Oopa !. Đó là một lỗi đánh máy. Nó phải là '' con trỏ đủ điều kiện để nhập'’' – haccks

Các vấn đề liên quan