‫Cześć i witaj.
‫Na tym wykładzie nauczymy się o referencjach i alternatywach dla wskaźników, a także zobaczymy, dlaczego są
‫różne, dlaczego możemy chcieć ich używać.
‫Zanurzmy się i zobaczmy.
‫Tak więc, oprócz wskaźników, istnieje bardzo podobna, powiązana koncepcja, nazywana referencją.
‫Teraz zarówno wskaźniki, jak i referencje są w zasadzie tylko adresem pamięci.
‫Oba przechowują odniesienie do miejsca, w którym można znaleźć inną zmienną, i w ten sposób są niewiarygodnie
‫podobne.
‫Różnica między nimi sprowadza się zasadniczo do tego, czy można je ponownie przypisać.
‫Zasadniczo, czy mogą wskazywać inny adres po utworzeniu?
‫W przypadku wskaźnika odpowiedź brzmi tak.
‫Możesz zmienić wskaźnik, aby wskazywał na nowy adres pamięci, nowego aktora, nowy komponent, kiedy tylko chcesz,
‫o ile ma właściwy typ.
‫Z drugiej strony odwołanie można ustawić tylko raz, kiedy tworzysz je po raz pierwszy, aby wskazywało na inną
‫zmienną.
‫Nie można go wtedy ponownie zmienić.
‫Jest to funkcja bezpieczeństwa, ponieważ ponowne wskazywanie zmiennych może prowadzić do problemów, w których
‫te zmienne mogą zniknąć lub gdy ustawisz wskaźnik na null.
‫Pusty wskaźnik jest zasadniczo wskaźnikiem, który nie wskazuje nic, a próba zrobienia rzeczy z punktami, które są ustawione
‫na nic, może w rzeczywistości spowodować awarię silnika, co nie jest idealnym wynikiem z odwołaniami, ponieważ musisz nadać im
‫wartość podczas pierwszego tworzenia ich.
‫Nie mogą mieć wartości null, więc nie można uzyskać awarii wskaźnika zerowego.
‫Więc zacznijmy przyglądać się składni.
‫Więc kiedy uzyskujesz dostęp do treści za pomocą wskaźnika, musisz użyć specjalnej składni.
‫Musisz umieścić tę gwiazdkę przed wskaźnikiem, aby upewnić się, że otrzymujesz wartość we wskaźniku,
‫a nie adres pamięci z referencjami, ponieważ tak naprawdę nigdy nie musisz uzyskać adresu pamięci.
‫Możesz po prostu użyć zmiennej tak, jakby była zmienną, na którą wskazuje.
‫Nie musisz używać żadnej specjalnej składni.
‫Teraz jest dostęp do adresu, więc za pomocą wskaźników uzyskujesz adres automatycznie.
‫Kiedy używasz zmiennej z referencją, musisz użyć specjalnej składni.
‫Aby to zrobić, musisz użyć adresu operatora, a uzyskasz w zasadzie ten sam
‫adres, co oryginalna zmienna.
‫A potem zmiana adresu za pomocą wskaźnika.
‫Widzieliśmy, że możesz przypisać adres i użyć adresu operacji, aby zrobić to z referencjami.
‫Nie jest to dozwolone, więc nie ma na to składni.
‫I na koniec, co jeśli chcemy zmienić wartość, na którą wskazujemy, nie adres, ale rzeczywistą
‫wartość przechowywaną pod tym adresem?
‫Cóż, ze wskaźnikami musisz ponownie użyć specjalnej składni.
‫Musisz umieścić tę gwiazdę, a potem coś przypisać.
‫Tak więc wskaźnik aktora, który przypisujesz do wskaźnika aktora gwiazdy z referencjami, ponownie, ponieważ nie możesz zmienić
‫faktycznego adresu, nie potrzebujesz żadnej dodatkowej składni.
‫Możemy porzucić dodatkową składnię i po prostu mieć odwołanie do aktora równe.
‫Aktor oznacza, że nadpisujesz wartość we wskazanej lokalizacji.
‫Więc to wszystko jest trochę teoretyczne.
‫Miejmy rzeczywisty przykład.
‫Więc gdybyśmy mieli pływak, który być może przechowywał obrażenia wyrządzone nam w grze, a my przechowujemy, bieżące obrażenia
‫są ustawione na zero.
‫Nikt nas nie skrzywdził.
‫Teraz możemy chcieć utworzyć odwołanie do tego, zamiast kopiować, możemy chcieć przekazać to
‫do funkcji, ale bez faktycznej zmiany.
‫Sposób, w jaki możemy to zrobić, to mieć pływak, a następnie umieścić znak ampersand za pływakiem.
‫Znak & mówi, że jest to odniesienie do pływaka.
‫Sam w sobie nie jest nowym floatem, nie przydziela żadnej pamięci float.
‫Po prostu przydziela pamięć wskaźnika.
‫A więc możemy to nazwać uszkodzonym ref i możemy ustawić to jako uszkodzenie.
‫Nie musimy podawać adresu ani robić niczego takiego.
‫Automatycznie wie, cóż, to jest odwołanie, a to jest zmienna.
‫Więc to, co próbujesz tutaj zrobić, to ustawić referencję do tej zmiennej.
‫I rzeczywiście, jeśli pójdziemy i zarejestrujemy, możemy wydrukować to tak, jakby to była zwykła
‫liczba zmiennoprzecinkowa, więc możemy powiedzieć uszkodzenie dwukropka, a następnie procent F, a następnie możemy zrobić tylko uszkodzenie wydruku.
‫Ref Nie potrzebujemy specjalnej składni.
‫Możemy go używać jak zwykłej zmiennej.
‫Przejdźmy dalej i po kompilacji wciśnijmy play, spójrzmy na nasz dziennik wyjściowy i rzeczywiście,
‫obrażenia wychodzą na zero, co było wartością, którą ustaliliśmy.
‫Ale to niekoniecznie dowodzi, że nie zrobiłem kopii tej oryginalnej zmiennej, więc chciałbym rzucić wyzwanie,
‫abyś spróbował zmienić wartość i zobaczyć, co się stanie.
‫Więc użyj odniesienia, odniesienia do uszkodzenia, aby ustawić nową wartość, a następnie wydrukuj
‫oryginalną wartość, aby pierwotna wartość obok wartości odniesienia i spójrz, czy są takie same, czy różne?
‫Zmieniasz tylko odniesienie, ale czy zmienia to również oryginał?
‫Ponieważ oznaczałoby to, że oba są tą samą zmienną, wstrzymują wideo i próbują.
‫Dobra.
‫Witamy spowrotem.
‫Więc dajmy to dźgnąć.
‫Aby zmienić teraz odniesienie, zrobimy obrażenia ref równe.
‫I tym razem powiem, że zadaliśmy pięć obrażeń i nie musiałem tutaj używać żadnej specjalnej składni.
‫Nie wskazuje na odwołanie, ponieważ już je zadeklarowaliśmy i ustawiliśmy jego odwołanie w pierwszym wierszu,
‫kiedy jest tworzone.
‫Nie możemy tego zrobić ponownie.
‫Więc teraz możemy po prostu ustawiać wartość.
‫Więc co mogę teraz zrobić, to ref uszkodzeń jest tutaj w dzienniku.
‫Załóżmy też, że ta sama struna jest uszkodzona i procent f, a następnie podajmy to również tutaj.
‫A potem skompilujemy i przyjrzymy się.
‫Zagrajmy, wejdźmy do naszego dziennika wyjściowego i na pewno wyświetla obrażenia ref i obrażenia, ponieważ oba
‫mają nową wartość, którą ustawiliśmy na pięć.
‫W skrócie, mamy tutaj dwie zmienne, które wskazują na ten sam fragment pamięci.
‫Można prawie powiedzieć, że wszystkie są tą samą zmienną, ale mają różne nazwy.
‫Ma to tę zaletę, że nie potrzebuje kopii, podobnie jak wskaźnik, ale ma też znacznie więcej zalet, ponieważ
‫jest o wiele łatwiejszy w użyciu.
‫Nie potrzebujemy całej tej dodatkowej składni i jest ona bezpieczniejsza w użyciu.
‫Tak więc, o ile nie musimy niczego przemalowywać, generalnie preferowane jest używanie odwołań.
‫Zróbmy teraz krótki przegląd niektórych symboli, których tutaj używamy, ponieważ mogą być nieco mylące.
‫Są często używane w C++.
‫Więc ampersand i symbole gwiazdy, spójrzmy na nie w kontekście i co one oznaczają.
‫Więc kiedy ich używamy, a więc kiedy używamy ich w wyrażeniu, oto kilka przykładów kodu.
‫Możesz zobaczyć gwiazdę przed zmienną.
‫Możesz zobaczyć znak & przed zmienną.
‫Co to znaczy?
‫Cóż, w przypadku symbolu gwiazdy, składnia umieszczania go przed zmienną oznacza, że teraz otrzymujemy
‫zawartość wskaźnika aktora za pomocą znaku &.
‫Jeśli umieścisz znak & przed zmienną lub przed odwołaniem do zmiennej, oznacza
‫to, że otrzymuje adres tej zmiennej.
‫Pobiera adres aktora lub adres wskazywany przez odwołanie.
‫Teraz, kiedy deklarujemy, że go używamy, kończymy typ zmiennej.
‫Gwiazdy i ampersand mają prawie przeciwne znaczenia.
‫Gwiazdka oznacza więc, że jest to wskaźnik do nowego aktora, a znak & oznacza, że jest to odniesienie do aktora
‫r u.
‫Więc po prostu pamiętaj, że istnieje zupełnie inny zestaw znaczeń, niezależnie
‫od tego, czy używasz ich ze zmienną w wyrażeniu, czy używasz ich w typie deklarującym zmienną.
‫Teraz nie będę się zagłębiał w szczegóły, ale aby dodać zniewagę do kontuzji, mogą one mieć inne
‫znaczenie.
‫W innym kontekście ampersand może oznaczać trochę mądrze, a gwiazda, jak już widzieliśmy, może być
‫używana z łańcuchami w logu U.
‫Więc niekoniecznie są to wszystkie znaczenia tych dwóch symboli, ale są to
‫właściwie wszystkie ważne znaczenia odnoszące się do wskaźników i referencji.
‫Świetna sprawa.
‫Tak więc dowiedzieliśmy się o wskaźnikach, referencjach, o tym, jak są ze sobą powiązane, czym się różnią
‫i dlaczego możemy chcieć ich używać.
‫Do zobaczenia na następnym wykładzie.