2010-04-01 35 views

Trả lời

27

Chúng được chuyển thành con trỏ. Điều này có nghĩa là tất cả thông tin về kích thước mảng bị mất. Bạn sẽ tốt hơn nhiều nên sử dụng std :: vectơ, có thể được chuyển qua giá trị hoặc tham chiếu, khi bạn chọn, và do đó giữ lại tất cả thông tin của chúng.

Dưới đây là ví dụ về truyền mảng tới hàm. Lưu ý chúng ta phải xác định số lượng các phần tử cụ thể, vì sizeof (p) sẽ cho biết kích thước của con trỏ.

int add(int * p, int n) { 
    int total = 0; 
    for (int i = 0; i < n; i++) { 
     total += p[i]; 
    } 
    return total; 
} 


int main() { 
    int a[] = { 1, 7, 42 }; 
    int n = add(a, 3); 
} 
+0

Cảm ơn Neil, nhưng như tôi đã đề cập trong một bài đăng ngày hôm qua của tôi, tôi hiện đang làm việc trên excersizes từ TC + + PL và tôi phải sử dụng mảng oridinary. Tôi đã tự hỏi nếu nó là cần thiết để viết một cái gì đó như: void f (int (& a) [size]); hoặc là nó chỉ đủ để khai báo như là một mảng mà không cần ref. –

+0

Vì vậy, cơ bản đánh giá bằng câu trả lời này họ thông qua bởi giá trị đó là kích thước của một con trỏ. Tôi có đúng không? –

+1

@tất cả lý do chính đáng để không học C++ từ TC++ PL, IMHO. –

5

Mảng đặc biệt: chúng luôn được chuyển thành con trỏ đến phần tử đầu tiên của mảng.

23

Trước tiên, bạn không thể chuyển mảng theo giá trị theo nghĩa là bản sao của mảng được tạo. Nếu bạn cần chức năng đó, hãy sử dụng std::vector hoặc boost::array.

Thông thường, con trỏ đến phần tử đầu tiên được chuyển theo giá trị. Kích thước của mảng bị mất trong quá trình này và phải được truyền riêng. Chữ ký sau đây đều là tương đương:

void by_pointer(int *p, int size); 
void by_pointer(int p[], int size); 
void by_pointer(int p[7], int size); // the 7 is ignored in this context! 

Nếu bạn muốn vượt qua bằng cách tham khảo, kích thước là một phần của các loại:

void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here! 

Thông thường bạn kết hợp vượt qua bằng cách tham khảo với các mẫu, vì vậy bạn có thể sử dụng chức năng với các kích thước được biết đến tĩnh khác nhau:

template<size_t size> 
void by_reference(int (&a)[size]); 

Hy vọng điều này sẽ hữu ích.

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