Wskaźniki do struktur
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 44 z 63.
Skoro swobodnie posługujesz się już strukturami, czas połączyć je z innym potężnym elementem języka C: wskaźnikami. Tak jak możesz tworzyć wskaźniki do podstawowych typów danych, takich jak int lub char, możesz też tworzyć wskaźniki przechowujące adres zmiennej typu strukturalnego.
Składnia deklarowania wskaźnika do struktury jest taka sama jak w przypadku innych deklaracji wskaźników:
struct StructureName *pointerName;Na przykład, używając znanej nam struktury Point:
struct Point p1 = {10, 20};
struct Point *ptr;Tworzy to wskaźnik o nazwie ptr, który może przechowywać adres struktury Point. Aby wskaźnik faktycznie wskazywał na naszą zmienną będącą strukturą, użyj operatora pobrania adresu:
ptr = &p1;Teraz ptr przechowuje adres pamięci zmiennej struktury p1. Otwiera to nowe możliwości pracy ze strukturami, zwłaszcza podczas przekazywania ich do funkcji lub dynamicznego zarządzania pamięcią. Wskaźniki do struktur są niezbędne do budowania bardziej złożonych struktur danych i pisania wydajnych programów w C.
Wyzwanie
ŁatwyUtwórz program w C, który demonstruje pracę ze wskaźnikami do struktur. Twój program powinien:
- Zdefiniować
structo nazwieProductz następującymi składowymi:- Liczba całkowita
iddo przechowywania identyfikatora produktu - Tablica znaków
nameo rozmiarze 25 do przechowywania nazwy produktu - Liczba zmiennoprzecinkowa
pricedo przechowywania ceny produktu - Liczba całkowita
quantitydo przechowywania dostępnej ilości
- Liczba całkowita
- W funkcji main utworzyć zmienną typu
Producto nazwieitemi zainicjalizować ją następującymi wartościami:- ID: 501
- Nazwa: "Laptop"
- Cena: 899.99
- Ilość: 15
- Zadeklarować wskaźnik do struktury
Producto nazwieitemPtr - Przypisać adres zmiennej
itemdoitemPtr, używając operatora pobrania adresu - Wypisać oryginalne informacje o produkcie, uzyskując bezpośredni dostęp do składowych struktury (za pomocą operatora kropki) w dokładnie takim formacie:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Wypisać te same informacje o produkcie, uzyskując dostęp do składowych struktury za pośrednictwem wskaźnika (za pomocą operatora dereferencji i notacji kropkowej:
(*itemPtr).member) w dokładnie takim formacie:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Zweryfikować, czy wskaźnik prawidłowo wskazuje na strukturę, wypisując adresy pamięci w dokładnie takim formacie:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Podczas weryfikacji adresu wypisz Match, jeśli adresy są takie same, lub No Match, jeśli są różne.
To wyzwanie sprawdza Twoje rozumienie deklarowania wskaźnika do struktury, przypisywania adresu za pomocą operatora pobrania adresu oraz uzyskiwania dostępu do składowych struktury za pośrednictwem wskaźników przy użyciu operatora dereferencji połączonego z notacją kropkową. Sprawdzisz również, czy wskaźnik prawidłowo przechowuje adres zmiennej struktury.
Spróbuj swoich sił
#include <stdio.h>
#include <string.h>
// TODO: Zdefiniuj tutaj strukturę Product
int main() {
// TODO: Napisz tutaj swój kod
// 1. Utwórz i zainicjalizuj zmienną 'item' typu Product
// 2. Zadeklaruj wskaźnik do Product o nazwie 'itemPtr'
// 3. Przypisz adres 'item' do 'itemPtr'
// 4. Wypisz pierwotne informacje o produkcie, używając operatora kropki
// 5. Wypisz informacje o produkcie za pomocą wskaźnika, używając (*itemPtr).member
// 6. Wypisz i sprawdź adresy
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