Witam i witam ponownie.
W tym wykładzie chcę porozmawiać o dostępie do wartości
wskazywanej przez wskaźnik.
Pamiętaj więc o wskaźnikach, przechowują adresy pamięci.
Ten adres pamięci faktycznie zawiera gdzieś wartość.
I tak wskaźniki wskazują na ten adres pamięci. Chcę poznać wartość tego,
na co wskazuje.
Ponieważ chciałbym po prostu wydrukować wartość wskaźnika, który byłby adresem, ale chcę uzyskać adres,
chcę uzyskać wartość adresu.
Możesz więc uzyskać dostęp do wartości adresu, na który
wskazuje wskaźnik, używając operatora pośredniego. Operatorem pośrednim jest gwiazdka.
Więc nauczyliśmy się, jak używać gwiazdki do zadeklarowania
wskaźnika, zamierzamy również użyć gwiazdki, aby znaleźć wartość, na którą wskazuje wskaźnik.
Więc jest również nazywany operatorem wyłuskiwania, ponieważ
używasz go do wyłuskiwania wskaźnika.
Na przykład, jeśli masz liczbę równą 15, deklarujesz wskaźnik
typu int, wskazując na int i przypisujesz mu adres liczby za pomocą ampersand.
Teraz, jak uzyskać wartość wskazywaną przez wskaźnik.
Możesz usunąć odniesienie.
Zasadniczo można powiedzieć, że wartość, na którą wskazuje
wskaźnik, to wartość 15, ponieważ wskazuje ona na adres liczby 15.
Zatem zmienna wskaźnikowa zawiera adres numeru zmiennej.
Możesz użyć tego w wyrażeniu, aby obliczyć nową wartość wyniku.
Powiedzmy, że chcemy, aby wynik był równy wartości
wskazywanej przez wskaźnik plus pięć. Możesz użyć
gwiazdki przed nazwą wskaźnika.
A więc to, co by to zrobiło, to po prostu powiedzenie, na
co wskazuje zmienna wskaźnikowa, wskazuje na 15 dodać pięć do tego.
Jest to adres,
który wskazuje wskaźnik, jaka jest wartość tego adresu.
Zatem gwiazdka operatora pośredniego,
którą powinieneś zauważyć, jest również symbolem używanym do mnożenia i jest również
używana podczas deklarowania typów wskaźników. Może to być bardzo zagmatwane.
Skąd wiesz, co się dzieje lub jak działa kompilator.
Cóż, wszystko zależy od kontekstu. To zależy od tego, kiedy używasz tej gwiazdki i gdzie jej używasz.
Jeśli używasz gwiazdki, gdy deklarujesz wskaźnik bezpośrednio po
typie
wskaźnika, to oczywiście używa się deklaracji.
Jeśli użyjesz gwiazdki między dwiema liczbami, oznacza to,
że jest ona używana do mnożenia. A jeśli jest używany
na przykład tuż przed nazwą wskaźnika po prawej stronie lub po lewej
stronie, będzie przypisywać wartość lub uzyskiwać dostęp do wartości.
Więc wszystko zależy od kontekstu, kiedy używasz tych
operatorów pośrednich.
I tak to działa.
Tak więc kompilator to zinterpretuje.
Ilekroć widzisz to w tym przykładzie, wskaźnik gwiazdy
i nie masz wcześniej typu danych lub nie masz dwóch
liczb po każdej stronie, to wiesz, że jest to wskaźnik pośredni, dereferencja.
Przejdźmy więc przez przykład. Oto kolejny
przykład, w którym utworzymy liczbę
całkowitą równą 10. Mamy również zamiar utworzyć liczbę całkowitą typu o nazwie x inną zmienną.
Inicjalizujemy count do 10, x jest inicjowane na zero.
Następnie tworzymy wskaźnik int. Wiemy, że jest to
wskaźnik int, ponieważ mamy gwiazdkę po typie
danych, a następnie nazwaliśmy go int pointer.
Teraz przypiszemy do tego wskaźnika int adres count.
Ponieważ pamiętaj, wskaźniki zawierają tylko adresy jako wartości, ale
także wskazują na coś.
Możemy więc przypisać zmiennej x niezależnie od tego, na co wskazuje wskaźnik
int, jaka jest wartość adresu zawartego we wskaźniku.
Więc x faktycznie wyświetli 10.
10. Więc jeśli przejdziemy dalej i wyświetlimy to
powiedzenie count procent d ird x procent ird, count będzie równe 10, x będzie równe 10.
W ten sposób możesz wyłuskać wskaźnik i uzyskać taką wartość. Wskazuje, jeśli chcesz wyświetlić
wartości wskaźnika, ponieważ pamiętaj, że wskaźnik ma
wartość w pamięci, to
tylko adres. A co, jeśli
chcesz wyświetlić wartość wskaźnika, która jest reprezentowana
przez szesnastkową liczbę całkowitą i adres?
Cóż, możesz użyć specyfikatora formatu procent p. Rozmawialiśmy o tym wcześniej.
Spowoduje to wyświetlenie wartości wskaźnika jako adresu pamięci w postaci szesnastkowej.
Więc jeśli mielibyśmy zrobić coś takiego,
w którym deklarujemy naszą
liczbę, deklarujemy nasz wskaźnik, inicjalizujemy go na null, ponieważ jest to dobra praktyka, którą zawsze chcemy
robić za każdym razem, gdy nie przypisujesz czegoś w deklaracji do wskaźnika, pewnie zainicjowałeś
go na null.
Następnie przypisujemy naszą zmienną liczbową 10.
A następnie przypisujemy nasz wskaźnik do adresu liczby.
Więc wartość liczby p będzie w rzeczywistości adresem.
adres. Więc gdybyśmy spróbowali go wydrukować, użylibyśmy procenta p i byłaby to wartość adresu.
Gdybyśmy chcieli wydrukować to, na co wskazuje, musielibyśmy usunąć
odniesienie do niego za pomocą operatora pośredniego.
Ale kiedy drukujesz adres, wypisuje go w postaci szesnastkowej,
a wskaźniki zajmują 8 bajtów w pamięci,
a adresy mają 16
cyfr szesnastkowych. Jak to działa?
Zależy to od tego, czy twój komputer obsługuje adresy 64-bitowe czy 32-bitowe.
Jeśli twój komputer ma 64-bitowy system
operacyjny, zobaczysz 16 cyfr szesnastkowych.
Jeśli twój komputer lub system operacyjny ma
tylko 32-bitowe adresowanie, zobaczysz szesnastkowy reprezentowany jako 8 cyfr szesnastkowych.
A co, jeśli chcesz wyświetlić adres.
Możesz powiedzieć, jaka jest różnica, ponieważ wskaźnik ma wartość.
Ale możesz także wyświetlić adres z adresem operatora.
W tym przykładzie chcemy wyświetlić adres numeru.
Liczba nie jest wskaźnikiem. Liczba to po prostu liczba całkowita.
Jeśli chcemy uzyskać jego adres, używamy znaku ampersand.
Jeśli chcemy wyświetlić ten adres, po prostu ponownie użyj procenta p.
Po prostu zastosuj znak „&”.
Więc jeśli podamy ampersand ze zmienną wskaźnika, w rzeczywistości
wyświetlimy adres tego wskaźnika, a
nie wartość punktu. Pamiętaj, że adres wskaźnika to jakiś adres w pamięci.
Wartość wskaźnika to adres, na który wskazuje.
A wartość, na którą wskazuje, jest gdzieś w pamięci.
Zapamiętaj więc tę ilustrację,
na której pokazaliśmy, jak działają wskaźniki.
Wskaźnik, kiedy go deklarujesz, tworzy pamięć dla tego wskaźnika,
8 bajtów.
Wartością tego wskaźnika jest adres.
A potem cokolwiek wskazuje
ten wskaźnik, jest wartością, zwykle typu, który podałeś.
Ale pamiętaj, że tak naprawdę są trzy części.
Jeśli chcesz wydrukować adres liczb p, ponownie użyjesz znaku ampersand.
Byłby to adres rzeczywistego wskaźnika.
I musiałbyś użyć pustej gwiazdy, aby ominąć ostrzeżenie.
Pamiętaj więc, że sam wskaźnik ma adres, tak jak każda inna zmienna,
jest on przydzielany, gdy go deklarujesz.
Używasz procenta p jako specyfikatora konwersji do wyświetlania adresów.
Używasz znaku ampers i adresu operatora, aby odwołać się do adresu
zajmowanego przez zmienną liczbową p.
To jest adres wskaźnika. Z drugiej strony wskaźnik
ma wartość adresu.
Rzutowanie void ma na celu zapobieżenie ostrzeżeniu ze strony
kompilatora, w szczególności specyfikacja percent p oczekuje, że wartość będzie pewnego rodzaju wskaźnikiem.
Ale typ ampersandu jest wskaźnikiem do jego wskaźnika.
Więc musisz to rzucić.
Wyświetlanie liczby bajtów używanych przez wskaźnik.
Inny sposób na uzyskanie informacji o wskaźniku.
Tutaj możesz użyć operatora sizeof. Dowiedzieliśmy się o operatorze sizeof
do wyświetlania bajtów różnych typów danych. Możesz zrobić to samo ze wskaźnikiem.
Na komputerze, na którym pracuję, zajmie to 8 bajtów.
Adres maszyny ma 64 bity, ponieważ
jest to 64-bitowy system operacyjny.
I możesz otrzymać ostrzeżenie kompilatora, gdy używasz sizeof w ten sposób, sizet
jest typem całkowitym zdefiniowanym w implementacji.
Aby zapobiec ostrzeżeniu, możesz rzutować argument na typ int, taki jak ten.
Więc co byś zrobił, to powiedziałbyś rozmiar liczby p, procent d bajtów.
I powiesz int, rzuć to na calowy rozmiar liczby p.
To da ci rozmiar wskaźnika w pamięci, rozmiar wskaźnika tego adresu,
który znowu wynosi osiem bajtów w większości systemów.
Ponieważ zawiera tylko adres.
Tutaj kolejny przykład. Spowoduje to wyświetlenie wielu rzeczy.
Uruchomimy ten przykład, aby pokazać dane wyjściowe.
Ale zanim to uruchomimy, chcę trochę opisać, co się tutaj dzieje. Mamy zadeklarowaną liczbę.
Mamy wskaźnik, który zainicjował wartość null.
Ustawiamy wartość liczby na 10.
A potem chcemy wypisać adres
liczby całkowitej i chcemy wydrukować wartość liczby, bardzo prosto,
używając adresu operatora, a następnie tylko zmiennej.
Kiedy robimy adres operatora, robimy procenty p.
Następnie przypiszemy adres liczby do naszego wskaźnika.
Następnie wydrukujemy informacje o wskaźniku.
Chcemy wypisać adres samego wskaźnika.
Możemy po prostu użyć liczby p, void star ampersand.
Chcemy zobaczyć, ile bajtów ma ten wskaźnik w pamięci. Możemy powiedzieć sizeof.
Chcemy zobaczyć rzeczywistą wartość wskaźnika, którym
jest adres. Możemy po prostu powiedzieć liczbę p
bez żadnych dodatkowych informacji, a następnie użyć procentów p.
Jeśli chcemy zobaczyć wartość, na
którą wskazuje wskaźnik, wartość pod adresem, a
następnie wykonujemy liczbę p, używamy operatora pośredniego.
Wiemy, że liczba p wskazuje in, więc możemy powiedzieć procent d.
Przyjrzyjmy się więc temu przykładowi w blokach kodu, aby zobaczyć, jak faktycznie jest wyświetlany.
To, co zobaczymy, to liczby szesnastkowe
dla adresów za każdym razem, gdy wyświetlamy adresy, a zobaczymy wartości w innych przypadkach.
Więc to powinno wyglądać znajomo. To tylko program,
który pokazuje, jak uzyskać dostęp do różnych części wskaźnika.
Więc znowu mamy zwykły typ danych liczbowych int i mamy
nasz wskaźnik. Inicjalizujemy go na null.
Najpierw wyświetlimy naszą liczbę, czyli 10. Więc to wyświetli adres liczby,
a następnie wyświetli wartość liczby w liniach 10 i 11.
Następnie przypiszemy naszemu wskaźnikowi adres liczby.
Jeśli chcemy zobaczyć rzeczywisty adres naszego wskaźnika, po prostu używamy znaku ampersand, adresu
operatora, i rzucamy go na void star.
Używamy procentów p.
Jeśli chcemy zobaczyć, ile bajtów znajduje się wskaźnik w pamięci, robimy procent d sizeof.
Jeśli chcemy zobaczyć adres wartość orzeszka ziemnego wskaźnika, robimy procent p i mówimy
po prostu liczbę p, ponieważ liczba p jest adresem.
Jeśli chcemy zobaczyć, na co wskazuje wskaźnik, z wartością
adresu znajdującego się w wartości wskaźnika, po prostu mówimy
gwiazdką numer p, usuwamy go, operator pośredni.
Więc uruchommy to.
Kiedy to uruchomię, zobaczysz pierwsze dwie rzeczy, które
zostaną wydrukowane, adres liczbowy w
linii szóstej, a to jest jakaś liczba szesnastkowa, 0060ff0c.
W rzeczywistości działa to program 32-bitowy, więc widzisz, że ma tylko 8
bitów.
zmienna liczbowa, która wynosi 10.
Następnie drukujemy adres rzeczywistego wskaźnika do przydzielonej pamięci.
To inny adres niż numer.
Ponieważ jest to adres przydzielony wskaźnikowi.
Rozmiar numeru wskaźnika wynosi 4 bajty, co
oznacza, że jest to adresowanie 32-bitowe.
Wartość wskaźnika, czyli adres
liczby, powinna być taka sama i wynosi 0060ff0c.
Widzisz, że w rzeczywistości możesz uzyskać adres
numeryczny, używając po prostu nazwy, wskaźnika z procentem p.
Widzieliśmy rozmiar operatora 4 bajty.
Jeśli chcesz uzyskać wartość, na którą wskazuje liczba p, która wynosi
10, musisz usunąć odniesienie do niej za pomocą operatora pośredniego i zobaczysz, że jest wypisywana 10.
Ale widzisz, że używasz procenta p, gdy
wyświetlasz adresy, używaj procenta e, gdy wyświetlasz wartości wskaźnika całkowitego
lub liczbę bajtów.
To jest podstawowa składnia dostępu do wartości wskaźnika.
Adres wskaźnika, ampersand, wartość, na
którą wskazuje punkt, tylko nazwa zmiennej
i wartość samego wskaźnika to tylko nazwa zmiennej, a następnie
wartość, którą wskazuje wskaźnik, aby użyć operatora pośredniego.
Dziękuję Ci. Mam nadzieję że to pomoże. Przestudiuj to, przejrzyj to.