Как работает функция подкачки (используется указатель)? - PullRequest
0 голосов
/ 11 июля 2020
#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
    int x = 1;
    int y = 2;

    printf("x is %i, y is %i\n", x, y);
    swap(&x, &y);
    printf("x is %i, y is %i\n", x, y);
}

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

В этом коде (я не писал его, кстати) Я не понимаю, как меняются местами x и y , когда мы фактически меняем местами a и b в функция ниже. Я не знаю, каковы отношения между 'x и y' и 'a и b'.

Я знаю, что * - это указатель, и что '&' дает адрес объектам, но я не понимаю, как это указывает на x и y, когда они (x и y) не упоминаются в фактической функции.

я не знаю что ' заполнитель '.

Пожалуйста, объясните это, если можете!

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Это потому, что a и b являются указателями, и вы фактически передаете адреса x и y в main() в качестве аргументов функции swap() по ссылке :

swap(&x, &y);

Если вы используете оператор &, он получает адрес объекта.

Параметр a назначается адресом x и параметром b присваивается адресом y.

Если вы правильно разыменовываете указатели a и b и имеете правильный алгоритм (как в данном случае), вы меняете местами значения x и y внутри main(), а не значения указателей a и b.

Если говорить о самом алгоритме:

int tmp = *a;
*a = *b;
*b = tmp;
  1. int tmp = *a; - значение x присваивается временному объекту. Это необходимо, поскольку на следующем шаге мы меняем значение x.

  2. *a = *b; - значение y присваивается x.

  3. *b = tmp; - значение, которое ранее хранилось в x и хранилось как место между tmp (временный объект), теперь присвоено y.

Обратите внимание, что на всех этих шагах оператор * не означает двойное объявление указателя. Он используется для разыменования указателя.

Для получения дополнительной информации о «разыменовании» см.:

Что означает «разыменование» указателя ?

Если значения x и y были переданы значением (без &), а параметры a и b были только типа int, не int *, тогда вы измените только a и b внутри swap().

Я рекомендую вам узнать больше об указателях. Например, в бесплатной копии Modern C, сделанной членом сообщества @JensGustedt.

0 голосов
/ 11 июля 2020

Когда вы передаете адрес x и y функции обмена. Параметры этой функции указывают на новый адрес и меняют местами содержимое двух адресов, как это делает функция.

...