Wskaźniki do struktur
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 44 z 63.
Skoro swobodnie pracujesz już ze strukturami, czas połączyć je z innym potężnym konceptem języka C: wskaźnikami. Tak jak możesz tworzyć wskaźniki do podstawowych typów danych, takich jak int czy char, możesz też tworzyć wskaźniki przechowujące adres zmiennej będącej strukturą.
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ą strukturalną, użyj operatora pobrania adresu:
ptr = &p1;Aby odczytać składową za pomocą wskaźnika, wyłuskuj go, a następnie użyj operatora kropki. Nawiasy są wymagane, ponieważ . wiąże silniej niż *:
printf("%d", (*ptr).x); // to samo co p1.xTeraz 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 tworzenia 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:- Liczbę całkowitą
iddo przechowywania identyfikatora produktu - Tablicę znaków
nameo rozmiarze 25 do przechowywania nazwy produktu - Liczbę zmiennoprzecinkową
pricedo przechowywania ceny produktu - Liczbę całkowitą
quantitydo przechowywania dostępnej ilości
- Liczbę całkowitą
- 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
itemdoitemPtrza pomocą 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]
- Sprawdzić, 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]
W ramach weryfikacji adresu wypisz Match, jeśli adresy są takie same, lub No Match, jeśli są różne.
To wyzwanie sprawdza, czy rozumiesz deklarowanie wskaźnika do struktury, przypisywanie adresu za pomocą operatora pobrania adresu oraz uzyskiwanie 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ą typu Product o nazwie 'item'
// 2. Zadeklaruj wskaźnik do Product o nazwie 'itemPtr'
// 3. Przypisz adres 'item' do 'itemPtr'
// 4. Wyświetl pierwotne informacje o produkcie, używając operatora kropki
// 5. Wyświetl informacje o produkcie za pomocą wskaźnika, używając (*itemPtr).member
// 6. Wyświetl 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