数组在void函数中改变,仍在外面改变!为什么? (范围)

时间:2012-11-08 00:04:37

标签: c function scope

这是排序算法的简单实现。我的问题是。数组numbers在main中声明并初始化。然后,我像函数sort中的参数一样传递它(是副本吗?)。在sort函数中,numbers,现在称为array(据我所知,副本),已更改(已排序)。那么,为什么在调用函数之后,数组numbers被更改(这就是我想要的,购买想知道为什么??。array范围在sort,而不是{{ 1}}。

main

4 个答案:

答案 0 :(得分:5)

int array[]int *array相同。你正在传递一个指针。

答案 1 :(得分:1)

您已通过引用传递数组,因此对它的任何操作都将影响该内存中的位置。

答案 2 :(得分:0)

void sort(int array[], int size)传递对数组的引用,即你传递一个指向它的指针(正如@pst正确指出的那样,这不是完全术语,C总是传递值) - 不是数组的副本。您所做的任何修改都将修改原始数组。

如果您不想修改原始阵列,请将其复制并传递副本。

另一种(更有效的)方法是从调用者分配,并将指针传递给函数:

void sort(int *const array,int [] result, int size)

如果您的算法不需要“就地”工作,这将特别方便。

请注意,在函数内部创建副本并将指针作为返回值传递回副本在技术上是可行的,但实际上真的不鼓励

  • 你不能在函数内部分配一个int []并返回它 因为它将超出范围
  • 你可以做一个malloc,但是你必须记住从中取出它 调用函数,很容易忘记

答案 3 :(得分:-2)

在C中,有两种不同的方法可以将参数传递给函数/方法。   - 传递价值   - 传递指针

传递值的好处是可以为函数提供可由其修改的副本。缺点(对于大型对象)是因为需要复制数据所以速度较慢。

传递指针比复制大对象快得多(因为没有复制值)。但是如果被调用的函数修改了值,原始变量也会改变。这有时是故意进行的(例如在排序函数或返回多个值的函数中)。

编辑 显然我在这里混淆了一些东西,所以我试图解决这个问题......原来我说的是“按参考调用”和“按值调用”但实际上是C不支持引用。阅读评论以获取更多详细信息。