2012-05-25 32 views
6

sự khác biệt giữa là gì:C++ * vs [] như một tham số chức năng

void foo(item* list) 
{ 
    cout << list[xxx].string; 
} 

void this(item list[]) 
{ 
    cout << list[xxx].string; 
} 

Giả sử mục được:

struct item 
{ 
    char* string; 
} 

Với trỏ trỏ đến đầu tiên của một mảng ký tự

list chỉ là một mảng các mục ...

Trả lời

8

Đối với trình biên dịch, không có sự khác biệt.

Nó đọc khác nhau mặc dù. [] gợi ý bạn muốn chuyển một mảng vào hàm, trong khi * cũng có thể chỉ có nghĩa là một con trỏ đơn giản.

Lưu ý rằng mảng phân rã thành con trỏ khi được truyền dưới dạng tham số (trong trường hợp bạn chưa biết).

+0

1 cho "Lưu ý rằng các mảng phân rã để con trỏ khi thông qua như là thông số". Tôi không biết điều đó, thú vị để biết. – Drise

+0

Không chỉ phân tách các biểu thức mảng thành con trỏ, khi bạn chỉ định kiểu mảng làm tham số hàm, nó thực sự được thay đổi thành kiểu con trỏ cho tất cả các mục đích, bao gồm quá tải, 'sizeof' và' decltype'. Bạn thậm chí có thể khai báo nó theo một cách và định nghĩa nó theo một cách khác (nhưng có lẽ bạn không nên). – aschepler

+1

Sẽ tốt hơn khi thêm văn bản từ tiêu chuẩn, để tránh cho mọi người ấn tượng rằng mảng và con trỏ giống nhau nói chung. Tham số chức năng chỉ là trường hợp đặc biệt khi các trạng thái chuẩn "Sau khi xác định loại của mỗi tham số, bất kỳ tham số nào của kiểu" mảng T "[...] được điều chỉnh thành" con trỏ tới T "[...]." [dcl.fct] 8.3.5/5. – bames53

3

Chúng giống nhau - hoàn toàn đồng nghĩa. Và thứ hai là item list[], không phải item[]list.

Tuy nhiên, thông thường sử dụng [] khi thông số được sử dụng như một mảng và * khi thông số được sử dụng như con trỏ.

1

FYI:

void foo(int (&a)[5]) // only arrays of 5 int's are allowed 
{ 
} 

int main() 
{ 
    int arr[5]; 
    foo(arr); // OK 

    int arr6[6]; 
    foo(arr6); // compile error 
} 

nhưng foo(int* arr), foo(int arr[])foo(int arr[100]) đều tương đương

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