Witam i witam ponownie. Ostatnią rzeczą, o której chcę
porozmawiać w odniesieniu do struktur, jest ich związek z funkcjami,
jak można przekazywać struktury jako argument do parametru i funkcji oraz jak
jest to bardziej wydajne.
Więc struktury jako argumenty funkcji.
Po zadeklarowaniu struktury o
nazwie Family. W tym przykładzie utworzymy nazwaną
rodzinę, w jaki sposób przekażemy tę strukturę jako argument do funkcji.
Mamy więc tę strukturę zwaną Rodziną.
Mamy tu kilka tablic znaków w
imieniu, ojcu i matce, a potem mamy int wiek.
To jest nasza definicja struktury.
Wiemy, że jest to struktura, ponieważ po słowie kluczowym struct następuje nazwa tagu,
mamy nawiasy klamrowe i tak dalej.
Jak właściwie przekazać tę strukturę do
funkcji zwanej rodzeństwem?
Cóż, zrobiłbyś to tak, jak deklarujesz strukturę,
powiedziałbyś typ jako nazwę parametru.
To naprawdę proste. W tym przypadku mamy rodzeństwo Boolean.
Rodzeństwo zwraca wartość logiczną.
I wymaga dwóch parametrów, dwóch parametrów struktury.
Musisz zidentyfikować typ struktury, który jest rodziną struktur typu.
Teraz, w bardziej zaawansowanym c, możesz
faktycznie wykonać typedf na tej strukturze i nazwać ją inaczej, a także
skrócić nazwę tutaj, ale nie rozmawialiśmy o typach.
To prawdopodobnie byłoby lepsze.
Ale tak naprawdę powinieneś to zrobić. Musiałbyś zdefiniować cały typ, czyli
rodzinę struktur, a następnie nazwę zmiennej, tak jak każdy inny parametr.
Więc tutaj przekazujemy dwa parametry, element pierwszy i element drugi.
Obie należą do rodziny struktur typu.
Następnie wewnątrz naszej funkcji, jeśli chcemy uzyskać dostęp do członków, uzyskujemy dostęp
do członków tak jak zwykle.
Składnik pierwszy i element drugi nie są wskaźnikami, więc nie używamy myślnika wtedy większego niż, robimy
to tylko na wskaźnikach, ponieważ musimy je usunąć, aby zobaczyć, na co wskazują.
Ponieważ nie są wskazówkami, możemy po prostu zrobić kropkę. Więc członek - matka jedna kropka, członek - matka dwie kropki.
Matka z jedną kropką i matka z
dwiema kropkami to tablice znaków, a tablice znaków są zasadniczo wskaźnikami.
Możemy więc przekazać je do porównania str. Porównanie funkcji zwróci równe, jeśli są takie same. Więc
to, co tutaj robimy, to sprawdzanie, czy jedna matka
i członka druga matka są takie same. A jeśli tak, zwrócimy prawdę.
Bo jeśli oboje mają to samo imię
i tak naprawdę byłoby to nazwisko, to są rodzeństwem.
Całkiem proste.
Łatwe przekazywanie argumentów do
funkcji, o ile deklaracja funkcji zawiera strukturę tego typu.
Więc ta funkcja, znowu, dwa parametry, z których każdy jest strukturą
rodziny typów.
A co jeśli chcemy mieć wskaźniki do struktur jako argumenty funkcji.
Wspomniałem wcześniej, że lepiej to zrobić, ponieważ przechodzimy
przez wartość ic.
Kiedy przekazujesz wartość, kopiujesz.
Jeśli masz strukturę, która zawiera dużo danych,
wiele dużych struktur jako argumenty,
musisz skopiować wszystko w tej strukturze
do rzeczywistej funkcji.
Kopiowanie tych dużych struktur
może zająć trochę czasu.
Cóż, jeśli masz wskaźnik, wszystko, co musisz zrobić, to skopiować
adres, co jest znacznie szybsze. Dlatego wskaźniki do
struktur są używane jako parametry i funkcje, aby uniknąć
zużycia pamięci i czasu potrzebnego na skopiowanie wszystkich struktur.
Teraz, jeśli masz małą strukturę, nic wielkiego,
ale zdecydowanie chcesz użyć wskaźników i struktur, które są duże.
Więc w tym przypadku, co robisz, nadal określasz nazwy typów struktur,
po prostu wstawiasz wcześniej gwiazdkę,
bardzo proste. A jeśli nie
chcesz, aby jakiekolwiek dane wewnątrz struktury uległy zmianie, możesz użyć stałej przed typem struktury.
Jeśli nie chcesz, aby adres się zmienił, umieściłbyś stałą po wskaźniku rodziny struct.
Ale tutaj robimy to samo. Ale teraz mamy zamiar uzyskać
do niego dostęp w inny sposób, ponieważ teraz, gdy jest to wskaźnik, możemy użyć
myślnika większego niż, aby uzyskać dostęp do tego nowego symbolu, zamiast używać kropki.
Nie musimy tutaj używać kropki. Ponieważ pamiętaj,
wskaźniki, które musisz najpierw usunąć z referencji, więc musisz umieścić je w
nawiasach, bardziej składnia jest usunięcie wskaźnika, niż musisz umieścić kropkę poza nawiasem, ponieważ
ma wyższy priorytet, dużo łatwiejsze w użyciu myślnika niż większe niż.
Dash i większe niż matka, myślnik
i większe niż matka są obydwoma wskazówkami, można je przekazać w porównaniu str.
Jeśli są takie same, zwróć true. W przeciwnym razie zwróć false, całkiem proste.
Możesz także użyć modyfikatora const, jak wspomniałem,
jeśli nie chcesz zezwalać na jakąkolwiek modyfikację członków struktury.
Na co wskazuje struktura, umieszczasz stałą przed wskaźnikiem.
Możesz również umieścić const przed rodziną.
W tym przypadku rodzina ma krój pisma.
Więc tutaj
byłby to naprawdę wskaźnik const rodziny lub struktury rodziny.
A potem ponownie uzyskaj dostęp w ten sam sposób, niczego nie modyfikujesz. Więc jesteś gotowy.
Kompilator nie będzie narzekał.
Możesz także użyć stałego modyfikatora, jeśli nie chcesz pozwolić na
jakąkolwiek modyfikację samego adresu.
Każda próba zmiany tych struktur spowoduje wyświetlenie komunikatu o błędzie podczas kompilacji.
Więc tutaj powiedziałbyś
gwiazdę rodzinną i po gwiazdce umieściłbyś stałą.
A to mówi, że nie możesz
zmienić wartości elementu p, wartości wskaźnika, który jest adresem.
Ale znowu, nie jest to zbyt
przydatne, ponieważ przekazując wartość, w rzeczywistości przekazujesz kopię adresu.
Więc to jest zbędne, nie musisz tego robić, ale możesz.
I tutaj znowu chcesz mieć możliwość zmiany adresu członka p.
W tym przypadku i tak uzyskujesz dostęp do danych, aby sprawdzić, czy są równe.
Operator pośredni w każdej definicji parametru znajduje się teraz
przed słowem kluczowym constant.
Ta gwiazdka nie znajduje się przed nazwą parametru.
Nie możesz zmodyfikować adresu przechowywanego we wskaźnikach, ponieważ znajduje się on po gwiazdce.
Jeśli znajdował się przed typem nazwy parametru,
chcesz mieć możliwość zmodyfikowania rzeczywistego tego, na co wskazuje.
Gdybyśmy mieli ten operator pośredni przed nazwą parametru, co by to było w
stałej przed nim, oznaczałoby to, że
chcesz mieć możliwość zmodyfikowania tego, na co wskazuje. To tylko podanie adresu.
Nie możesz więc modyfikować adresu przechowywanego we wskaźnikach.
Chronione są tutaj wskaźniki, a nie struktury, na które
one wskazują, podobnie jak stałe i inne parametry wskaźnika, bez różnicy w przypadku struktur.
Jeśli chcesz zwrócić strukturę z funkcji będącej wskaźnikiem,
prototyp funkcji musi wskazać tę zwracaną wartość w normalny
sposób w deklaracji.
Więc tutaj musisz powiedzieć, że trafiłem na randkę
z moim zabawnym wskaźnikiem
lub nie, to nie ma znaczenia. To jest prototyp funkcji nie pobierającej argumentów, która zwraca
strukturę typu date, bardzo łatwo jest zwrócić strukturę z funkcji. Jaka jest tego wartość.
Cóż, teraz możemy zwrócić z
funkcji więcej niż jeden element lub jeden element danych.
Jeśli zwracasz strukturę, możesz zwrócić 10 wartości, 10 różnych elementów danych.
Jakie to jest świetne. Struktura umożliwia zwrócenie więcej niż jednej funkcji.
Bardzo, bardzo cenne.
Dlatego często wygodniej jest zwrócić wskaźnik do struktury, a nie tylko do samej struktury.
Kiedy zwracasz wskaźnik do struktury, jest on tworzony na stercie, ponieważ
wszystkie wskaźniki są tworzone na stercie.
Oznacza to, że potrwa trochę dłużej.
A to oznacza, że możesz go usunąć i zarządzać nim w dowolnym momencie.
W tym przykładzie tworzymy strukturę o nazwie fundusze.
Zawiera tablicę znaków
o nazwie bank, zawiera podwójny, inny zapisany
znak o określonej długości. Założono, że długość zabawy wynosi 50.
A potem ma podwójny zapis.
Mamy funkcję o nazwie sum, która przyjmuje tę strukturę jako parametr.
I wszystko, co robimy, to w środku, czyli
zwracamy - fundusz bankowy z pierwszej struktury plus fundusz oszczędzania, a
to zwróci kwotę, którą mają w swoim banku.
W tym przykładzie suma jest po prostu podwójna.
Nie zwracamy wskaźnika. Po prostu bierzemy wskaźnik jako parametr.
Dlatego w naszej głównej funkcji tworzymy zmienną strukturalną o
nazwie stan fundusze strukturalne typu.
Inicjalizujemy go pewnymi wartościami, a następnie wypisujemy
sumę wywołań. Po prostu przekazujemy tę strukturę, tak jak każdą zmienną.
Nie musimy usuwać odniesienia, to nie jest wskaźnik. Nie musimy naprawdę robić nic specjalnego.
Po prostu upewniamy się, że w deklaracji funkcji mamy tam ten typ struktury,
ale wszystko inne wygląda normalnie.
Kilka przypomnień.
Wspomniałem wcześniej, że podczas przekazywania struktur do funkcji należy zawsze używać wskaźników.
Dlaczego? Pamiętaj, że starsze wersje c
nie pozwalają
na przekazywanie struktur, ale pozwalają na użycie wskaźników.
Możesz więc uniknąć wszelkiego rodzaju wstecznej kompatybilności.
Jeśli używasz starszej wersji c, Twój program będzie działał.
Tak więc samo przekazanie tego pojedynczego adresu
jest również bardziej wydajne z powodu kopiowania czasu.
Ale jeśli to zrobisz, jeśli przekażesz parametr, który jest wskaźnikiem
do struktury wewnątrz funkcji, będzie to mniej chronione dla twoich danych.
Dlatego niektóre operacje w wywołanej funkcji mogą nieumyślnie wpłynąć na dane
w oryginalnej strukturze.
I w tym miejscu chcesz użyć kwalifikatora const.
Używałbyś const przed rzeczywistym typem, a
nie po gwiazdce i przed nazwą
parametru, przed typem.
Zaletą przekazywania struktur są argumenty, funkcja
działa z kopiami oryginalnych danych.
Jest to bezpieczniejsze niż praca z oryginalnymi danymi.
Więc to naprawdę jedyny przypadek, w którym chcesz przekazać strukturę jako argument, który nie jest wskaźnikiem.
Styl programowania wydaje się być nieco jaśniejszy.
Głównymi wadami przekazywania struktur jako argumentów w przeciwieństwie do przekazywania strukturalnego
wskaźnika jako argumentu jest to, że
starsze implementacje mogą nie obsługiwać kodu, marnuje
czas i miejsce, a jest
to szczególnie marnotrawne, gdy masz duże struktury, musimy dużo kopiować
dla każdego członek. Więc miej to na uwadze.
W większości przypadków chcesz przekazywać
wskaźniki do struktur, znacznie wydajniej i oszczędzając czas.
Programiści używają wskaźników struktury jako argumentów funkcji ze względu na wydajność i używają
stałych, gdy jest to konieczne. I to jest kombinacja, którą chcesz zrobić.
Jeśli martwisz się o ochronę, po prostu użyj wskaźnika
funkcji dla wydajności, a następnie
użyj const const, aby nic nie zostało zepsute
wewnątrz funkcji, tak jak naprawdę normalne wskaźniki
mniej więcej, ale ze wskaźnikami jest to jeszcze ważniejsze w przypadku
wydajności, ponieważ dużych konstrukcji.
Przekazywanie struktur według wartości jest najczęściej wykonywane dla struktur, które są małe, i
są to zasady, o których warto pomyśleć.
Dobrze, aby przekazać strukturę, która nie jest wskaźnikiem, o ile jest mała.
Ponownie, kilka ważnych pojęć związanych ze strukturami
i przekazywaniem wskaźników jako parametrów, argumentów
i zwracanych wskaźników. Teraz możemy faktycznie zacząć wdrażać część
z tego. Podajemy wiele przykładów. Rozumiemy pojęcia. Rozumiemy składnię.
Teraz chcę wam przedstawić kilka wyzwań, które sprawiają, że faktycznie to robicie, czy zapamiętaliście
w składni, że teraz, jeśli kiedykolwiek zechcecie stworzyć strukturę w programie, umiecie to
zrobić tak, jak własną ręką.
Będziemy więc mieli kilka wyzwań podczas naszych następnych
kilku wykładów, aby zapoznać Cię z wszystkimi rzeczami, o których rozmawialiśmy, dotyczącymi struktur.
Dziękuję Ci.