2013-05-25 34 views
10

Tôi đã thấy rằng các giá trị mảng sẽ thay đổi nếu tham số hàm là "int arr []" hoặc "int * arr". Sự khác biệt ở đâu?Sự khác biệt giữa mảng int * và mảng int [] trong tham số hàm

int array []:

void myFunction(int arr[], int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

int * mảng:

void myFunction(int * arr, int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

Cả hai chức năng thay đổi các giá trị mảng.

int main(){ 

    int array[3]; 

    array[0] = 0; 
    array[1] = 0; 
    array[2] = 0; 

    myFunction(array, 3); 

    return 0; 

} 
+1

hãy xem http://stackoverflow.com/questions/5491789/any-difference-between-fooint-arr-and-fooint-arr – Rohan

+6

Không có sự khác biệt nào. Ở tất cả. _Trong một tham số hàm list_, 'int arr []' không là gì ngoài việc viết "thay thế" cho 'int * arr'. (Và đó là lý do tại sao bạn có thể thấy 'int main (int argc, char * argv [])' hoặc 'int main (int argc, char ** argv)'.) Ngay cả khi bạn đã đặt một số bên trong dấu ngoặc vuông !: trong 'void f (int a [10])' '10' hoàn toàn bị bỏ qua **, có nghĩa là' void f (int a []) ', tức là' void f (int * a) '. –

+0

Và như đã nói trong câu trả lời, cho cuộc gọi 'myFunction (mảng, 3);' mảng của bạn được chuyển đổi hoàn toàn thành _pointer_ thành phần tử đầu tiên của nó, và con trỏ đó được chuyển đến hàm (bằng cách viết tham số), nếu bạn đã gọi 'myFunction (& (mảng [0]), 3);'. Một cách để thực sự truyền mảng (thực tế, một _reference_ đến nó) là viết một hàm như 'template void g (int (& arr) [size])', cho phép bạn gọi nó theo cách này: 'g (mảng) ; '. –

Trả lời

4

Không có sự khác biệt. Cả hai loại chức năng (sau khi điều chỉnh) là "hàm lấy con trỏ đến int và một số int, trả lại void." Đây chỉ là một cú pháp cú pháp của C++: ngoài cùng [] trong một tham số chức năng của loại không tham chiếu là đồng nghĩa với *.

0

Các cách khác nhau để thể hiện cùng một điều. Bạn chỉ cần chuyển một mảng tới hàm bằng con trỏ.

-2

khi bạn chuyển một mảng tới hàm, nó sẽ chuyển nó qua con trỏ. bởi vì nếu có nhiều yếu tố trong mảng vượt qua bằng cách sao chép giá trị nó là một chi phí rất lớn. mặc dù nó trông khác nhau giống nhau.

bạn không thể sử dụng cả hai chức năng cùng một lúc. nếu bạn thực hiện lỗi thời gian biên dịch

error: redefinition of 'void myFunction(int*, int)' 
it is already defined. 
+0

Tôi biết, tôi biết, nó chỉ là để thiết lập một ví dụ ^^. – Alex

+0

Lý do bạn tuyên bố chỉ là suy đoán. – EJP

-3

Không có sự khác biệt. Trong thực tế, một khai báo của một mảng trả về allawys một con trỏ. Chỉ khi bạn chỉ định trong khai báo rằng biến là một mảng (ví dụ: với []), không nhất thiết phải xác định rằng nó sẽ là một con trỏ, bởi vì điều này được thực hiện ngầm định. Nhưng khi bạn không xác định điều này, bạn phải khai báo nó như một con trỏ nếu bạn đã ảnh hưởng đến nó một biến bảng, hoặc kết quả của "new []". Việc sử dụng con trỏ của bảng chỉ có lợi ích cho phân bổ động, khi kích thước mảng không được biết về thời gian thiết kế.

+0

Điều này không đúng. "một khai báo của một mảng trả về allawys một con trỏ" là đồng bằng sai. Kiểu 'a' trong' int a [10]; 'là * rất khác * từ kiểu' a' trong 'int * a;' – Angew

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