Почему эти функции подкачки ведут себя по-разному? - PullRequest
2 голосов
/ 02 декабря 2010
#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 ]

4 голосов
/ 02 декабря 2010

C имеет семантику значений для параметров функции.Это означает, что a и b для всех ваших трех вариантов обмена являются локальными переменными соответствующих функций.Это копий значений, которые вы передаете в качестве аргументов.Другими словами:

  • swap1 обменивает значения двух локальных целочисленных переменных - никакого видимого эффекта вне функции
  • swap2 обменивает значения двух локальных переменных, которые являются указателями вв этом случае - то же самое, никакого видимого эффекта
  • swap3, наконец, получает все правильно и обменивается значениями , указанными на локальными переменными указателя.
2 голосов
/ 02 декабря 2010

Ты swap2 функция не действует.

Вы переходите в два указателя. Внутри функции (параметры) переменные a и b являются локальными для функции. Функция swap2 просто меняет значения этих локальных переменных, не оказывая никакого влияния на саму функцию.

Как указал Анон, swap1 имеет ту же проблему - вы просто модифицируете локальные переменные.

0 голосов
/ 19 ноября 2013

Ради интереса, обменивайте значения без использования временной переменной

x = x ^ y
y = x ^ y
x = x ^ y
0 голосов
/ 23 августа 2011

swap1() и swap2() имеют эффект, ограниченный областью действия самой функции: переменные, которые они меняют, являются параметрами, передаваемыми копией, и любое примененное к ним изменение не влияет на переменную источника вашей main() были скопированы во время вызова функции.

swap3 работает так, как действует на значения , указанные параметрами, вместо того, чтобы воздействовать на сами параметры. Это единственное из трех значений, которые изменяют значение, расположенное на адресе памяти, в котором хранятся переменные main() * a и b.

0 голосов
/ 02 декабря 2010

swap1 не будет работать, потому что функция просто скопировала аргументы, не влияя на переменные в main.

swap2 также не будет работать.

...