2011-04-20 32 views
120

Làm cách nào để truyền mảng được phân bổ tĩnh theo công việc tham chiếu?Đi qua một mảng bằng cách tham chiếu

void foo(int (&myArray)[100]) 
{ 
} 

int main() 
{ 
    int a[100]; 
    foo(a); 
} 

(&myArray)[100] có bất kỳ ý nghĩa hay cú pháp của nó để truyền bất kỳ mảng nào không? Tôi không hiểu dấu ngoặc đơn riêng biệt tiếp theo là các dấu ngoặc lớn ở đây. Cảm ơn.

+0

Có bất kỳ Rvalue nào liên quan đến Lvalue với các tham số chức năng không? –

+0

có thể trùng lặp của [Điều gì hữu ích về tham số tham chiếu đến mảng?] (Http://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – AnT

+0

Có thể trùng lặp [Điều gì hữu ích về tham số tham chiếu đến mảng?] (https://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – anatolyg

Trả lời

162

Đó là cú pháp cho tham chiếu mảng - bạn cần sử dụng (&array) để làm rõ trình biên dịch mà bạn muốn tham chiếu đến mảng, chứ không phải mảng tham chiếu int & array[100]; (không hợp lệ).

EDIT: Một số làm rõ.

void foo(int * x); 
void foo(int x[100]); 
void foo(int x[]); 

Đây là ba cách khác nhau để khai báo cùng chức năng. Tất cả chúng đều được coi là tham số int *, bạn có thể chuyển bất kỳ mảng kích thước nào cho chúng.

void foo(int (&x)[100]); 

Điều này chỉ chấp nhận mảng gồm 100 số nguyên. Bạn có thể an toàn sử dụng sizeof trên x

void foo(int & x[100]); // error 

này được phân tách như một "mảng tài liệu tham khảo" - mà không phải là quy phạm pháp luật.

+0

Tại sao chúng ta không thể có một mảng tham chiếu, ví dụ: 'int a, b, c; int arr [3] = {a, b, c}; '? – Vorac

+4

Aha, phát hiện [lý do] (http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal#1164306). – Vorac

+1

Ai đó có thể giải thích tại sao 'void foo (int & x [100]);' được phân tách thành "mảng tham chiếu", vui lòng? Có phải vì quy tắc "từ phải sang trái" không? Nếu có, có vẻ như không nhất quán với cách 'void foo (int (& x) [100]);' được phân tách thành "tham chiếu đến mảng". Cảm ơn trước. – zl9394

35

Nó chỉ là cú pháp yêu cầu:

void Func(int (&myArray)[100]) 

^đèo mảng 100 int bằng cách tham khảo các thông số tên là myArray;

void Func(int* myArray) 

^Vượt qua một mảng. Mảng phân rã thành một con trỏ. Vì vậy, bạn bị mất thông tin kích thước.

void Func(int (*myFunc)(double)) 

^Vượt qua con trỏ hàm. Hàm trả về một số int và mất double. Tên thông số là myFunc.

+0

Làm cách nào để truyền một mảng có kích thước thay đổi làm tham chiếu? –

+0

@ShivamArora Bạn định dạng hàm và làm cho kích thước tham số mẫu. –

18

Đó là cú pháp. Trong các đối số hàm int (&myArray)[100] dấu ngoặc đơn kèm theo &myArray là cần thiết. nếu bạn không sử dụng chúng, bạn sẽ chuyển qua số array of references và đó là vì subscript operator [] có mức độ ưu tiên cao hơn trên & operator.

Ví dụ: int &myArray[100] // array of references

Vì vậy, bằng cách sử dụng type construction() bạn cho trình biên dịch biết bạn muốn tham chiếu đến một mảng gồm 100 số nguyên.

Ví dụ: int (&myArray)[100] // reference of an array of 100 ints

+0

"nếu bạn không sử dụng chúng, bạn sẽ chuyển một mảng' tham chiếu' "- tất nhiên, không thể tồn tại, vì vậy bạn sẽ gặp lỗi biên dịch. Thật thú vị với tôi rằng các quy tắc ưu tiên nhà điều hành đã nhấn mạnh điều này phải xảy ra theo mặc định. –

+0

Có thêm hướng dẫn nào về xây dựng kiểu() không? – Iartist93

+0

Cảm ơn, tôi cần một lời giải thích bao gồm lý do về quyền ưu tiên của toán tử, điều này mang lại cảm giác tại sao nó phải được thực hiện theo cách này. – cram2208

2

Mảng mặc định được truyền bằng con trỏ. Bạn có thể thử sửa đổi một mảng bên trong một lời gọi hàm để hiểu rõ hơn.

+1

Mảng không thể được truyền theo giá trị. Nếu hàm nhận một con trỏ, một mảng sẽ phân rã thành con trỏ đến phần tử đầu tiên của nó. Tôi không chắc bạn đang nói gì ở đây. –

+0

@UlrichEckhardt Tôi đang cố gắng nói rằng "Mảng không thể được truyền theo giá trị" như bạn đã nói trước đây, chúng được mặc định được chuyển bởi tham chiếu –

+4

Mảng không được truyền theo giá trị cũng như tham chiếu. Chúng được truyền qua con trỏ. Nếu mảng được chuyển theo tham chiếu theo mặc định, bạn sẽ không gặp vấn đề gì khi sử dụng sizeof trên chúng. Nhưng đó không phải là trường hợp. Mảng phân rã thành con trỏ khi được truyền vào một hàm. – user3437460

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