【发布时间】:2013-05-20 19:59:33
【问题描述】:
我看到如果函数参数是“int arr[]”或“int * arr”,数组值会发生变化。区别在哪里?
整数数组[]:
void myFunction(int arr[], int size) {
for (int i = 0; i < size; ++i)
arr[i] = 1;
}
int * 数组:
void myFunction(int * arr, int size) {
for (int i = 0; i < size; ++i)
arr[i] = 1;
}
这两个函数都会改变数组值。
int main(){
int array[3];
array[0] = 0;
array[1] = 0;
array[2] = 0;
myFunction(array, 3);
return 0;
}
【问题讨论】:
-
没有区别。完全没有。 在函数参数列表中,
int arr[]只不过是int* arr的“替代”写作。 (这就是为什么您可以看到int main(int argc, char* argv[])或int main(int argc, char** argv)。)即使您要在括号内输入一个数字!:在void f(int a[10])中,10完全被忽略,这意味着void f(int a[]),即void f(int* a)。 -
正如答案中所说,对于调用
myFunction(array, 3);,您的数组被隐式转换为指向其第一个元素的指针,并且该指针被传递给函数(使用要么写入参数),就好像您调用了myFunction(&(array[0]), 3);。真正传递数组(实际上是对它的引用)的一种方法是编写一个类似template<size_t size> void g(int (&arr)[size])的函数,它可以让您这样调用它:g(array);。
标签: c++ arrays pointers parameter-passing