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 dowiesz się, że wskaźniki można również porównywać za pomocą tych samych operatorów relacyjnych, których używasz dla zwykłych zmiennych: ==, !=, < i >.
Porównując dwa wskaźniki, porównujesz ich adresy w pamięci. Jest to szczególnie przydatne, gdy oba wskaźniki wskazują na 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ównywać bieżące położenie wskaźnika z docelowym wskaźnikiem, aby określić, kiedy pętla ma się zatrzymać. Dzięki temu powstaje elegancki i wydajny kod do przechodzenia po tablicy.
Kluczowy wniosek jest taki, ż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 kontrolowania pętli przetwarzających tablice sekwencyjnie.
Wyzwanie
ŁatwyNapisz program w C, który używa porównywania wskaźników do przechodzenia przez tablicę i znajdowania elementów w określonym zakresie. 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 do liczb całkowitych:
start_ptriend_ptr - Ustawić
start_ptr, aby wskazywał na pierwszy element tablicy - Ustawić
end_ptr, 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ównaniem wskaźników (
current_ptr <= end_ptr), aby przejść przez tablicę - Wewnątrz pętli:
- Sprawdzić, czy bieżąca wartość mieści się w zakresie od 60 do 90 (włącznie)
- Jeśli wartość mieści się w zakresie, wypisać "Value [value] is in range"
- Jeśli wartość nie mieści się w zakresie, wypisać "Value [value] is out of range"
- Zwiększyć
current_ptr, aby przejść do następnego elementu
- Po zakończeniu pętli użyć porównania wskaźników, aby sprawdzić, czy
current_ptrznajduje się teraz za końcem tablicy, sprawdzając, czycurrent_ptr > end_ptr - Jeśli warunek jest spełniony, wypisać "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 sposób bardziej elegancki 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