Elementy tablic — wskaźniki
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 8 z 63.
Teraz, gdy rozumiesz, jak nazwy tablic działają jako wskaźniki, możesz wykorzystać tę wiedzę, aby uzyskiwać dostęp do elementów tablicy w zupełnie inny sposób. Zamiast używać znanej notacji nawiasowej, takiej jak array[i], możesz użyć notacji wskaźnikowej, aby osiągnąć ten sam rezultat.
Kluczowy wniosek jest taki, że array[i] jest dokładnie równoważne *(array + i). Gdy zapisujesz array + i, każesz językowi C przesunąć się o i pozycji od początku tablicy. Operator wyłuskania * pobiera następnie wartość z tej lokalizacji.
int numbers[5] = {10, 20, 30, 40, 50};
// Te dwie linie robią dokładnie to samo:
printf("%d", numbers[2]); // Wyświetla 30
printf("%d", *(numbers + 2)); // Również wyświetla 30Ta notacja wskaźnikowa działa, ponieważ C automatycznie oblicza prawidłowy adres pamięci na podstawie rozmiaru typu danych. Gdy dodasz 2 do wskaźnika na tablicę liczb całkowitych, C przesuwa się do przodu o 2 × sizeof(int) bajtów, trafiając dokładnie na trzeci element.
Zrozumienie tej równoważności daje ci swobodę w pracy z tablicami i przygotowuje do bardziej zaawansowanych technik wskaźnikowych, które poznasz w miarę dalszej nauki języka C.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje dostęp do elementów tablicy za pomocą notacji wskaźnikowej zamiast tradycyjnego indeksowania tablicy. Program powinien:
- Zadeklarować tablicę liczb całkowitych o nazwie
valuesz 6 elementami i zainicjalizować ją wartościami {5, 15, 25, 35, 45, 55} - Użyć pętli for, aby przejść przez wszystkie elementy tablicy
- Wewnątrz pętli użyć notacji wskaźnikowej
*(values + i), aby uzyskać dostęp do każdego elementu (nie używać notacji nawiasowej, takiej jakvalues[i]) - Wypisać każdy element, używając dostępu za pomocą notacji wskaźnikowej
- Po pętli zademonstrować równoważność, wypisując trzeci element (indeks 2) za pomocą obu metod:
- Najpierw za pomocą notacji wskaźnikowej:
*(values + 2) - Następnie za pomocą tradycyjnej notacji tablicowej:
values[2]
- Najpierw za pomocą notacji wskaźnikowej:
Wynik powinien być wyświetlony w następującym formacie:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25To wyzwanie sprawdza, czy rozumiesz równoważność między array[i] a *(array + i), pokazując, jak arytmetyka wskaźników pozwala uzyskiwać dostęp do elementów tablicy za pomocą obliczeń adresów pamięci zamiast tradycyjnego indeksowania.
Spróbuj swoich sił
#include <stdio.h>
int main() {
// TODO: Napisz tutaj swój kod
// Zadeklaruj i zainicjalizuj tablicę 'values' z 6 elementami
// Użyj pętli for, aby wypisać każdy element za pomocą notacji wskaźnikowej *(values + i)
// Po zakończeniu pętli wypisz trzeci element, używając zarówno notacji wskaźnikowej, jak i tablicowej
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