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.
Wyzwanie
ŁatwyNapisz program w C, który implementuje i demonstruje klasyczną funkcję zamiany wartości przy użyciu wskaźników. Twój program powinien:
- Utworzyć funkcję o nazwie
swap, która przyjmuje jako parametry dwa wskaźniki na liczby całkowite - Wewnątrz funkcji
swapzamienić wartości pod adresami pamięci wskazywanymi przez oba wskaźniki, używając zmiennej tymczasowej - W funkcji
mainodczytać dwie liczby całkowite z wejścia użytkownika - Wypisać oryginalne wartości w formacie:
Before swap: a = [value], b = [value] - Wywołać funkcję
swapi przekazać adresy obu zmiennych za pomocą operatora pobrania adresu - 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;
}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
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znakówPoćwicz samodzielnie: Kompilator C online