Większość programistów napotyka wskaźniki w C poprzez specyficzny mechanizm znany jako przekazywanie wskaźników. To nie jest tylko cecha syntaktyczna; jest to podstawowy powód, dla którego funkcje mogą zmieniać stan zewnętrzny. Prawdopodobnie widziałeś to już wcześniej, nie zdając sobie z tego sprawy. Przyjrzyjmy się funkcji „scanf”. Za każdym razem, gdy wywołujesz scanf, musisz dodać operator adresu (& ) przed zmiennymi.
scanf("%d", &mójNumer);
Jeśli pominiesz ten ampersand, program ulegnie awarii. Dlaczego? Ponieważ scanf oczekuje adresu pamięci, a nie wartości. Zrozumienie tego zachowania ujawnia logikę jak C obsługuje parametry funkcji. Przekazując wskaźnik, dajesz funkcji pozwolenie na dostęp do pamięci i bezpośrednie nadpisywanie danych.
Зміст
Błąd przekazania wartości
Aby zrozumieć, dlaczego wskaźniki są potrzebne, musimy przyjrzeć się, co się dzieje, gdy ich nie ma. Częstym błędem początkujących jest próba napisania funkcji „zamień”, która zamienia dwie wartości całkowite.
Oto naiwna implementacja, która nie działa:
Uruchom ten kod. Dane wyjściowe pokażą „5 10”, a następnie „5 10”. Do wymiany nie doszło.
Powód jest prosty. W C argumenty są domyślnie przekazywane przez wartość. Po wywołaniu swap(a, b) system tworzy lokalne kopie a i b o nazwach i i j. Funkcja idealnie zamienia wartości i i j. Ale kiedy funkcja kończy się, te zmienne lokalne są niszczone. Oryginalne „a” i „b” w „main” pozostają niezmienione.
Rozwiązanie: przekazanie wskaźnika
Aby zmienić zmienne źródłowe, funkcja potrzebuje dostępu do ich rzeczywistych adresów w pamięci, a nie kopii ich wartości. W tym miejscu wskaźniki jako parametry funkcji stają się niezbędne.
Oto poprawiona implementacja:
Teraz wynikiem będzie „5 10”, po którym nastąpi „10 5”. Wymiana zadziałała.
Jak działa dereferencja wskaźników
Różnica polega na tym, co jest przekazywane do funkcji.
- Wywołanie:
swap(&a, &b)przekazuje adresyaib. - Parametry: Sygnatura funkcji
void swap(int *i, int *j)deklarujeiijjako wskaźniki do liczb całkowitych. - Komunikacja: Wewnątrz
swapizawiera adresa.jzawiera adresb. - Dereferencje: Operator
*i = *joznacza „przejdź do adresu pamięci zapisanego wii zapisz do niego wartość znalezioną pod adresem pamięci zapisanym wj”.
Wizualizuj dwa pola oznaczone „a” i „b”.
– a zawiera 5.
– b zawiera 10.
– i to notatka z zapisanym adresem pola a.
– j to notatka z zapisanym adresem pola b.
Kiedy kod wykonuje t = *i, odczytuje nutę i, udaje się pod ten adres i odczytuje wartość 5. Przechowuje „5” w „t”. Następnie *i = *j odczytuje wartość z pola b (czyli 10 ) i zapisuje ją z powrotem do pola a. Oryginalne pudełka zostały zmienione.

























