用函数交换变量不会影响调用站点

Swapping variables with a function doesn't affect the call site

几节课前我学习了变量,在作业中遇到了一个关于交换两个数字的问题 - 我使用了第三个变量来解决这个问题。

解决方案看起来有点像这样:

#include <stdio.h>

int main(void) {
    int x, y;
    scanf("%d %d", &x, &y);

    // swappring the values

    int temp = x;
    x = y;
    y = temp;

    printf("X is now %d and Y is now %d", x, y);
}

现在我正在学习函数,我想尝试用辅助交换函数解决上一个问题。

这是我写的代码:

#include <stdio.h>

void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}

int main(void) {
    int a = 3, b = 4;
    swap(a, b);

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

我不知道为什么,即使我更改了 swap() 函数中的值,输出仍然是 3 4

为什么会这样?

xy 的地址作为参数传递给函数。现在它们是局部变量,不会对原始变量进行更改。

做如下-

void swap(int *x,int *y){
 /*            dereference pointers and  swap    */
 int temp = *x;
 *x = *y;
 *y = temp;
}

然后像这样调用 main -

swap(&x,&y);

您正在做的是按值传递参数。这意味着在函数调用期间,会创建参数的副本。所以在函数内部你正在处理实际变量的副本。

相反,您需要将其作为参考传递。请阅读有关按值传递与按引用传递的更多信息。

#include <stdio.h>
void swap(int& x,int& y)    //Instead of passing by value just pass by reference
{
    int temp=x;
    x=y;
    t=yemp;
}
int main() {
    int a=3,b=4;
    swap(a,b);
    printf("%d %d\n",a,b);

    return 0;
}

编辑: C 没有引用。上面的代码将改为在 C++ 中工作。要在 C 中工作,只需使用指针并在函数内取消引用它。