Menu
Coddy logo textTech

Классический пример: Swap

Часть раздела Logic & Flow путешествия по C на Coddy — урок 28 из 63.

Функция swap — один из самых известных примеров, демонстрирующих, почему указатели необходимы в программировании на C. Цель проста: написать функцию, которая меняет местами значения двух переменных. Однако эта, казалось бы, простая задача выявляет фундаментальное ограничение передачи по значению (pass-by-value).

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

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Это меняет местами только копии, а не исходные переменные!
}

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

Решение требует передачи указателей на переменные вместо самих переменных:

void swap(int *a, int *b) {
    int temp = *a;  // Сохраняем значение по адресу a
    *a = *b;        // Помещаем значение из адреса b в адрес a
    *b = temp;      // Помещаем сохраненное значение в адрес b
}

Передавая адреса переменных и используя оператор разыменования, функция может напрямую изменять значения исходных переменных. Это делает функцию swap идеальной демонстрацией того, когда и почему вам нужны указатели для выполнения задач, с которыми простая передача по значению (pass-by-value) просто не может справиться.

challenge icon

Задание

Легко

Напишите программу на языке C, которая реализует и демонстрирует классическую функцию перестановки (swap) с использованием указателей. Ваша программа должна:

  1. Создать функцию с именем swap, которая принимает два указателя на целые числа в качестве параметров
  2. Внутри функции swap обменять значения по адресам памяти, на которые указывают эти два указателя, используя временную переменную
  3. В функции main считать два целых числа из пользовательского ввода
  4. Вывести исходные значения в формате: Before swap: a = [value], b = [value]
  5. Вызвать функцию swap и передать адреса обеих переменных, используя оператор взятия адреса
  6. После вызова функции вывести измененные значения в формате: After swap: a = [value], b = [value]

Ваш вывод должен демонстрировать, что функция успешно обменивает значения исходных переменных:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

Эта задача демонстрирует, почему указатели необходимы для операции перестановки — функция должна иметь доступ к ячейкам памяти исходных переменных, чтобы навсегда изменить их значения, что невозможно при передаче по значению.

Шпаргалка

Функция swap демонстрирует, почему указатели важны в C. Передача по значению не может поменять местами исходные переменные, так как функции получают только копии:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Это меняет местами только копии, а не исходные переменные!
}

Правильный подход использует указатели для доступа и изменения исходных переменных:

void swap(int *a, int *b) {
    int temp = *a;  // Сохраняем значение по адресу a
    *a = *b;        // Помещаем значение из адреса b в адрес a
    *b = temp;      // Помещаем сохраненное значение в адрес b
}

Передавая адреса и используя оператор разыменования (*), функция может напрямую изменять значения исходных переменных.

Попробуйте сами

#include <stdio.h>

// TODO: Напишите вашу функцию swap здесь

int main() {
    int a, b;
    
    // Чтение входных данных
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Вывод исходных значений
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Вызовите вашу функцию swap здесь
    
    // Вывод значений после обмена
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow