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.
Wyzwanie
ŁatwyNapisz 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:
- Zadeklarować tablicę liczb całkowitych o nazwie
dataz 5 elementami i zainicjalizować ją wartościami {12, 24, 36, 48, 60} - Zadeklarować wskaźnik do liczby całkowitej o nazwie
ptri zainicjalizować go tak, aby wskazywał na pierwszy element tablicy - 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
- 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
- Wypisać bieżącą wartość, na którą wskazuje
- Po zakończeniu pętli ustawić
ptrz powrotem tak, aby wskazywał na pierwszy element tablicy - 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) - 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: 60To 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;
}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