我是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函数的数组中的值具有相同的地址?
答案 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的更多信息。