Menu
Coddy logo textTech

Arytmetyka wskaźników

Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 9 z 63.

Dowiedziałeś się, jak uzyskiwać dostęp do elementów tablicy za pomocą notacji wskaźnikowej, takiej jak *(array + i). Teraz poznasz jeszcze potężniejszą technikę: arytmetykę wskaźników, która pozwala przemieszczać wskaźniki w pamięci za pomocą prostych operacji zwiększania i zmniejszania.

Gdy zwiększasz wskaźnik za pomocą ++ lub zmniejszasz go za pomocą --, wskaźnik nie przesuwa się tylko o jeden bajt. Zamiast tego przesuwa się o rozmiar wskazywanego przez niego typu danych. W przypadku wskaźnika do liczby całkowitej ptr++ przesuwa go do przodu o sizeof(int) bajtów, dokładnie na następną liczbę całkowitą w pamięci.

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // Wskazuje na pierwszy element (10)
ptr++;                 // Teraz wskazuje na drugi element (20)
ptr++;                 // Teraz wskazuje na trzeci element (30)

To automatyczne obliczanie rozmiaru sprawia, że arytmetyka wskaźników jest tak potężna i wygodna. Nie musisz martwić się obliczaniem liczby bajtów — C zajmuje się adresowaniem pamięci za Ciebie na podstawie typu danych wskaźnika.

Arytmetyka wskaźników jest szczególnie przydatna do przechodzenia przez tablice w pętlach. Zamiast używać indeksów tablicy, możesz zwiększać wartość wskaźnika, aby kolejno przechodzić przez każdy element, co często pozwala uzyskać wydajniejszy kod.

challenge icon

Wyzwanie

Łatwy

Napisz program w C, który demonstruje arytmetykę wskaźników, używając operacji inkrementacji wskaźnika do przechodzenia przez tablicę i jej przetwarzania. Twój program powinien:

  1. Zadeklarować tablicę liczb całkowitych o nazwie data z 5 elementami i zainicjalizować ją wartościami {12, 24, 36, 48, 60}
  2. Zadeklarować wskaźnik do liczby całkowitej o nazwie ptr i zainicjalizować go tak, aby wskazywał na pierwszy element tablicy
  3. Użyć pętli for, która wykona się 5 razy, aby przejść przez całą tablicę, używając wyłącznie arytmetyki wskaźników
  4. Wewnątrz pętli:
    • Wypisać bieżącą wartość, na którą wskazuje ptr, używając operatora dereferencji
    • Wypisać adres pamięci zapisany w ptr, używając specyfikatora formatu %p
    • Inkrementować wskaźnik za pomocą ptr++, aby przejść do następnego elementu
  5. Po zakończeniu pętli ustawić ptr z powrotem tak, aby wskazywał na pierwszy element tablicy
  6. Użyć arytmetyki wskaźników, aby bezpośrednio uzyskać dostęp do trzeciego elementu (indeks 2) i go wypisać, używając *(ptr + 2)
  7. Użyć arytmetyki wskaźników, aby bezpośrednio uzyskać dostęp do ostatniego elementu (indeks 4) i go wypisać, używając *(ptr + 4)

Wynik powinien wyświetlać rezultaty w następującym formacie:

Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60

To wyzwanie sprawdza, czy rozumiesz, jak operacje inkrementacji wskaźnika automatycznie przesuwają go o rozmiar typu danych oraz jak używać arytmetyki wskaźników, aby uzyskiwać dostęp do elementów tablicy w określonych odległościach od pozycji wskaźnika bazowego.

Spróbuj swoich sił

#include <stdio.h>

int main() {
    // TODO: Napisz tutaj swój kod
    // Zadeklaruj i zainicjalizuj tablicę 'data' wartościami {12, 24, 36, 48, 60}
    // Zadeklaruj wskaźnik 'ptr' i zainicjalizuj go tak, aby wskazywał na pierwszy element
    // Użyj pętli for i arytmetyki wskaźników, aby przejść przez tablicę
    // Wypisz każdą wartość i adres, a następnie przesuń wskaźnik do przodu
    // Przywróć wskaźnik do początkowej pozycji i użyj arytmetyki wskaźników, aby uzyskać dostęp do określonych elementów
    
    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