Witam i witam ponownie.
W tym wykładzie chcę omówić definiowanie wskaźników, głównie składnię
deklarowania reportera, a następnie wykorzystanie adresu operatora do przypisania
adresu pamięci do wskaźnika.
Tak więc do tego momentu powinniśmy mieć w głowie
wwiercane w głowę, że wskaźnik jest niczym innym
jak zmienną, która wskazuje na adres pamięci lub zawiera adres pamięci jako swoją wartość.
Tak więc deklarowanie wskaźnika to nie to samo, co tworzenie normalnego wskaźnika.
Więc nie możesz zrobić czegoś takiego jak wskaźnik.
To nie jest sposób na zadeklarowanie wskaźnika. Składnia jest nieco inna.
Używasz gwiazdki. Nie wystarczy więc powiedzieć, że zmienna jest wskaźnikiem.
Musisz także określić rodzaj zmiennej, na którą wskazuje wskaźnik.
Różne typy zmiennych zajmują różne ilości pamięci.
Niektóre operacje wskaźnikowe wymagają znajomości tego rozmiaru pamięci.
Tak więc, tak jak w przypadku zwykłej zmiennej podczas
określania typu danych, podczas tworzenia zmiennej typu wskaźnikowego
należy również określić ten typ danych.
Możesz zadeklarować wskaźnik do zmiennej typu int, wykonując następujące czynności:
int star lub gwiazdka liczba p.
To powie ci, że to jest wskaźnik.
Int wygląda tak samo, ale po nim jest gwiazdka.
Gwiazdka oznacza, że wskaźnik, a następnie określasz
typ samego wskaźnika. To jest wskaźnik int.
Typ zmiennej o nazwie p liczby int star.
Może przechowywać adres dowolnej zmiennej typu int.
Wskaźnik przechowuje adresy. Więc jeśli
zamierzasz przechowywać adres innej zmiennej, ta zmienna
musi być zdefiniowana jako typ całkowity.
Więc tutaj PI wskazuje na zmienną
int, char
star pc, to wskazuje na zmienną znakową, float star
pf star pg, to są wskaźniki do zmiennych typu float.
Tak je definiujesz, typy mają znaczenie.
Spacja między gwiazdką a nazwą wskaźnika jest opcjonalna.
Nie musisz umieszczać tam miejsca. Nie możesz mieć miejsca.
To, co się
kończy, a my zamierzamy porozmawiać o dereferencji zmiennej, to zwykle używasz spacji w
deklaracji, a kiedy dereferencjonujesz, nie używasz jej.
Zatem wszystkie te deklaracje powinny zawierać spację zgodnie z konwencją.
Wartością wskaźnika jest adres,
więc w większości systemów musi być wewnętrznie reprezentowany jako obraz bez znaku.
Więc nadal musi coś przechowywać. Tak się składa, że przechowuje liczbę szesnastkową.
I nawet jeśli przechowuje to tak, jak wygląda jak liczba całkowita,
nie myśl o tym jako o typie całkowitym.
Te same rzeczy, które możesz zrobić z liczbami całkowitymi, niekoniecznie możesz zrobić za pomocą wskaźników i odwrotnie.
Więc nawet jeśli spróbujesz to wydrukować, będzie wyglądać jak liczba szesnastkowa, nie oznacza to, że
możesz traktować ją jak liczbę całkowitą.
Możesz na przykład pomnożyć jedną liczbę całkowitą przez
drugą, ale nie możesz pomnożyć jednego wskaźnika przez drugi.
Wskaźnik jest naprawdę nowym typem, nie jest typem całkowitym.
Procent p reprezentuje format określony dla wskaźników.
Zamierzam wyświetlić różne dane dla wskaźnika i zobaczymy, jak to jest używane.
Poprzednie deklaracje tworzą
zmienną, ale nie ma inicjalizacji. Tam nie ma przydziału.
Zawsze chcesz przypisać wartość do
wskaźnika, jest to bardzo niebezpieczne, jeśli tego nie zainicjujesz.
Więc chcesz zainicjować wskaźnik, kiedy go deklarujesz.
Jeśli nie wiesz, do czego
ją zainicjować, jeśli nie jest to adres
innej zmiennej lub nie przydzieliłeś jej dynamicznie pamięci, możesz użyć wskaźnika zerowego.
Możesz więc zainicjować wskaźnik, aby nic nie wskazywał.
Robisz to używając null.
Mówisz, że liczba p w instar jest równa null dla wskaźnika do int.
Null to stała zdefiniowana przez bibliotekę standardową.
Jest to odpowiednik zera dla wskaźnika.
To znaczy, że na nic nie wskazuje.
Gwarantujemy, że nie wskaże żadnego miejsca w pamięci.
Więc to dobrze, że chcesz to zrobić, ponieważ oznacza to, że nie
popełnisz żadnych błędów, przypadkowo wykonując przepełnienie bufora lub zapisując do
pamięci, do której nie powinieneś pisać.
Zainicjowanie go w ten sposób ogranicza niektóre błędy, które możesz popełnić.
Rozmawialiśmy trochę wcześniej o null. Rozmawialiśmy o znaku zerowym.
Ta koncepcja różni się od wskaźnika zerowego.
Pusty wskaźnik oznacza, że nic nie wskazuje i powinien zostać zainicjalizowany z tym.
Musisz dodać dyrektywę include dla standardowej definicji. h, jeśli chcesz użyć tutaj
definicji zerowej.
Adres operatora. Jeśli chcesz przypisać swój
wskaźnik do
adresu, możesz użyć operatora adresu istniejącej zmiennej.
Więc jeśli chcesz zainicjować swoją zmienną za pomocą zmiennej add lub
sub, którą masz, zadeklarowałeś już, że używasz adresu operatora, ampersand.
Widzieliśmy to, omawiając funkcję scanf.
Tutaj przypisujemy wartość całkowitą 99.
Tworzymy wskaźnik typu int i przypisujemy mu adres liczby.
Możemy to zrobić, ponieważ liczba jest
liczbą int, a wskaźnik, który utworzyliśmy, wskazuje również na int.
Więc wszystko, co musimy zrobić po operatorze równości, to użyć znaku ampersand.
A więc teraz liczba p będzie zawierała adres liczby.
Początkowa wartość liczby p jest adresem zmiennej.
Deklaracja liczby musi poprzedzać deklarację wskaźnika, który przechowuje jego
adres, ponieważ nie
można przypisać do wskaźnika czegoś, co
nie ma przydzielonej pamięci.
Jeśli spróbujesz przypisać do tego numeru wskaźnika, numer nie istnieje, chyba że zrobisz to później.
Aby przypisać adres do wskaźnika,
adres ten musi mieć przydzieloną pamięć.
W przeciwnym razie kompilator będzie narzekał.
Uważaj jednak, ponieważ nie ma nic specjalnego w deklaracji wskaźnika.
W tej samej instrukcji można zadeklarować zmienne zwykłe i wskaźniki.
Więc możesz powiedzieć podwójna wartość, wartość p f liczba.
W tym stwierdzeniu jest to jedyna
druga zmienna p val jest wskaźnikiem, pozostałe dwie są po prostu podwójnymi.
To jest trochę bardziej wyraźne, trochę bardziej
oczywiste w tej deklaracji. Ale co, jeśli powiesz w gwiazdce
pq, oznacza to, że oba są wskaźnikami, a nie są.
Mamy tu tylko jeden wskaźnik int, który jest p, zmienna
q służy po prostu do wpisania int.
Powszechnym błędem jest myślenie, że zarówno p, jak i q są wskaźnikami.
Dlatego bądź ostrożny, deklarując wskaźnik na wielu zmiennych w tej samej linii.
Dobrym pomysłem jest również używanie nazw zaczynających się od p jako nazw wskaźników.
Dzięki temu dowiesz się, że ta zmienna jest wskaźnikiem po prostu patrząc na nią.
Więc zazwyczaj wszystkie deklaracje zmiennych wykonujesz na początku
programu, zwykle wewnątrz funkcji main.
A kiedy zobaczysz te zmienne używane
później w programie, możesz łatwo zidentyfikować różne typy danych
lub różne typy wskaźników, ponieważ mają one przedrostek p.
Dlatego w tym wykładzie
omówiono, jak można zdefiniować, zadeklarować wskaźnik, a następnie
przypisać adres istniejącej zmiennej do wskaźnika.
Istnieją przypadki, w których nie chcesz koniecznie
przypisywać istniejącej zmiennej wartości wskaźnika, być może chcesz przydzielić nową pamięć.
O nich porozmawiamy w kolejnym wykładzie. Ale teraz zamierzamy to uprościć.
Skoncentrujemy się na używaniu wskaźników typu int
i różnych łatwych typów, takich jak podwójne lub zmiennoprzecinkowe.
Skoncentrujemy się na przypisaniu
istniejących zmiennych, adresu i zobaczymy, jak to działa.
Więc przejdźmy do przodu. Dziękuję Ci.