Witam i witam ponownie.
Chciałbym przedstawić rozwiązanie dla poprzednie wyzwanie w tym wykładzie.
Pokaz tego, jak ty może mieć wskaźniki jako elementy wewnątrz
struktury, a także pomiń wskaźniki dwie funkcje, które
są strukturami.
Przywołajmy więc kod bloki, utwórz nowy projekt.
To będzie konsola aplikacji i nadamy nazwę
temu przykładowi wskaźników struktury.
A więc jeśli pamiętasz wymagań, był
to w zasadzie tylko typ produktu struktura przechowująca nazwę przedmiotu, ilość,
cenę i kwotę.
A nazwa przedmiotu była w ruchu być wskaźnikiem znaku.
Miałeś mieć plik kwota, która po prostu pomnożyła
ilość w cenie.
A potem mieliśmy dwie funkcje które jako parametry przyjmą
wskaźniki do struktury.
Więc pierwsza rzecz, którą jesteśmy zrobimy
to stworzymy naszą strukturę.
Wspomniałem o tym wcześniej, ale dobrze jest
stworzyć strukturę globalnie, bo jeśli chcesz używać go w wielu funkcjach.
Tworzenie struktury naprawdę to definiuje.
Nie przydzielasz żadnej pamięci.
Więc nie ma nic złego mówiąc globalnie.
I zwykle wchodzą do środka plik nagłówkowy mimo wszystko.
Aby więc stworzyć strukturę, po prostu mówimy struct.
Nazwijmy ten przedmiot i będziemy mieć cztery elementy.
Będziemy mieć charakter wskaźnik, który nazwiemy po prostu
nazwą elementu.
Będziemy mieć ilość.
Będziemy mieć pływak za cenę i będziemy mieć
wartość zmienną dla kwoty.
I tak możemy zdefiniować nasza struktura, całkiem podstawowa.
Teraz, wewnątrz naszej głównej funkcji, my chcesz utworzyć zmienną dla typu struktury, a
także wskaźnik.
Więc pierwsza rzecz, którą chcemy zrobić czy chcemy po prostu powiedzieć element struct z
nazwą struktury i wtedy po prostu nazwiemy ten przedmiot.
I to jest sprawiedliwe tworząc dziwny wskaźnik.
To przydzieli pamięć dla czterech zmiennych i elementów
wewnątrz struktury.
Dlatego chcemy stworzyć nasz wskaźnik teraz i możemy po prostu powiedzieć struct item.
Powiemy element p ponieważ zwykle nazywamy nasze
wskaźniki przedrostkiem p.
Więc mówimy gwiazdkę, i mówimy, że pozycja p.
A potem w następnym wierszu
chcemy po prostu przypisać do naszego elementu wskaźnika, naszego elementu.
Więc musimy użyć adres i mówimy przedmiot.
I tak oto mamy pamięć przeznaczone dla elementów naszej struktury dla
naszego wskaźnika.
Nie mamy żadnej pamięci przydzielony do naszego wskaźnika
znaków, który jest nazwą naszego przedmiotu, więc to byłby następny krok.
Teraz możesz zapytać, dlaczego potrzebujemy aby stworzyć strukturę przedmiotu.
Tak naprawdę nie.
Moglibyśmy po prostu utworzyć wskaźnik i wskaźnik utworzy pamięć tylko dla
tego wskaźnika elementu struktury.
Przydzieli pamięć dla int i floats,
ale nadal musimy dokonać alokacji nazwy elementu.
Po prostu lubię to robić, ponieważ jest to zwykle dobra praktyka.
Zwykle to, co byś zrobił pierwszą strukturą pozycji jest zainicjowanie
jej, a więc ty wymagałoby inicjalizacji.
Ale nie musimy tego robić.
Więc pierwszą rzeczą, którą chcemy zrobić, jest przydziel pamięć dla naszej nazwy przedmiotu.
Więc możemy w zasadzie użyć pliku specjalny operator umożliwiający dostęp do elementów, jeśli
jest to wskaźnik.
Pamiętaj, że w przypadku struktur są wskaźnikami, masz myślnik, a następnie większy niż symbol,
który ty można użyć, aby uzyskać dostęp do elementów.
W przeciwnym razie musisz usunąć odniesienia wskaźnik, aby uzyskać dostęp do elementów.
Moglibyśmy zrobić coś takiego to w nawiasach.
Moglibyśmy usunąć odniesienie do wskaźnika, więc
musielibyśmy zrobić coś takiego jak element star p, a następnie użyć kropka, aby uzyskać dostęp do elementów.
To jest całkowicie słuszne zrobić coś takiego.
Ale jest to rodzaj dodatkowej składni których tak naprawdę nie potrzebujesz.
Więc c ma specjalną składnię możesz użyć, gdy twoja struktura jest wskaźnikiem,
jeśli ty chcesz uzyskać dostęp do elementów.
Możesz po prostu wypowiedzieć nazwę wskaźnika, który jest elementem p, a następnie użyj myślnika,
a następnie większego niż.
I w tym przypadku chcemy przydziel pamięć dla nazwy pozycji.
Więc przypiszemy, co jest zwrócony z funkcji malloc.
Pamiętaj, funkcja malloc zwraca wskaźnik void.
Więc musimy to rzucić do gwiazdy postaci.
Ale możemy po prostu zadzwonić do malloc powiedz malloc, a następnie rozmiar
bajtów, które chcemy utworzyć.
W tym przypadku powiemy po prostu 30, i pomnożymy go przez rozmiar znaku, na
wypadek gdyby znak był a różnej wielkości na różnych komputerach.
I to będzie przydzielać pamięć dla naszej nazwy przedmiotu.
Musimy to zrobić, ponieważ nazwa przedmiotu jest wskaźnikiem wewnątrz struktury.
Nie ma pamięci przydzielone do niego, gdy
przypisujesz go do innej struktury.
Więc musimy to zrobić.
Teraz pierwsza rzecz, jakiej
chcesz po przydzieleniu pamięci należy sprawdzić malloc.
więc chcemy sprawdzić tutaj wartość null.
Powiemy tylko, jeśli pozycja p, jeśli to jest null, co powiedziałoby, że jest zerowe.
W przeciwnym razie powiedziałbyś, że jeśli nie, to możesz po prostu powiedz return lub exit prawdopodobnie byłoby lepsze, wyjdź z programu,
jeśli tak nie byli w stanie przydzielić pamięci i można było ją
przekazać do pamięci ujemnej.
W przeciwnym razie chcemy czytać w pliku element, więc chcemy stworzyć funkcję.
Funkcja, do której zmierzamy do utworzenia nazywa się element do odczytu.
Podajmy deklarację funkcji powyżej konstrukcji.
Będzie tylko wczytywał dane do struktury, którą do niej przekazaliśmy.
Nie zwróci żadnych danych.
Więc możemy po prostu powiedzieć czytaj element i wymaga struktury, a to będzie
wskaźnik.
Jest to więc element struktury, gwiazdka I.
Teraz możemy to uczynić stałą więc wartości jakby się zmieniają,
ale my zmieniamy wartości.
Ale możemy powiedzieć, że stała struktura, plik wartości nie byłyby w stanie zmienić
dla tego wskaźnika, na który wskazuje.
Jeśli zrobiliśmy stałą później gwiazdka oznaczająca, że adres nie może się zmienić ani nie
może być poprawny przed gwiazdką, coś takiego po
nazwie.
To by oznaczało, że adres nie może
zmiana, ale jest to zbędne, ponieważ przekazujemy wartość kopiowania.
Mamy naszą przeczytaną pozycję.
A skoro jestem tutaj, mogę jak również mój element do druku.
To będzie po prostu funkcja deklaracja, prototyp funkcji.
Tutaj będzie bardzo podobnie, weź również wskaźnik.
Możesz mieć miejsce, jeśli chcesz po gwiazdce czy nie?
Teraz możemy zdefiniować nasz odczyt pozycja poniżej naszej głównej metody.
I to będzie przeczytane w wartościach pozycji, a następnie
oblicz całkowitą kwotę.
Więc możemy powiedzieć, że void read przedmiot, miej nasz wskaźnik.
A w środku po prostu chcemy aby naprawdę używać niektórych scanfs.
Wydrukujemy kilka wiadomości nakazać użytkownikowi wprowadzenie informacji.
Więc powiemy wejść nazwę produktu, a potem ją przeczytamy.
Więc powiemy scanf, i mamy wskaźnik do struktury, więc możemy uzyskać do niej dostęp
używając myślnika, a następnie większego niż.
Chcemy przeczytać plik scanf, plik nazwa produktu to bufor znaków.
Chcemy więc powiedzieć procenty si wtedy powiemy, że zapiszemy to w
nazwie przedmiotu.
Moglibyśmy wrócić i skorzystać z Intellisense po prostu przejdź do nazwy przedmiotu.
Nie musimy używać adres operatora, ponieważ jest
to wskaźnik znakowy.
Następnie chcemy wydrukować i otrzymać cena,
prawdopodobnie chcesz dodać tutaj niektóre kanały liniowe, wprowadź cenę.
Zamierzamy przechowywać że w strukturze.
Więc znowu, cena jest zmienna.
Więc zamierzam powiedzieć procent f, ale zamierzamy również uzyskać do niego dostęp, ponieważ jest to wskaźnik, nadal chcemy
użyj myślnika, a następnie większego niż.
Z wyjątkiem tego czasu powiedz cenę i musimy uzyskać jego adres, więc zamierzamy umieść
przed nim znak ampersand, ponieważ cena nie
jest wskaźnikiem.
A potem zrobimy to samo dotyczy ilości.
Więc ilość jest liczbą całkowitą.
Możemy więc powiedzieć, że procent d nadal potrzebujemy aby uzyskać
jego adres, ale chcemy go przechowywać w innym elemencie, chcemy przechowywać w ilości.
Teraz, gdy zapisaliśmy lub zapytaliśmy użytkownik, aby
wprowadzić trzy informacje, teraz możemy faktycznie obliczyć kwotę, przechowywać coś
w kwocie.
Kwota to tylko ilość razy cena.
Dlatego nadal chcemy mieć dostęp do strukturę używając naszej składni,
chcemy ją rzucić, chcemy podpisać ilość razy cena.
I to jest funkcja odczytu elementu.
Pobiera wskaźnik struktury.
A więc kiedy zmodyfikujemy ten wskaźnik wewnątrz elementu do odczytu,
zostanie zmodyfikowany poza funkcją.
Więc niezależnie od struktury my przejść do tej funkcji,
zostanie zmodyfikowana.
Będzie przechowywać wszystkie pliki pozycje, nazwę przedmiotu, cenę oraz
ilość i kwotę.
Więc to czyta w danych.
W tym momencie chciałbyś test i prawdopodobnie chcesz
skompilować i przetestować wcześniej.
Ale możemy teraz wywołać przeczytany element metody w naszym głównym i przekaż ją
do naszej struktury, którą stworzyliśmy.
Więc możemy powiedzieć czytaj element, i możemy po prostu powiedzieć element p.
Nie musimy przechodzić adres, ponieważ jest to wskaźnik, więc
po prostu przekazujemy naszą strukturę.
A potem następna rzecz my możemy to wydrukować.
A to ci pokaże że dane są zapisane, pozycja p
jest modyfikowana wewnątrz funkcji i jest zapisywany poza funkcją, główną
funkcją faktycznie zapisał te wartości.
Możemy więc powiedzieć, że drukowanie elementu przechodzi ponownie we wskaźniku, a następnie możemy zdefiniować funkcję
print item.
Wydruk jest dość prosty.
Nic nie zwraca, więc mówimy void i mówimy,
że print item pobiera wskaźnik.
Więc po prostu mówimy struct item star Ja, jakkolwiek chcesz to nazwać.
A potem po prostu drukujemy dane dla przekazanej struktury.
Więc zrobilibyśmy coś takiego printf name procent s, I nazwa przedmiotu, I cena,
I ilość i I. ilość, a następnie formatujemy dane.
Jaka jest ostatnia rzecz, jaką
mamy do zrobienia po wydrukowaniu danych, plik naprawdę ważna darmowa funkcja.
Musimy dzwonić za darmo, ponieważ my chcą zwolnić pamięć, którą przydzieliliśmy
dla nazwy elementu.
Możemy więc po prostu powiedzieć darmową pozycję p a następnie uzyskaj dostęp do nazwy elementu.
Nie chcemy uwolnić całości struktura,
ponieważ cała struktura zostanie usunięta w pliku stos, gdy funkcja zwraca.
Chcemy tylko uwolnić to, co nam kupiliśmy.
Szukaliśmy tylko przedmiotu nazwa, więc ją uwalniamy, a potem
wracamy z głównego.
Więc chodźmy dalej i spróbuj to zbudować.
Mamy błąd.
Zobaczmy, że mówi struct item star.
Więc popełniliśmy błąd gdzie funkcje zostały zdefiniowane powyżej
struktury.
Ale funkcja przyjmowania pliku parametr jako typ struktury.
Więc musimy mieć strukturę zdefiniowane powyżej, gdzie go używamy.
Więc przenoszę funkcje aż do wierszy 12 i 13.
Teraz jesteśmy w stanie skompilować.
Przejdźmy dalej i uruchommy to.
Zobaczmy, co tu otrzymamy.
Mamy jeszcze jeden błąd.
Musisz się upewnić sprawdź, czy pozycja p ma wartość null.
Jeśli powiesz tylko, jeśli pozycja p dla prawda, to zawsze będzie prawda.
Możesz więc zaznaczyć, aby powiedzieć to nieprawda, gdy symbol nie
oznacza, że nie jest on pusty lub ty może sprawdzić, czy jest zerowa.
Więc właśnie dodałem tam zero.
Więc teraz to uruchomimy, my powinno być dobre.
Możemy wpisać nazwę produktu.
Powiemy serial i będziemy powiedz, że cena wynosi 1. 99.
I powiemy, że mamy pięć takich.
A teraz wydrukujemy to, i mówimy, że dolar seryjny 99.
5, łączna kwota wynosi 9. 95.
Cena choć mi się nie podoba jak cena jest drukowana.
Więc naprawmy to.
W naszym przedmiocie do druku możemy po prostu powiedzieć cena dor 2 f płynie,
teraz będziemy wyglądać trochę lepiej i uruchomimy to.
Dostaniemy trochę trochę lepszego formatu.
Cztery z nich i teraz to wygląda trochę lepiej i
wszystko jest w porządku.
Więc znowu, podstawowy program używający struktury i wskaźniki.
Stworzyliśmy konstrukcję u góry.
Mamy członka, który zawiera wskaźnik, jest to bardzo
wydajne, ponieważ możemy po prostu kopiuj i adresuj w przeciwieństwie
do tablic znaków.
Mamy dwie deklaracje funkcji, czytaj element drukuje element, który
przyjmuje zniszczenia wskaźników.
A potem tworzymy wskaźnik i przypisz go do zwykłej struktury wewnątrz
naszego pliku main.
Pamięć przydzielamy w linii 22.
Dbamy o pamięć przydzielone pomyślnie, jeśli tak nie jest,
wychodzimy z programu.
A potem nazywamy naszą dwójkę funkcje, które pobierają
wskaźniki do struktur, przekazują je.
I wreszcie, co nie mniej ważne, zwalniamy pamięć i wychodzimy
z programu.
A funkcje są całkiem proste.
Weź ten wskaźnik.
Dostęp do wskaźnika uzyskujesz za pomocą myślnik jest wtedy większy niż.
Otrzymasz adres to dla scanfów, które nie mają
wskaźników jako elementów.
I to w zasadzie wszystko.
Zapiszę ten program, spójrz na to.
Daj mi znać, jeśli masz jakieś pytania. Dziękuję Ci.