Menu
Coddy logo textTech

Klasyczny przykład: zamiana

Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 28 z 63.

Funkcja zamiany to jeden z najbardziej znanych przykładów pokazujących, dlaczego wskaźniki są niezbędne w programowaniu w C. Cel jest prosty: napisać funkcję, która zamienia wartości dwóch zmiennych. Jednak to pozornie proste zadanie ujawnia fundamentalne ograniczenie przekazywania przez wartość.

Zastanów się, co się stanie, jeśli spróbujesz zamienić miejscami dwie zmienne, używając standardowego przekazywania przez wartość:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // To zamienia miejscami tylko kopie, a nie oryginalne zmienne!
}

To podejście nie działa, ponieważ funkcja otrzymuje tylko kopie wartości. Oryginalne zmienne w funkcji wywołującej pozostają bez zmian.

Rozwiązanie wymaga przekazania wskaźników do zmiennych:

void swap(int *a, int *b) {
    int temp = *a;  // Zapisz wartość pod adresem a
    *a = *b;        // Umieść wartość spod adresu b pod adresem a
    *b = temp;      // Umieść zapisaną wartość pod adresem b
}

Przekazując adresy zmiennych i używając operatora dereferencji, funkcja może bezpośrednio modyfikować wartości oryginalnych zmiennych. Dzięki temu funkcja zamiany stanowi doskonały przykład tego, kiedy i dlaczego potrzebujesz wskaźników, aby wykonać zadania, z którymi samo przekazywanie przez wartość sobie nie poradzi.

challenge icon

Wyzwanie

Łatwy

Napisz program w C, który implementuje i demonstruje klasyczną funkcję zamiany wartości przy użyciu wskaźników. Twój program powinien:

  1. Utworzyć funkcję o nazwie swap, która przyjmuje jako parametry dwa wskaźniki na liczby całkowite
  2. Wewnątrz funkcji swap zamienić wartości pod adresami pamięci wskazywanymi przez oba wskaźniki, używając zmiennej tymczasowej
  3. W funkcji main odczytać dwie liczby całkowite z wejścia użytkownika
  4. Wypisać oryginalne wartości w formacie: Before swap: a = [value], b = [value]
  5. Wywołać funkcję swap i przekazać adresy obu zmiennych za pomocą operatora pobrania adresu
  6. Po wywołaniu funkcji wypisać zamienione wartości w formacie: After swap: a = [value], b = [value]

Wynik powinien pokazywać, że funkcja pomyślnie zamienia wartości oryginalnych zmiennych:

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

To wyzwanie pokazuje, dlaczego wskaźniki są niezbędne do zamiany wartości — funkcja musi uzyskać dostęp do lokalizacji pamięci oryginalnych zmiennych, aby trwale zamienić ich wartości, czego nie da się zrobić przy przekazywaniu przez wartość.

Spróbuj swoich sił

#include <stdio.h>

// TODO: Napisz tutaj swoją funkcję zamieniającą wartości

int main() {
    int a, b;
    
    // Wczytaj dane wejściowe
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Wypisz wartości przed zamianą
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Wywołaj tutaj swoją funkcję zamieniającą wartości
    
    // Wypisz wartości po zamianie
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i sterowanie przepływem

Poćwicz samodzielnie: Kompilator C online