Witam i witam ponownie. W tym wykładzie chcę zademonstrować
nasze poprzednie wyzwanie, którym było
zrozumienie przekazywania przez odniesienie,
w którym parametr wewnątrz funkcji przyjmuje wskaźnik.
Stwórzmy więc nowy projekt. Nazywamy to jednym przejściem
wskaźnika przez referencję, ponieważ to właśnie demonstruje, podstawowe
rzeczy tutaj, nowy projekt, aplikacja
konsolowa c. Całkiem proste tutaj.
Nazwijmy ten wskaźnik podkreśleniem przejście
przez odniesienie.
Ponownie, pokazując, jak możemy używać parametrów wewnątrz funkcji do przekazywania
danych i jak te dane zostaną następnie
zmodyfikowane poza funkcją.
Więc pierwszą rzeczą, którą zamierzamy zrobić, jest utworzenie naszej deklaracji funkcji,
naszego prototypu funkcji. Jest to zawsze przyjemne,
ponieważ możesz wywoływać w dowolnym miejscu programu. Po prostu nazwiemy to kwadratem.
Najważniejsze w tej deklaracji funkcji jest to, że pobierze wskaźnik.
Więc to po prostu zajmie wskaźnik końcowy, więc powiemy int
star, a następnie możesz nadać jej dowolną nazwę i zakończyć ją średnikiem.
A naszą główną funkcją,
którą najpierw zrobimy, jest po prostu utworzenie zwykłej zmiennej całkowitej
i powiemy po prostu int num i po prostu zakodujemy ją na 9.
A my zamierzamy nazwać naszą funkcję kwadratową.
Nasza funkcja square nie zwróci żadnych danych, będzie nieważna.
Musimy teraz przekazać mu adres, ponieważ nasza funkcja kwadratowa w linii 4 pobiera wskaźnik.
Więc nie możemy przekazać num, musielibyśmy faktycznie podać adres num,
a następnie zakończylibyśmy go średnikiem. Dlatego wywołujemy funkcję,
używając nazwy funkcji, a następnie przekazując adres zmiennej.
Ponieważ zmienna w linii ósmej nie jest wskaźnikiem.
Wtedy możemy po prostu wydrukować wartość num.
I znowu, zauważysz tutaj, ponieważ przekazujemy adres,
jeśli zmienimy dane w samej funkcji dla tej zmiennej,
zmieni się poza nią. Więc tutaj powiemy, że
kwadrat podanej liczby to i to po prostu powiedzmy procent
d, dodamy nowy wiersz i
po prostu wypisujemy num, a num nie będzie
równy 9. , Tyle ci powiem.
A potem zwrócimy 0 dla naszej zwykłej funkcji.
Więc teraz musimy faktycznie zaimplementować funkcję, zdefiniować ją.
Aby to zdefiniować, powiem tylko pusty kwadrat.
Wiemy, że wymaga wskaźnika liczby całkowitej, więc powiem int star x.
A teraz chcemy to po prostu pomnożyć przez siebie.
Chcemy jednak mieć pewność, że nie zmienimy adresu.
Moglibyśmy więc uczynić to stałą, ale chcielibyśmy umieścić stałą
po typie danych, ponieważ nie
chcemy zmieniać wartości tego, czym jest x,
ani adresu tego, na co wskazuje, więc możemy powiedzieć, że int stała.
Gdybyśmy nie chcieli zmieniać wartości
x, powiedzielibyśmy, że stała. Ale chcemy zmienić wartość x, zamierzamy ją sama podnieść do kwadratu.
Aby więc wyrównać to samo, po pierwsze, chcemy
zmienić ostateczną wartość x. Musimy więc użyć
operatora pośredniego. Musimy usunąć odniesienie do niego gwiazdką.
A potem powiemy równa się, nie chcemy robić
x razy x, ponieważ to po prostu pomnoży adresy. X jest wskaźnikiem, nie chcemy po prostu
uzyskać wartości x, chcemy uzyskać wartość tego, na co wskazuje x.
Więc znowu musimy usunąć odniesienie do tego,
a następnie pomnożymy go przez siebie. Zamierzamy usunąć to dwukrotnie.
Dobrym pomysłem może być umieszczenie
tego w nawiasach, aby łatwo było zrozumieć, co się tutaj dzieje.
Odwołujesz się do wskaźnika, uzyskujesz jego wartość, a następnie mnożesz
przez jego wartość, a następnie po prostu dodajesz średnik i
to wszystko, co musisz zrobić. Więc kiedy uruchomimy ten program, wypisze
on 81.
Wypisze wartość num. Num zmieni się wewnątrz kwadratu,
ponieważ podajemy tam adres.
Nie jesteśmy w stanie zmienić wartości wskaźnika,
więc po typie mamy stałą.
Więc tutaj mówimy build i wygląda na
to, że nie zmieniliśmy deklaracji.
A teraz chcemy się tylko upewnić, że
wszystko inne jest poprawne.
Jeśli chcesz, aby wskaźnik był stały,
musisz umieścić go po gwiazdce.
Zatem stała int
start oznacza, że nie możesz zmienić
wartości x, czyli adresu num.
Jeśli umieścimy const przed int
lub po wejściu przed gwiazdką, oznacza to,
że nie możesz zmienić wartości tego, na co wskazuje wskaźnik.
Więc teraz, kiedy to uruchomimy, powinniśmy zobaczyć wynik 81.
To znowu
mówi nam, że zmodyfikowaliśmy
dane. Ta zmienna,
ta lokalna zmienna num została zmodyfikowana wewnątrz funkcji i jej wartość została zmieniona.
To nie jest normalne. Do tej pory nie nauczyliśmy się tej koncepcji. To przekazane przez odniesienie.
Ale w c to, co się dzieje, to przekazanie kopii adresu.
Dlatego jest to naprawdę zbędne, nie potrzebujemy nawet stałej, ponieważ nawet
gdybyśmy mieli zmienić wartość wskaźnika, jest to
kopia wartości wskaźnika, więc tak naprawdę nie musisz tego robić.
Teraz, gdybyśmy nie chcieli używać istniejącej liczby, moglibyśmy utworzyć wskaźnik, musimy
po prostu przydzielić do niego pamięć.
Musielibyśmy więc stworzyć int star num.
Ale najpierw musielibyśmy rzucić malloc, ponieważ malloc
wraca ze wskaźnikiem void,
ale możemy przydzielać pamięć dynamicznie.
Tutaj musielibyśmy powiedzieć, że tak naprawdę
tylko dlatego, że tworzymy jedną liczbę całkowitą, moglibyśmy po prostu powiedzieć
rozmiar int, a to przydzieliłoby nam pamięć.
A potem wszystko, co musielibyśmy zrobić, to przejść do kwadratu num.
A potem,
kiedy to zbudujemy, zrobiłoby to samo,
ale teraz nie ma też wartości
num, więc tak naprawdę
nie wiedziałbym, co obliczyć, więc musiałbyś faktycznie
przypisać wartość num powiemy tutaj cztery,
usuniesz odniesienie do tego. A teraz, kiedy go zbudujesz i
uruchomisz, powinieneś otrzymać 16.
Teraz jedyną rzeczą tutaj jest to, że chcemy wydrukować wartość, więc chcemy powiedzieć num.
A kiedy go uruchomimy, powinniśmy zobaczyć 16.
To naprawdę ten sam typ zachowania
i widzimy 16.
Jedyną różnicą było to, że alokowaliśmy pamięć na
to, na co wskazuje punkt, a nie tylko na wskazanie istniejącej lokalizacji
pamięci za pomocą znaku &.
Ponownie, ważne rzeczy, na które należy zwrócić uwagę, liczba ta zmienia
się poza funkcją. Jest to
przekazywane przez zrozumienie odniesienia. Tam, gdzie używamy operatora usuwania odniesienia,
operatora pośredniego, aby uzyskać wartość tego, na co wskazuje punkt.
Zrozum, że jeśli funkcja przyjmuje wskaźnik, a my mamy
wskaźnik, możemy po prostu wysłać nazwę.
Jeśli nie pobiera wskaźnika
i jest to w rzeczywistości wartość,
musimy ją usunąć. I to jest zupełnie jak scanf.
Więc tutaj musielibyśmy powiedzieć ampersand.
A potem również, kiedy to drukujemy, nie
musielibyśmy niczego usuwać, ponieważ to nie jest wskaźnik, a
wtedy byłoby to samo tutaj.
A potem zrozum, const dwa. Const przed gwiazdą int mówi,
że wartość wskazywana przez punkt nie może się zmienić.
Stała po początku int mówi, że adres wskaźnika nie może zmienić wartości wskaźnika.
Mam nadzieję, że to było pomocne.
Ponownie, pobaw się tym, zmień trochę składni, pomieszaj tak jak ja.
Pomoże ci wiele się nauczyć. Dziękuję Ci.