时间:2010-12-02 01:46:02

标签: 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);

}

5 个答案:

答案 0 :(得分:4)

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

  • swap1交换两个局部整数变量的值 - 函数外无可见效果
  • swap2交换两个局部变量的值,在这种情况下是指针, - 相同,没有可见效果
  • swap3最终使其正确并通过本地指针变量交换指向的值。

答案 1 :(得分:2)

答案 2 :(得分:0)

swap1将无效,因为该函数只是复制了参数,而不影响main中的变量。

swap2也不起作用。

答案 3 :(得分:0)

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

swap3适用于参数指向的值,而不是作用于参数本身。这是三个中唯一一个使用main()的{​​{1}}和a变量存储在内存地址中的值。

答案 4 :(得分:0)

只是为了好玩,不使用临时变量来交换价值

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