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



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

int main(void)
{
    int numbers[SIZE] = { 4, 15, 16, 50, 8, 23, 42, 108 };
    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("n");
    sort(numbers, SIZE);
    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("n");
    return 0;
}
void sort(int array[], int size)
{
    int swaps = 0;
    while(swaps==0)
    {
        for(int i = 0; i < size ; i++)
        {
            for(int j = i + 1; j < size ; j++)
            {
                if( array[i] > array[j] )
                {
                    // Swapping
                    int temp = array[i]; 
                    array[i] = array[j];
                    array[j] = temp;
                    swaps ++;
                }   
            }
        }
    }    
}

int array[]int *array相同。您正在通过指针。

您已通过参考传递数组,因此任何操作都会影响内存中的该位置。

void sort(int array[], int size)传递了对数组的引用,即您正在传递指针(正如@pst正确指出的那样,这不是 exkeck> exact 术语,c始终按值传递) - 不是数组的副本。您进行的任何修改都会修改原始数组。

如果您不想修改原始数组,请复制并传递副本。

另一种(更高效)的方法是从呼叫者分配,然后将指针传递给函数:

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

如果您的算法不需要"到位",这特别方便。

请注意,在函数内创建副本并将指针传递给复制值,因为返回值在技术上是可行的,但确实确实灰心

  • 您不能在功能中分配int []并返回因为它将超出范围
  • 您可以做一个malloc,但是您必须记住将其从中释放出来呼叫者功能,很容易忘记

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

传递值的优点是将副本提供给可以修改的函数。缺点(对于大对象)是由于需要复制数据而慢。

传递指针比复制值更快(比复制大对象)要快得多。但是,如果调用函数会修改该值,则原始变量也会更改。有时是故意完成的(例如,在您的排序功能或返回多个值的函数中)。

编辑: 显然我在这里混合了一些东西,所以我试图解决此问题...最初我是在谈论"通过参考"one_answers"按值调用",但C实际上是C不支持参考。阅读评论以获取更多详细信息。

最新更新