Porównywanie wskaźników
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 10 z 63.
Dowiedziałeś się, jak poruszać się po tablicach za pomocą arytmetyki wskaźników. Teraz odkryjesz, że wskaźniki można również porównywać za pomocą tych samych operatorów relacyjnych, których używasz ze zwykłymi zmiennymi: ==, !=, < i >.
Porównując dwa wskaźniki, porównujesz ich adresy w pamięci. Jest to szczególnie przydatne, gdy oba wskaźniki wskazują elementy tej samej tablicy, ponieważ pozwala określić ich względne położenie w pamięci.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Wskazuje na pierwszy element
int *end = numbers + 4; // Wskazuje na ostatni element
if (start < end) {
printf("start comes before end in memory");
}Porównywanie wskaźników staje się szczególnie przydatne w warunkach pętli. Zamiast używać zmiennej licznika, możesz porównać bieżącą pozycję wskaźnika z docelowym wskaźnikiem, aby określić, kiedy pętla powinna się zatrzymać. Dzięki temu powstaje elegancki i wydajny kod do przechodzenia przez tablicę.
Kluczowa obserwacja jest taka, że ptr1 < ptr2 informuje, że ptr1 wskazuje element, który znajduje się wcześniej w tablicy niż element, na który wskazuje ptr2. Ta zależność sprawia, że porównywanie wskaźników doskonale nadaje się do sterowania pętlami przetwarzającymi tablice sekwencyjnie.
Wyzwanie
ŁatwyNapisz program w C, który używa porównywania wskaźników do przechodzenia przez tablicę i znajdowania elementów z określonego zakresu. Twój program powinien:
- Zadeklarować tablicę liczb całkowitych o nazwie
scoresz 8 elementami i zainicjalizować ją wartościami {45, 78, 92, 63, 87, 34, 91, 56} - Zadeklarować dwa wskaźniki na liczby całkowite:
start_ptriend_ptr - Ustawić
start_ptrtak, aby wskazywał na pierwszy element tablicy - Ustawić
end_ptrtak, aby wskazywał na ostatni element tablicy, używając arytmetyki wskaźników - Zadeklarować wskaźnik o nazwie
current_ptri zainicjalizować go tak, aby wskazywał na pierwszy element - Użyć pętli while z porównywaniem wskaźników (
current_ptr <= end_ptr) do przejścia przez tablicę - Wewnątrz pętli:
- Sprawdzić, czy bieżąca wartość mieści się w przedziale od 60 do 90 (włącznie)
- Jeśli wartość mieści się w zakresie, wypisać dokładnie
Value [value] is in range - Jeśli wartość nie mieści się w zakresie, wypisać dokładnie
Value [value] is out of range - Zwiększyć
current_ptr, aby przejść do następnego elementu
- Po zakończeniu pętli użyć porównywania wskaźników, aby sprawdzić, czy
current_ptrznajduje się już za końcem tablicy, sprawdzając, czycurrent_ptr > end_ptr - Jeśli warunek jest prawdziwy, wypisać dokładnie
Traversal complete
Wynik powinien wyświetlać rezultaty w następującym formacie:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeTo wyzwanie sprawdza Twoje rozumienie operatorów porównywania wskaźników w warunkach pętli, używania arytmetyki wskaźników do ustawiania wskaźników granicznych oraz tego, jak porównywanie wskaźników może sterować przechodzeniem przez tablicę w bardziej elegancki sposób niż tradycyjne pętle oparte na liczniku.
Spróbuj swoich sił
#include <stdio.h>
int main() {
// TODO: Napisz swój kod poniżej
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