Deklarowanie wskaźników
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 2 z 63.
Skoro już rozumiesz, czym są wskaźniki, nauczmy się je tworzyć. Deklarowanie zmiennej wskaźnikowej odbywa się według określonej składni, która informuje kompilator, na jaki typ danych będzie wskazywać wskaźnik.
Podstawowa składnia deklarowania wskaźnika to: data_type *pointer_name;
int *ptr; // Deklaruje wskaźnik na liczbę całkowitą
char *ch_ptr; // Deklaruje wskaźnik na znak
float *f_ptr; // Deklaruje wskaźnik na liczbę zmiennoprzecinkowąGwiazdka (*) sprawia, że jest to deklaracja wskaźnika. Informuje kompilator, że ta zmienna będzie przechowywać adres pamięci, a nie rzeczywistą wartość danych. Deklarując int *ptr;, mówisz: „ptr to wskaźnik, który może przechowywać adres zmiennej typu całkowitego”.
Dobrą praktyką jest inicjalizowanie wskaźników wartością NULL, jeśli nie wskazują jeszcze na prawidłowy adres pamięci. Zapobiega to wskazywaniu przez nie losowych lokalizacji pamięci: int *ptr = NULL;
Podczas drukowania adresów wskaźników za pomocą printf używaj specyfikatora formatu %p. Często zaleca się rzutowanie wskaźnika na (void *), aby zapewnić zgodność i prawidłowe formatowanie: printf("%p", (void *)ptr);
Zwróć uwagę, że typ danych przed gwiazdką określa, na jaki rodzaj danych będzie wskazywać wskaźnik. Jest to ważne, ponieważ różne typy danych zajmują różną ilość pamięci, a kompilator musi znać tę informację, aby prawidłowo zarządzać pamięcią.
Wyzwanie
Łatwy- Zadeklarować wskaźnik na liczbę całkowitą o nazwie
int_ptr, zainicjalizowany wartościąNULL - Zadeklarować wskaźnik na znak o nazwie
char_ptr, zainicjalizowany wartościąNULL - Zadeklarować wskaźnik na liczbę zmiennoprzecinkową o nazwie
float_ptr, zainicjalizowany wartościąNULL - Wypisać adresy pamięci przechowywane w każdym wskaźniku za pomocą
printfze specyfikatorem formatu%p. Podczas wypisywania rzutuj wskaźnik na(void*), aby zapewnić prawidłowe formatowanie, na przykład:printf("Label: %p\n", (void*)ptr);
Wynik powinien wyświetlać trzy adresy wskaźników w następującym formacie:
Integer pointer: [address]
Character pointer: [address]
Float pointer: [address]Pamiętaj, że rzeczywiste adresy pamięci będą się różnić, ale format i etykiety muszą dokładnie odpowiadać powyższemu przykładowi.
Spróbuj swoich sił
#include <stdio.h>
int main() {
// TODO: Zadeklaruj tutaj swoje wskaźniki
// TODO: Wypisz adresy wskaźników w wymaganym formacie
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