函数参数中 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(&amp;(array[0]), 3);。真正传递数组(实际上是对它的引用)的一种方法是编写一个类似template&lt;size_t size&gt; void g(int (&amp;arr)[size]) 的函数,它可以让您这样调用它:g(array); 【参考方案1】:

没有区别。两种函数类型(调整后)都是“函数采用指向intint 的指针,返回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] )

Scala函数式编程初步(高阶函数)

8高阶函数

函数中的Haskell数组模式

java编程,声明一个类,定义一个方法以计算一维数组中的最大值并返回该值,参数为int[]型

C++中vector <int> array;如何像下面数组一样赋值