2

这是排序算法的简单实现。我的问题是。数组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 ++;
                }   
            }
        }
    }    
}
4

4 回答 4

6

int array[]是一样的int *array。您正在传递一个指针。

于 2012-11-08T00:07:18.780 回答
1

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

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

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

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

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

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

  • 您不能在函数内分配 int[] 并返回它,因为它将超出范围
  • 你可以做一个malloc,但是你必须记住从调用者函数中释放它,这很容易忘记
于 2012-11-08T00:07:16.313 回答
1

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

于 2012-11-08T00:07:35.393 回答
-2

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

传递值的优点是为函数提供了一个可以被它修改的副本。缺点(对于大型对象)是由于需要复制数据而速度较慢。

由于不复制值,因此传递指针(比复制大对象)要快得多。但是如果被调用的函数修改了值,原来的变量也会改变。这有时是有意完成的(例如,在您的排序函数或返回多个值的函数中)。

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

于 2012-11-08T00:12:40.747 回答