2013-06-09 55 views
13

Tôi đọc một đoạn mã và thấy có một chức năng như thế.chức năng "int (* function()) [10];" nghĩa là?

int (*function())[10]{ 
... 
} 

Tôi đang bối rối. Chức năng này có ý nghĩa gì và nó sẽ trở lại như thế nào?

+13

http://cdecl.org và http://c-faq.com/decl/ spiral.anderson.html – chris

+0

Ngoài ra, hãy xem một số hướng dẫn về các con trỏ hàm như http://www.cprogramming.com/tutorial/function-pointers.html – user1929959

+3

@ user1929959: nhưng các con trỏ hàm không liên quan gì đến bất kỳ điều gì trong câu hỏi ? –

Trả lời

16

Đây là định nghĩa của hàm trả về một con trỏ tới một mảng gồm 10 số nguyên.

Hãy nhớ rằng giá trị trả về là một con trỏ , không phải là một mảng thực. Mảng không thể được trả về từ các hàm. Mỗi đoạn 8.3.5/8 của Tiêu chuẩn:

Chức năng sẽ không có một kiểu trả về kiểu mảng hoặc chức năng, mặc dù họ có thể có một kiểu trả về của con trỏ loại hoặc tham chiếu đến những việc như vậy

Dưới đây là một ví dụ đơn giản về cách bạn sẽ sử dụng:

int arr[10];  // an array of 10 int 
int (*ptr)[10]; // pointer to an array of 10 int 

int (*function())[10] // function returning a pointer to an array of 10 int 
{ 
    return ptr; 
} 

int main() 
{ 
    int (*p)[10] = function(); // assign to the pointer 
} 

Bạn có thể sử dụng nó ở bất cứ đâu bạn thường sử dụng con trỏ. Nhưng lưu ý rằng có các lựa chọn thay thế tốt hơn so với con trỏ hoàn toàn, chẳng hạn như std::shared_ptr<std::array<T, N>> hoặc std::shared_ptr<std::vector<T>>.

+0

Điều đó có hữu ích không? : - | Tôi không có nghĩa là câu trả lời, tôi có nghĩa là xác định rằng giá trị trả về là một con trỏ đến một mảng có kích thước 10. –

+0

@NikosC., Tôi sẽ trả về 'std :: array ' hoặc thay đổi nó một cách thích hợp nếu bạn thực sự cần phải thay đổi bản gốc. – chris

+1

@NikosC. Có, chúng tôi đang trả về một con trỏ giống như bất kỳ đối tượng nào khác. Một ưu điểm khác là nó sẽ chỉ biên dịch nếu kích thước mảng là 10, không có sự phân rã kiểu nào có liên quan. – 0x499602D2

8

Cách đọc nó là để tìm ra định danh tận cùng bên trái và làm việc theo cách của bạn ra, nhớ rằng ()[] ràng buộc trước khi *, vì vậy *a[] là một mảng của con trỏ, (*a)[] là một con trỏ đến một mảng, *f() là một chức năng trả về một con trỏ và (*f)() là một con trỏ trỏ đến một hàm. Như vậy,

 function   - function 
     function()  - is a function 
    *function()  - returning a pointer 
    (*function())[10] - to a 10-element array 
int (*function())[10] - of int 
+1

Không bao giờ gặp các hàm trả về mảng (hoặc con trỏ tới mảng trước); '[]' ở bên phải có vẻ kỳ lạ. Tôi đoán bước tiếp theo trong sự phức tạp sẽ là khai báo một con trỏ tới hàm này. –

+0

Cách khác để xem nó là thay thế 'function()' bằng một ký hiệu 'f', cho' int (* f) [10] '; bây giờ nó trông không lạ lắm. –

+0

Tất nhiên, nó làm cho logic hoàn hảo ý nghĩa cú pháp khôn ngoan; Chỉ là bạn có thể viết mã trong nhiều năm mà không gặp trường hợp này, nó khiến tôi mất cảnh giác ... Tôi đoán bạn học được điều gì đó mỗi ngày;) –

0

nó có nghĩa là được một con trỏ hàm và các đối số là khoảng trống và trở lại int [10]

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