函数参数中 int * array 和 int array[] 的区别
Posted
技术标签:
【中文标题】函数参数中 int * array 和 int array[] 的区别【英文标题】:Difference between int * array and int array[] in a function parameter 【发布时间】: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;
【问题讨论】:
看看这个***.com/questions/5491789/… 没有区别。完全没有。 在函数参数列表中,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);
。
【参考方案1】:
没有区别。两种函数类型(调整后)都是“函数采用指向int
和int
的指针,返回void
。”这只是 C++ 的一个语法怪癖:非引用类型的函数参数中最外层的 []
与 *
同义。
【讨论】:
【参考方案2】:表达同一事物的不同方式。您只是通过指针将数组传递给函数。
【讨论】:
【参考方案3】:当您将数组传递给函数时,它会通过指针隐式传递它。因为如果数组中有很多元素通过值复制传递,那将是一个巨大的开销。即使它看起来不同但相同。
您不能同时使用这两个功能。如果你做它的编译时错误
error: redefinition of 'void myFunction(int*, int)'
it is already defined.
【讨论】:
我知道,我知道,只是为了树立榜样^^。 你说的原因只是猜测。【参考方案4】:没有区别。事实上,数组的声明返回了一个指针。只是,当您在声明中指定变量是一个数组(即使用 [])时,没有必要指定它将是一个指针,因为这是隐式生成的。但是当你没有指定这个时,你必须将它声明为一个指针,如果你去影响它一个表变量,或者“new []”的结果。当数组大小在设计时未知时,表指针的使用仅对动态分配感兴趣。
【讨论】:
这不是真的。 “一个数组的声明返回一个指针”是完全错误的。int a[10];
中a
的类型与int *a;
中a
的类型非常不同以上是关于函数参数中 int * array 和 int array[] 的区别的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )