想知道这些是如何工作的(C中的交换功能和排序功能)

时间:2014-11-01 11:25:59

标签: c

我是C的新手,我想了解这两个功能:

交换功能:

void swap(int a, int b) {
    int temp=a;
    a=b;
    b=temp;

    printf("In swap\n");
    printf("a: %d\n", a);
    printf("b: %d\n", b);
}

用法:

int a=5, b=7;
swap(a, b);

排序功能:

void sort(int values[], int n)
{
    for (int i=1; i < n; i++) {
        int element=values[i];
        int j=i;
        while ((j > 0) && (values[j-1] > element)) {
            values[j]=values[j - 1];
            j--;
            values[j]=element;
        }
    }
    return;
}

用法:

int array={9, 1, 8, 5, 3, 2, 5};
int size=7;
sort(array, size);

我的问题是,为什么交换功能没有与交换的值一起返回?如果传递给交换函数的值采用不同的地址(我猜),以便函数外部的值不被交换,那么为什么sort函数会返回排序的数组?这是否意味着传递给sort函数的数组中的值具有相同的地址?

2 个答案:

答案 0 :(得分:2)

正如您已经了解的那样,C有&#34;按值调用&#34;,因此发送到交换函数的是原始值的副本,而它只是那些被交换的副本。

数组中的数组有点特殊。在大多数情况下,当您在C程序中编写数组的名称时,它会转换为指向其第一个元素的指针。因此,当您(尝试)将数组传递给函数时,实际发送给函数的是指向第一个元素的指针,因此sort函数中的任何更改都将在原始副本上完成。

答案 1 :(得分:1)

你的交换函数什么都不做,因为你是按值传递东西而不是把它返回到任何地方。

void swap(int a, int b) {
    int temp=a;
    a=b; // This is local to the function
    b=temp; // Ditto

    printf("In swap\n");
    printf("a: %d\n", a);
    printf("b: %d\n", b);
}

排序功能因数组衰减而起作用。当你打电话给你的功能时

int array[] = { 9, 1, 8, 5, 3, 2, 5 };
int size = 7;
sort(array, size);

数组参数int values[]的用法等同于它被声明并传递为int* pointer_to_the_first_element_of_the_array,因此每次使用都会实际修改原始数组而不是本地副本。

有关array decaying here的更多信息。