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

标签 c pointers swap

#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);

}

最佳答案

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

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

关于c - 为什么这些交换函数的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330929/

相关文章:

c++ - 为什么从constexpr引用生成的汇编代码与constexpr指针生成的汇编代码不同?

c++ - 指针算术 - 相同的表达式?

jquery - jquery 中文本更改时更改/交换文本框中的值

java - ArrayList<class> 交换方法

c - 这两行有什么区别?

c - 堆栈崩溃,找不到溢出错误

c - 使用字符指针复制字符串时出错

rust - 为什么我得到 "cannot borrow ` arr[_ ]` as mutable more than once at a time"?

c - 段错误,C 中的列表

通过 c 中的用户输入创建字符串数组?