为什么这些交换函数的行为不同?

发布于 2024-10-06 02:07:52 字数 511 浏览 8 评论 0原文

#include <stdio.h>

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

    a = b;
    b = temp;
}

void swap2(int *a, int *b)
{
    int *temp = a;

    a = b;
    b = temp;
}

void swap3(int *a, int *b)
{
    int temp = *a;

    *a = *b;
    *b = temp;
}

main()
{
    int a = 9, b = 4;

    printf("%d , %d\n", a, b);
    swap1(a, b);
    printf("%d , %d\n", a, b);
    swap2(&a, &b);
    printf("%d , %d\n", a, b);
    swap3(&a, &b);
    printf("%d , %d\n", a, b);

}
#include <stdio.h>

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

    a = b;
    b = temp;
}

void swap2(int *a, int *b)
{
    int *temp = a;

    a = b;
    b = temp;
}

void swap3(int *a, int *b)
{
    int temp = *a;

    *a = *b;
    *b = temp;
}

main()
{
    int a = 9, b = 4;

    printf("%d , %d\n", a, b);
    swap1(a, b);
    printf("%d , %d\n", a, b);
    swap2(&a, &b);
    printf("%d , %d\n", a, b);
    swap3(&a, &b);
    printf("%d , %d\n", a, b);

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

凯凯我们等你回来 2024-10-13 02:07:52

C 具有函数参数的值语义。这意味着所有三个交换变体的 ab 都是各自函数的局部变量。它们是您作为参数传递的值的副本。换句话说:

  • swap1 交换两个局部整型变量的值 - 在函数外部没有可见的效果
  • swap2 交换两个局部变量的值,在本例中是指针, - 相同,没有可见的效果
  • swap3最终得到了正确的结果并交换了本地指针变量指向的值。

C has value semantics for function parameters. This means the a and b for all your three swap variants are local variables of the respective functions. They are copies of the values you pass as arguments. In other words:

  • swap1 exchanges values of two local integer variables - no visible effect outside the function
  • swap2 exchanges values of two local variables, which are pointers in this case, - same, no visible effect
  • swap3 finally gets it right and exchanges the values pointed to by local pointer variables.
回梦 2024-10-13 02:07:52

你的 swap2 函数没有效果。

您正在传递两个指针。在函数内部,(参数)变量 ab 是函数的本地变量。 swap2 函数只是交换这些局部变量的值 - 在函数本身之外没有任何影响。

正如 Anon 指出的那样,swap1 也有同样的问题 - 你只是修改局部变量。

You're swap2 function has no effect.

You are passing in two pointers. Inside the function, the (parameter) variables a and b are local to the function. The swap2 function just swaps the values of these local variables around - having no effect outside the function itself.

As Anon pointed out, swap1 has the same problem - you're just modifying local variables.

顾冷 2024-10-13 02:07:52

swap1 将不起作用,因为该函数只是复制参数,不会影响 main 中的变量。

swap2 也不起作用。

swap1 will not work because the function just copied the arguments, not affecting the variables in main.

swap2 will not work either.

青芜 2024-10-13 02:07:52

swap1()swap2() 的效果仅限于函数本身的范围:它们交换的变量是通过副本传递的参数,并且应用于它们的任何更改都会影响不会影响在函数调用期间复制的 main() 源变量。

swap3 的工作方式是作用于参数指向的值,而不是作用于参数本身。它是三个中唯一一个改变 main()ab 变量所在内存地址的值。存储。

swap1() and swap2() have an effect limited to the scope of the function itself: the variables they swap are parameters passed by copy, and any change applied to them does not impact the source variable of your main() that were copied during the function call.

swap3 works as it acts on the values pointed by the parameters, instead of acting on the parameters themselves. It is the only of the three that chage the value located at the memory adress in which your main()'s a and b variables are stored.

凉世弥音 2024-10-13 02:07:52

只是为了好玩,在不使用临时变量的情况下交换值

x = x ^ y
y = x ^ y
x = x ^ y

Just for fun, exchange values without the use of a temporary variable

x = x ^ y
y = x ^ y
x = x ^ y
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文