-2

我刚开始学习C,我很困惑为什么我必须使用指针来实现交换功能?

交换不起作用的版本:

#include <stdio.h>

void swap(int i, int j) {
   int t = i;
   i = j;
   j = t;
}

int main() {
   int a = 23, b = 47;
   printf("Before. a: %d, b: %d\n", a, b);
   swap(a,b);
   printf("After.  a: %d, b: %d\n", a, b);
   return 0;
}

交换工作的版本:

#include <stdio.h>

void swap(int *i, int *j) {
   int t = *i;
   *i = *j;
   *j = t;
}

void main() {
   int a = 23, b = 47;
   printf("Before. a: %d, b: %d\n", a, b);
   swap(&a, &b);
   printf("After . a: %d, b: %d\n", a, b);
}
4

4 回答 4

3

默认情况下,函数参数在 C 和 C++ 中按值传递。这基本上意味着在函数中接收到传递参数的副本。此副本与传递的变量不同,并且此副本的任何更改都不会反映回传递的参数。

所以你的第一个片段实际上交换了传递参数的副本,而不是参数本身。

为了将交换反映回传递的参数,您需要通过引用传递,在 C 中,这是通过使用指针来实现的。参数的地址被传递给函数并且函数实际上对传递给它的内存地址进行操作,即:传递值的原始变量。

于 2013-04-23T05:21:41.657 回答
1
swap(a,b);

void swap(int i, int j) {
   int t = i;
   i = j;
   j = t;
}

上面的代码失败是因为变量 i 和 j 是函数的局部swap变量,这意味着变量的作用域仅限于函数swap,一旦函数终止,它们的生命就会消失。

一种解决方法是使用按地址传递,如下面的代码所示...

swap(&a,&b);

void swap(int* i, int* j) {
   int t = *i;
   i* = *j;
   j* = t;
}

现在变量 i 和 j 是指向原始变量 a 和 b 的指针,这意味着它们代表 a 和 b 进行操作,因此即使指针在函数内的范围有限,它们也能够间接修改变量 a 和湾。

于 2013-04-23T05:31:13.177 回答
0

你为什么要背靠背展示两个程序?那是两个独立的程序。第一个程序,尽管有所有关于void main()和东西的谬误,打算(但不是,因为它处理局部变量)通过使用一个函数来交换值传递整数变量的副本和。abpass-by-value。事实上,C只有局部变量值的变化不会显示在.pass-by-valueprintf()swap()main()

void swap(int i, int j) {
int t = i;
i = j;
j = t;
printf("After. a:%d,b:%d",i,j);
}

他可能声称使用的第二个程序pass-by-reference本质pass-by-value上是传递变量地址副本的地方,而不是实际地址本身。再说一次,尽管它是不可移植的怪癖void main(),但它确实交换了a和的值b

void swap(int *i, int *j) {
int t = *i;
*i = *j;
*j = t;
}

输出之前。a:23 b:47 之后。一个:47 乙:23

我运行它。CodeBlocks但是你的作者Mr.Void Main一定建议你使用 16 位 Turbo C 是吗?

于 2013-04-23T05:32:24.017 回答
0

你不能这样交换:

void swap(int i, int j) {
   int t = i;
   i = j;
   j = t;
}

因为ij是按值传递的。这意味着它与局部变量相同tmp。因此,修改iandj并不会实际修改您传递的变量,因为iand 的本地副本j不存在于 function 之外swap()

正因为如此,如果你需要修改ijfrom main(),你必须传递到和的swap()地址。这就是为什么以下版本实际上有效的原因。ijmain()

void swap(int *i, int *j) {
    int t = *i;
    *i = *j;
    *j = t;
}

编辑:为了更好地理解这些东西,我想向你推荐斯坦福讲座Programming Paradigms,可以在 YouTube 上找到。

于 2013-04-23T06:05:36.407 回答