Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Napisz 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:

  1. Zadeklarować tablicę liczb całkowitych o nazwie scores z 8 elementami i zainicjalizować ją wartościami {45, 78, 92, 63, 87, 34, 91, 56}
  2. Zadeklarować dwa wskaźniki do liczb całkowitych: start_ptr i end_ptr
  3. Ustawić start_ptr, aby wskazywał na pierwszy element tablicy
  4. Ustawić end_ptr, aby wskazywał na ostatni element tablicy, używając arytmetyki wskaźników
  5. Zadeklarować wskaźnik o nazwie current_ptr i zainicjalizować go tak, aby wskazywał na pierwszy element
  6. Użyć pętli while z porównaniem wskaźników (current_ptr <= end_ptr), aby przejść przez tablicę
  7. 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
  8. Po zakończeniu pętli użyć porównania wskaźników, aby sprawdzić, czy current_ptr znajduje się teraz za końcem tablicy, sprawdzając, czy current_ptr > end_ptr
  9. 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 complete

To 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;
}
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