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;
}
hãy xem http://stackoverflow.com/questions/5491789/any-difference-between-fooint-arr-and-fooint-arr – Rohan
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) '. –
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) ; '. –