考虑以下C程序:
#include <stdio.h>
void swap(int []);
int main(void) {
int a[3] = {1, 2, 3};
swap(a);
printf("%d %d %d\n", a[0], a[1], a[2]);
swap(&a[1]);
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
void swap(int x[]) {
int temp = x[0];
x[0] = x[1];
x[1] = temp;
}
任何人都可以解释为什么以下代码给出输出
2 1 3
2 3 1
而不是
2 1 3
1 2 3
我了解swap(a)
互换a[0]
和a[1]
。但我不确定swap(&a[1])
是如何工作的。在这两种情况下,我们都将数组a
传递给函数swap
,不是吗?所以我的假设是swap(&a[1])
应该再次交换a[0]
和a[1]
,将原始订单2 3 1
还给我们。
编辑:此代码是按预期编写的。我只想看看如果我们将第一个元素以外的元素的地址传递给函数会发生什么。显然,如果我将&a[n]
传递给函数,它会忽略a[n]
之前的所有元素,并将a[n]
视为第一个元素?
答案 0 :(得分:1)
您的交换函数将整数的地址作为输入,并在该地址处交换元素,并在下一个地址处使用元素。
swap(a) is same as swap(&a[0])
It will swap element at index 0 with element at index 1.
Now your array becomes {2,1,3}
swap(&a[1]) swaps element at index 1 with element at index 2.
So your array now becomes {2,3,1}
请记住,实际传递数组时,您将在索引0(&a[0]
)处传递元素的地址。
答案 1 :(得分:0)
因为当你第一次交换时发送一个以0索引开头的数组然后它交换0和第一个索引值意味着在第一次交换时,数组变为{2,1,3}然后再次发送此数组以1索引开始你只发送了两个值{1,3},然后这些值得到了交换。在这种情况下,x [0] = 1&amp; x [1] = 3,这就是输出为{2,3,1}的原因,这里2保持不变。
答案 2 :(得分:0)
在第一个调用swap(a);
中,您传递整个数组(实际上是指向第一个元素的指针。)因此,您要交换元素0和1,分别为1和2,因此您的第一个输出是2 1 3
。
在第二个调用swap(&a[1]);
中,您传递的是数组中第二个元素的地址,而在swap
函数中,您正在交换索引1和2处的第二个和第三个元素,它们分别是1和3。这就是为什么你在第二次迭代后的答案是2 3 1
。
可能你的意思是
swap(&a[0]);
这将交换索引0和1处的值,这将为您提供所需的1 2 3
输出。
答案 3 :(得分:0)
在第一个println语句之前的代码中,您将一个完整的数组传递给函数的参数,但是接下来您只传递一个[1]的位置值,这会使函数有点混乱,因为它只有一个值可以交换,或者它可能是第一次传递零(0)索引或数组交换,下次将第一个数组索引传递给交换,这意味着[1,3交换]所以在下一个法规中完成传递
swap(a);
printf("%d %d %d\n", a[0], a[1], a[2]);
swap(a);
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
这将产生你的愿望答案