>> [MUZYKA GRY]
>> DAVIN: Dobra, chłopaki.
Jest to więc ocena dla pierwszego quizu.
Czy wszyscy gotowi do Quiz w środę?
ALLISON: Woo!
STUDENT: Woo!
DAVIN: Tak.
ALLISON: Tak!
DAVIN: Ten facet jest gotowy.
Ten facet, dwie ręce, ładne.
Więc ocena Quiz dzisiaj, to będzie na około godzinę i pół.
Mamy zamiar iść na wszystkich głównych koncepcje należy wiedzieć na quiz.
Mamy zamiar przejść przez jakiegoś kodowania przykłady rąk, które są w każdym quizie.
A jeśli masz pytania, nie krępuj podnieść rękę i wszystko,
tak.
Cóż, logistyka ok quiz online.
Więc mamy zamiar podzielić ludzi się w różnych pomieszczeniach.
To na podstawie ich nazwy.
Więc jeśli masz jakiekolwiek pytania dotyczące gdzie iść lub o tym, co jest materialne, jak,
oficjalne słowo na co się dzieje się na quizie, sprawdzić w Internecie.
I to wszystko na bieżąco.
Więc jeśli nie ma żadnych pytań do Przede wszystkim, mamy zamiar rozpocząć.
A tu Allison.
>> [Klaszcze]
>> ALLISON: OK, dzięki, Rob.
Doceniam to.
Davin powinien odwrócenie tego.
Jest to niewyczerpujący wykaz tematy, jak zawsze, jak Davina właśnie powiedział.
Zapoznaj się z dokumentacją w Internecie na temat quizu zera.
Ale to jest całkiem much-- to w programie nauczania
to wszystko, co już przeszedł do tej pory.
Wszystko tutaj jest uczciwa gra, jak nic innego
które mogą być wymienione w wykładzie.
>> Moja sekcja, tu jest po prostu dużo recenzji.
Istnieje kilka ćwiczeń że chłopaki mogą pracować.
Jednak dla większości rzeczywiście Aby dostać się do Davina z tych kodzie
ćwiczenia ręki.
>> Więc mam zamiar latać tym.
Jeśli masz jakiekolwiek pytania, zatrzymać mnie.
Podnieś rękę.
Obiecuję, że prawdopodobnie do zobaczenia.
Jeśli nie, to po prostu fala wokół.
Mam zamiar być szybko mówić.
Mam nadzieję, że każdy jest w porządku z tym.
>> OK, specjalne słowo, Davin oczywiście Zapomniałem przerzucać tych slajdów.
[Śmiech] Jesteś w kłopoty, człowieku.
Więc wskazówki dotyczące quizu zerowej, praktyki kodowania na papierze.
Chłopaki będą się niektóre ćwiczyć z tym teraz z Davina,
więc nie będzie całkowicie samodzielnie.
Myślę, że rzeczywiście będzie przez te dwie funkcje.
Więc będziesz dobrze przygotowany tam.
>> Znać swoich zbiorów problemowych.
Nie było pytania na poprzednich quizach
że cię zapytać, na przykład, do kodu się coś bardzo podobnego do Mario.
Więc jest bardzo dobrze zna Twój problem określa, jak dobrze
jako pytań prosimy na początku, w postaci
że wypełnisz, będzie służyć Ci bardzo dobrze.
>> Czy poprzedni quiz, pod ograniczenia czasowe.
Te testy są długie.
Czas płynie bardzo szybko.
I często nie zdają sobie sprawy, jak szybko to idzie aż faktycznie
postawić się w tych ograniczeniach.
Więc jeśli można po prostu wykroić, wiesz, 75 minuta, albo dzisiaj albo jutro
wziąć jedną z tych quizów pod że będzie w znacznie lepszej kondycji.
>> A także, tworząc arkusz odniesienia.
Pamiętaj, masz jedno strona przednia i tylna
jako odniesienie dla quiz w środę.
Tworzenie, że jest to świetny sposób, aby studiować.
Wszystko, co masz problemy ze chcesz to tam.
Wszystko, co było twoje TF, podobnych, jest bardzo ważne.
Powinieneś wiedzieć, to są Może rzeczy masz na nie
jeśli nie ma ich na pamięć.
Nawet jeśli wiem, naprawdę je dobrze, czasem nie mając go na
tylko rodzaj komfortu dla Ciebie, Wiem, quizy, które są stresujące.
Więc każdy komfort masz może pomóc.
Wszystko w porządku, również się spać i jeść i jak normalne rzeczy
możemy powiedzieć, że dla quizów.
>> Tak więc począwszy od łatwe, Typy danych i rozmiary.
Jak powiedziałem, jest to po prostu będzie do mnie rzucając wiele rzeczy
tutaj, że powinieneś wiedzieć.
Mamy więc nasze znaki że to jeden bajty, ints
że są cztery bajty, długi długie, co osiem bajtów.
W zasadzie, to tylko ty chcą posiadać większe liczby całkowite.
Pływaki, które są cztery, dwuosobowe, które są osiem.
Ponownie, po prostu daje więcej miejsca dla pływaków.
A następnie wpisz gwiazdkę, więc każdy wskaźnik na komputerze 32-bitowym,
co jest potrzebne wszystkie chłopaki wiedzieć, jest cztery bajty.
>> Więc wszystkie rzeczy, które powinny wiem, może rzeczy
chcesz mieć na Twój arkusz odniesienia.
OK, konwersja binarnej do konwersji binarnych,
na szesnastkowy, tam iz powrotem, wszystkie rzeczy, które powinieneś wiedzieć.
Więc z binarnego na dziesiętny.
Chcecie wziąć szybki minut i spróbować dowiedzieć się, każdy z nich
i powiedz mi, co oni są?
>> Mam też słodycze w mojej torbie, więc każdy który odpowiada dostaje słodycze, przy okazji.
I mam dużo.
Pozwól mi złapać tego.
Mam zamiar dać to Gabe.
Więc można rozdawać cukierki kto jest miły i spółdzielni.
>> OK, widziałem tam w rękę z tyłu.
>> UCZEŃ: Tak, pierwszy z nich jest 42.
>> ALLISON: Tak, pierwszy z nich jest 42, poprawne.
STUDENT: [niesłyszalne].
[Śmiech]
ALLISON: Druga, tam z powrotem na żółto?
STUDENT: 110,01 tysięcy.
ALLISON: Zgadza się, i to ostatni, tu na dole?
Ponadto, tak, wiesz, chcesz?
Wystarczy wrzucić na słodycze.
Jak o słodycze dla wszystkich?
>> STUDENT: [niesłyszalne], kiedy skończysz.
>> ALLISON: Ciii.
I wtedy ostatni.
Kto chce odpowiedzieć?
Właśnie tam.
>> STUDENT: 11100.
>> ALLISON: 11100, spójrz na to.
Gratulacje, świetna robota, wszyscy.
OK, rozumiem, każdy rodzaj Proces ten sposób?
Ty, idąc z binarnego na dziesiętny sposób staram się to zrobić, pisze się
uprawnienia 2.
Więc mówię, OK, 0 razy w 2 do 0, więc to 0, 1 razy 2 do pierwszej,
jest 2 będzie dalej w ten sposób.
Czy ktoś chce mi się wyraźnie przejść przez przykład binarny?
OK, fajnie.
>> Dziesiętnego na binarny jest bardzo podobny.
Staram się pisać uprawnień 2.
Zacznij od tego, który jest największym, ale nie przejść obok po przecinku
że szukasz.
A następnie rodzaj pracy na swój sposób wstecz dodanie rzeczy, jak to konieczne.
>> A potem, z dodatkiem, że to Ponadto, tak jak normalny.
Jeśli kiedykolwiek sprawę, gdzie jesteś dodanie dwóch 1s, to oczywiście staje się dwa.
2 w formacie binarnym jest teraz 1 0 więc trzeba nosić jeden do następnej kolumny.
Fajne.
>> Szesnastkowy, to może być coś że jest nieco mniej znane.
Tak jak Rob mówi mi właśnie wcześniej, za to jego sztuczka
jest po prostu podzielić go na cztery kawałki bajtowych, OK?
Bity, przepraszam.
Patrz?
Dzięki Rob.
To dlatego, że tu jesteś. [NOISE] OK, więc po prostu złamać go
na cztery bity kawałki.
Więc z plików binarnych do postaci szesnastkowej, patrzymy na pierwsze 4,
który jest, jeśli mamy w czterech 1s wiersz, jaki numer ma to symbolizować?
>> STUDENT: F.
>> ALLISON: Więc w tym przypadku, co jest 11111111 or-- tak?
STUDENT: FF.
ALLISON: Perfect, FF.
Tak wielka, słodycze dla ciebie.
Teraz, jak szesnastkowy na binarny, my pomyśl o tym rodzaju w odwrotnej kolejności.
Dla każdej liczby lub litery tym mamy w naszym systemie szesnastkowym,
po prostu przekonwertować go do czterech bit [Śmiech], aby jego cztery bitowej konwersji.
Tak więc 5, w tym przypadku, co jest 5 czy jesteśmy reprezentujący go czterech bitów?
>> STUDENT: 010?
Mm-hm.
A następnie, co jest faktycznie 10, będzie?
1010.
Mamy więc, że tutaj.
Więc konwersji między szesnastkowym i binarny rzeczywiście nie jest tak źle.
Jeśli spojrzeć na to w czterech bit kawałki, będzie złoty.
Everyone-- tak?
>> ROB: To jest głupie, ale ja zawsze pamiętać
, Ponieważ miało być 10.
I binarne tylko 10 10, SO-
>> ALLISON: Ach, nie idziemy.
>> ROB: Hej.
>> ALLISON: Hej, słodycze dla Roba.
Nie ma rzeczy nie czekolada tam.
Więc można mieć pewne.
Więc ASCII matematyki.
Zachowywać.
Tak więc matematyka, jak ASCII wy chyba dobrze pamiętam
p set 2 z Visioneer i Cezar, to dużo to zrobił.
Pamiętaj, że znaki są tu podstawowe tylko liczby.
Więc co możemy zrobić z nimi matematyki, tak jak robimy matematyki z int.
>> Mamy więc tylko trochę proste rzeczy tutaj.
Mamy jedne w to inicjowany do 65.
I B równa wartości ASCII A plus 1, char C równa D minus 1,
i znak D równy 68.
Więc idziemy do druku wszystkie z nich, jak widzimy tutaj.
A może ktoś mi powiedzieć, co to będzie drukować?
STUDENT: [niesłyszalne].
ALLISON: Dokładnie tak jedną sprawą jest
że mamy do drukowania znaków za każdym razem, tutaj.
Jesteśmy wyznaczenie chociaż A i B są ints kiedy ogłosił je powyżej.
Jesteśmy drukowanie ich jako znaków przez procent C i nasze oświadczenie printf,
więc będą wszystkie wydrukować jako znaki.
I oczywiście, będzie wartość ASCII 65 wydrukować jako A. ASCII A plus 1
będzie 66, który dumą B. Tak więc w rzeczywistości,
tam dostać B C D. Każdy dobry?
Jakieś pytania?
Niesamowite.
>> OK, zakres.
Tak więc zakres jest oczywiście bardzo Ważne jest, aby zrozumieć, tutaj.
Wielu z was, jeśli was mają błędy kompilacji,
i mówi, że nie ma dostęp do jakiejś zmiennej,
to pewnie dlatego, że ciebie definiuje go w pętli
a następnie próbował do niego dostęp z niego, lub na odwrót.
>> Tak więc zakres w swej istocie, określa, gdzie to tylko
mówimy zmienna istnieje, gdzie Można to zmienić, gdzie można uzyskać do niego dostęp.
To tylko rodzaj mówiąc są to jedyne miejsca, gdzie mają dostęp
do tej zmiennej.
>> Tak więc te dwa zakresy, które mówią o podczas zajęć są globalne i lokalne.
Zmienne, więc możemy mówić o globalnym podczas definiowania ich ponad głównym.
Oznacza to, że cały Program ma do niej dostęp,
i istnieje on tak długo jak przebiegów programu, OK?
Lokalna oznacza, że ​​jest to bardziej ograniczone do regionu.
Więc gdy masz konkretne funkcje jak swap, zawsze porozmawiać.
Zawsze mówimy o zamianie z A i B. A i B istnieją w tej funkcji.
Nie istnieją nigdzie indziej.
>> Jak dobrze, gdy masz, jeśli oświadczenia lub pętli.
Ilekroć mamy, na przykład, w pętli mamy int I jest równa 0.
Mamy pewne warunki, a my go zaktualizować.
I istnieje tylko w szelki tej pętli.
Jeśli próbujesz do niego dostęp w innym miejscu, kompilator będzie krzyczeć na ciebie.
To byłoby jak, co chcesz zrobić?
Nie istnieje.
Więc to dwa Różne typy zakresu.
Czy to ma sens dla każdego?
>> Tak na przykład tutaj, w tym to tylko niektóre prosty program.
Co myślicie jest wydarzy się w każdym punkcie
że staramy się drukować?
Więc ten jeden tutaj, co się stało?
STUDENT: Będzie wydrukować trzy.
ALLISON: Prawo.
To będzie drukować trzy.
Co tutaj?
Student: To nie będzie działać.
ALLISON: To nie będzie działać.
Jesteś poza zakresem, prawda?
Zmienna lokalna nie istnieje poza tymi szelkami, wszystko w porządku?
A potem co się tutaj?
>> STUDENT: [niesłyszalne].
>> ALLISON: Co?
Rob, idź.
>> ROB: Właśnie powiedział.
Zmienne globalne powinny być zmienna globalna podkreślenia.
>> ALLISON: Ach, tak, przepraszam.
Dzięki, Rob.
Rob jak nasz kompilator rezydenta.
On po prostu krzyczeć na nas, kiedy potrzebujesz. [Śmiech] Tak, że
powinna być zmienna podkreślenia globalnego.
Tak więc zakładając, że był globalny podkreślenia
zmienna, co się będzie działo?
Student: To będzie działać.
ALLISON: To będzie działać.
Więc to wydrukować, więc po prostu bardzo prosty przykład.
OK, prototypy.
Tak oczywiście, naprawdę podkreślają, dla was
do funkcji, jeśli sensu w swoich programach.
Ale oczywiście, kiedy tworzyć własne funkcje,
zwykle będziesz je zdefiniować po głównym.
A ty spróbuj zadzwonić do nich w głównym.
A jeśli nie używasz prototyp, kompilator będzie krzyczeć na ciebie.
>> Prototyp jest w zasadzie tylko mówi kompilatorowi
że mam tej funkcji poniżej głównego.
Mam zamiar nazwać zanim zdefiniować.
Trzymaj się.
Obiecuję, że nie jest to określone, a będzie miał wszystko, czego potrzebujesz.
>> Więc sposób to robimy to tylko twój powrót rodzaj, nazwę funkcji, twój wkład
lista.
Jest to w zasadzie pierwsza linia swojej deklaracji funkcji.
To naprawdę wszystko jest.
Ale to tylko Generalnie rodzaj formatu.
>> Tak więc w naszym przykładzie tutaj, które faceci powinni
widziałem w sekcji w pewnym momencie, mamy
Sześcian, że niektóre int zajmuje trochę int wejścia.
I mamy nasze główne Funkcja, która zwraca sześcianu.
A kostka jest określona po fakcie.
>> Więc jeśli nie mamy wejście int kostki w górę, gdy kostka nazywane
ciągu głównym naszego kompilatora nie gniewaj się na nas.
To byłoby jak, co ty mówisz?
Cube nie istnieje.
Nie wiem, co się prosi.
A ja po prostu się zatrzymać.
>> Ale dlatego, że nie nasz prototyp na górze, już powiedzieliśmy,
wiesz, kiedy widzisz kostka, nie martw się o to.
Obiecuję, że nie jest to zdefiniowane później.
I będzie to pozwala robić to, co chcesz.
Więc jeśli kiedykolwiek mieć funkcję oświadczył, że jest po to nazwać
po raz pierwszy, musisz mają to prototypy na górze.
>> Tak?
>> ROB: To do kwadratu, a nie organizowania kostek.
>> ALLISON: O mój Boże.
Nie have-- Gabe'a, myślałem, byłeś naszym korektor.
OK chłopaki, pokrywa się ze mną, tutaj.
Mam nadzieję, że wszyscy się pomysł.
OK, więc to powinno mieć był wyrównany, nie pokrojone w kostkę.
Ale idea pozostaje taka sama.
Każda funkcja, że ​​dzwonisz po Fakt ten powinien mieć prototyp.
Wszyscy dobrze się z tym?
Wszelkie inne literówki?
OK.
Tutaj jakieś literówki, zanim zaczniemy, Rob?
[Śmiech] OK, więc strukturach.
Zasadniczo structury pozwalają utworzyć własny typ danych.
Tak więc podobnie jak int lub char lub pływak, to tylko inny rodzaj.
Lubię myśleć o tym, jak, jak, stworzyć własny typ danych.
Więc pozwala Ci zrobić.
I posiada różne typy danych.
>> Więc jeśli pamiętamy, w tablicy, możemy może posiadać tylko rzeczy podobnego typu.
Structury pozwalają nam trzymać wielokrotnego rzeczy z różnych typów.
Tak więc w tym przypadku tutaj, my mają struct nazwie Student,
nazwany tu na dole.
I mamy trochę id int a niektóre ciągi.
Więc to jest po prostu inny typ danych.
Mamy teraz typ danych o nazwie Student.
>> Tak więc, ponieważ możemy myśleć to jako kolejny typ danych,
możemy deklarować zmienne jak każdy inny.
Więc zamiast tylko o, jak, int student, musimy po prostu student,
Student 1.
Och, spójrz.
To Rob.
Więc tutaj mamy deklarując struktura, lub zmienna
nazywa uczeń 1 typu studenta.
Więc to będzie miał identyfikator a nazwa wiąże się z nim.
>> I sposób uzyskać do nich dostęp elementy w naszej struct
jest z operatorem kropka, tutaj.
Tak więc w tym przypadku oświadczył pewnego studenta 1.
Mamy przypisany identyfikator być jeden.
A my przypisać nazwę się Rob.
OK, wszyscy dobrze się z tym?
Użyj po prostu like-- tak?
>> UCZEŃ: Tak, typedef-- kiedy musimy użyć typedef?
>> ALLISON: Więc po prostu typedef mówi that-- Rob, ty
może mnie poprawić, jeśli się na to, że jestem wrong-- ale w rzeczywistości jest po prostu typedef deklarując
to jako typ, który można wykorzystać, prawda?
>> ROB: Tak, to jest w zasadzie, tak, to jest po prostu tworzenie
alias lub pseudonim dla typu.
Więc można wpisać, że [niesłyszalne].
Więc [niesłyszalne] istnieje, i teraz musimy tylko
[Niesłyszalne] środki dokładnie to samo.
I tak oto, mamy wpisane, jak sądzę, pewnego rodzaju struktura 2 [niesłyszalne].
Więc to tylko pseudonim dla danego typu.
>> STUDENT: String [niesłyszalne] biblioteka został wpisany się jak gwiazda char.
>> ALLISON: Dla naszych celów, jeśli deklarowania struct,
po prostu zrobić typedef struct.
OK więc wcześniej, to jest tylko normalne zmienna tutaj.
Mamy do niego dostęp z kropką.
jeśli mamy wskaźnik do struktura, możemy rzeczywiście
użyj strzałek, co jest całkiem fajne.
>> Więc w tym przypadku, mamy wskaźnik do Uczeń 1 to od typu ucznia.
Pamiętaj, że z telefonem Konstrukcja wskaźnika,
chcesz cokolwiek wpisać wskaźnik wskazuje się na początku.
Więc mamy trochę studenta 1, tutaj.
I od tego studenta 1 jest teraz ostro,
możemy rzeczywiście iść studentów nazwę 1 strzałki zamiast kropki, bo to wskaźnik,
i przypisać Rob.
A teraz, jeśli chcemy zmienić Roba do Davina,
to jest po prostu pokazując, Innym sposobem, aby to zrobić.
>> Więc zamiast za pomocą strzałki, można może also-- skończę to, a następnie
przyjąć, że question-- mógłbyś również zrobić studenta odniesienia 1.
To mówi, jak udać się do co jest studenta 1, która
Uczeń będzie nasza struktura.
Do niego dostęp z kropką i elementu które chcesz, a następnie przypisać go.
Nie było pytanie.
Uczeń: Tak, tak, jak się masz używać [niesłyszalne], gdy jesteś
studentów nie robi gwiazdę [Niesłyszalne] studentem?
ALLISON: Ponieważ tworzy wskaźnik.
ROB: Będziemy o tym rozmawiać.
ALLISON: Będziemy rozmawiać o tym w dalszej części przeglądu.
Więc po prostu trzymać się tej myśli.
Jeśli nadal przeszkadza w końca, przyszedł porozmawiać z jednym z nas.
>> Więc to zrobić dokładnie to samo.
Jesteśmy po prostu pokazując dwa różnych sposobów, aby to zrobić.
Student 1 jest teraz wskaźnik, tak można uzyskać dostęp do elementu Nazwa
w struct ze strzałką.
Albo można dereference wskaźnikiem, a następnie uzyskać do niego dostęp, jak zwykle.
Czy to ma sens każdemu?
Jeśli wskaźnik całe rzeczy są trochę mylące, Gabe będzie mówić o tym,
i to może to będzie więcej sensu.
Tak?
>> Uczeń: Tak, tak, jak jest tym różni się od?
ALLISON: poprzednia?
Więc w tym uczeń 1 Sprawa nie jest wskaźnikiem.
To tylko faktyczna struktura.
>> STUDENT: OK.
>> ALLISON: Podczas tej jednej jest wskaźnik do struct.
>> STUDENT: OK, ale robi to rodzaj w końcu pracuje sam [niesłyszalne].
>> ALLISON: Skutecznie działa tak samo.
Składnia jest po prostu inna.
STUDENT: OK.
>> ALLISON: Tak, są one faktycznie same.
To właśnie w zależności od kontekstu, możesz na siebie.
Tak?
>> STUDENT: Kiedy robisz odniesienia do 1--
ALLISON: Mm-hm?
STUDENT: Dlaczego mają nawiasy?
ALLISON: Ponieważ uczeń 1 jest wskaźnik.
Więc musisz upewnić się, że jesteś tylko dereferencji wskaźnika.
>> STUDENT: OK.
>> ALLISON: Więc w tym przypadku tutaj, nawiasy wokół niego
oznacza, że ​​jesteś dereferencji ucznia 1.
Więc idziesz do miejsca, gdzie uczeń 1 pkt, co jest twoja struktura.
Więc teraz można myśleć o tym, jak tego struct,
więc możemy skorzystać z naszego normalnego działania dot.
Jeszcze jakieś pytania?
Cool, niesamowite.
>> Więc ostatnią rzeczą, myślę, to mój ostatni slajd, woo!
OK, więc zmiennoprzecinkowych niedokładności.
Rozmawialiśmy chwilę o to podczas wykładu.
Zasadniczo, mamy nieskończenie wiele liczb rzeczywistych.
A jeśli któryś z was kocham matematykę, nie
wszelkiego rodzaju fajne rzeczy z nami.
>> Ale istnieje nieskończenie wiele liczb rzeczywistych.
Ale to tylko skończony wiele bitów, które mamy.
Więc zawsze będzie mają niedokładności, to wszystko.
I to jest to po prostu rodzaj jak coś, co powinieneś wiedzieć.
To jak my może zapytać, dlaczego nie zmiennoprzecinkowe niedokładności istnieje?
Więc po prostu coś trzeba wiedzieć.
A z tym, jestem toczenia go do wskaźników.
>> Binky: Cześć, chłopaki.
Nazywam się Binky.
Mam zamiar mówić o wskazówki.
Tak, tak jest w rzeczywistości wskaźniki moja ulubiona część tego kursu.
Tak po prostu, aby jasne, co Allison mówił o tutaj, więc powód
why-- Jedyną różnicą, Duża różnica była droga
oświadczamy rzeczy.
Więc oznacza to gwiazda uczeń jest wskaźnikiem do studenta.
Natomiast slajd przed, student Rzeczywista struktura, jak rzeczywiste studenta,
zawierających żadnej z tych rzeczy.
>> A powodem, dla którego chcą to-- tak, Davina?
>> DAVIN: Co strzałki oznacza?
>> Binky: Środki strzałek dokładnie takie same, jak to.
Tak naprawdę nie trzeba strzałkę.
Jak, jeśli jesteś jedynym programem w C, możesz po prostu użyć tego.
Niestety, ja nie, co to jest.
Możesz po prostu użyć tej składni.
>> Ale niektórzy ludzie, gdy były projektowania C,
oni zorientowali, że ludzie użył tego składnię tak wiele,
że będą one lubią po prostu wymyślić o strukturze składni dla niego.
A miało to miejsce w forma tej strzałki.
I to jest naprawdę ładne, bo symbolizuje coś
jakbyśmy rzeczywiście po ta strzałka, to wskaźnik,
w kierunku jakiegoś miejsca w pamięci.
A gdy tam dotrzemy, chcemy spojrzeć na nazwę tego studenta,
czy to ma sens.
OK?
>> Tak to jest dokładnie to samo.
To jest dokładnie to samo, co ten.
Oni się skompilowany dokładnie tak samo, OK?
A powodem tutaj dlatego malloc coś, ponieważ w tym wypadku
nasza zmienna jest faktycznie tylko zmienna wskaźnik.
Tak więc mamy tylko trochę miejsca w pamięci, który trzyma wskaźnik.
Tak naprawdę nie ma żadnego miejsca który posiada rzeczywistej struktury.
>> Więc to musi być wykonane w dwóch etapach.
Musimy stworzyć Pamięć umieścić struct w.
I musimy stworzyć pamięci, aby umieścić wskaźnik w.
Więc są w zasadzie dwa różne zmienne, tutaj.
Jednym z nich jest rodzaj studenta oprócz tego, że tak naprawdę nie ma nazwy.
A druga jest typu studenckiego gwiazdy.
A następnie 1 pkt studenckie tam, czy to ma sens.
OK?
>> Więc powód używamy wskaźniki, ponieważ wszystko jest
w komputerze, każda zmienna w komputerze, posiada dwie rzeczy.
Ma swoją wartość.
I to ma swój adres.
I dobry sposób, aby konceptualizacji to tam
wiele problemów, gdy spróbuj użyć funkcji.
I mamy zamiar spróbować zajrzeć do jednego z nich.
Mianowicie, to będzie myśleć o pamięci jako skrzynek.
>> Zawsze myślałem o zmiennych kiedy mówisz na równe 5.
Myślisz, że na wprowadzenie 5 do pudełka.
Więc co, jeśli chcesz, aby przejść że int do funkcji?
Wystarczy pass-- ja nie know-- x do funkcji.
Ale to, co się dzieje, zwykle jako ludzi, to
pomyśli coś jakbym przepuszczenie pola na osobie.
I to naprawdę nie robi zdarzają się w komputerach.
Co się dzieje, jest skopiowanie wartości skrzynki do skrzynki osoby.
>> Więc to, co próbuję powiedzieć to to, że jeśli masz function-- sorry-- tutaj,
jeśli mamy funkcję jak do pięciu górę nie, jeśli spróbujesz przekazać zmienną,
to po prostu się skopiować.
Jeśli nx initialize równa 3, to będzie skopiować tę wartość do zmiennej a
tam.
OK, a to z tego powodu rodzajem Dlatego chcemy użyć wskaźników.
Bo zamiast daje tylko wartość,
zamiast po prostu przechodząc po prostu wartość do funkcji,
chcemy przekazać przez odniesienie.
To, co nazywamy przepustkę przez odniesienie jest rodzajem dawać pole do funkcji,
tak, że funkcja może również zmienić wartości w tym polu.
>> OK, więc tylko niektóre podstawowe wskaźnik rzeczy jest stworzenie wskaźników,
po prostu zadeklarować jej typ, a umieścić gwiazdę tuż po nim.
I typ jest po prostu co masz wskazując na.
Więc jeśli jest to int gwiazda, jesteś wskazując na int.
Jeśli jest to gwiazda znak, jesteś wskazując na wykresie.
A jeśli to gwiazda student, jesteś wskazując na ucznia.
OK?
>> A oni długo wszystkie 4 bajty.
Bo tej zmiennej tak nie jest w rzeczywistości
trzeba trzymać char, int, lub uczeń.
To tylko musi posiadać adres.
To dlatego, że są wszystkie 4 bajty długi w normalnym urządzeniu 32-bitowym.
OK?
Więc tutaj, x jest zmienną, która wskazuje do wew. y wskazuje na char. Z punktów
do pływaka.
Tutaj jakieś pytania?
Fajne.
I są dwa oni mają różne symbole
aby pamiętać przy zbliża się do wskaźnika.
Tak więc odwołanie i dereferencji są te duże.
Więc z ampersand nazwa zmiennej daje?
STUDENT: Adres.
Binky: Adres.
Więc jeśli zadeklarować int a wynosi 5, a następnie ampersanda
z ma dać ci adres.
I rzeczywiście można spróbować wydrukować, że i zobaczyć
jaki adres w pamięci zmienna ma.
A potem dereferencing-- tak, że została odwołanie,
coraz address-- dereferencji Jest dokładnie odwrotnie.
OK, tak jak czasami jest przeciwieństwem podziału,
Gwiazda jest przeciwieństwem ampersand.
Tak więc środki dereferencji tam.
Więc jeśli dasz star-- I nie know-- 50, to
Spróbuję go na adres Numer 50 wewnątrz komputera.
OK, a dlaczego nie widzimy że są przeciwieństwami?
Bo to, co się dzieje, jeśli nie coś jak gwiazda handlowe i?
Cóż, handlowego i daje adres zmiennej, adres.
Ale gwiazda oznacza tam.
>> Więc co się dzieje, jeśli przejść na adres?
Wystarczy dostać się do, prawda?
Tak więc zamierza adresem to samo co.
Dlatego są one zwykle o których mowa w tym same--
a ten określa się jako przeciwstawne operatorów.
OK?
Tak fajne.
>> W obszarze okapu, na przykład, jeśli zadeklarować int x jest równe 5,
mamy zmienną.
I pamiętam, że powiedział co zmienna-- i to jest dobra rzecz
do utrzymania w mind-- ma dwa różne sprawy związane z.
Że ma zająć i wartość.
OK?
>> Tak więc wartość w tym przypadku 5.
I adres is-- powiedzmy, że jestem zrobienie czegoś up-- To 0x04.
I tylko dlatego, że zwykle stanowią adresy w systemie szesnastkowym
jest jeden, bo to jak dobra.
To pasuje binarny.
Jest to łatwe do konwersji z formatu binarnego.
I to nie było zbyt duże, jeśli masz bardzo dużą liczbę.
Więc jak korzystać szesnastkowy w adresach drukarskich.
Ale mogę reprezentować to jako liczba całkowita.
Jest w porządku.
>> I tak to ma adres 4 i wartość 5.
I wtedy powiedziałem int gwiazda wskaźnik.
Więc to jest inny typ, zawiadomienie.
Int gwiazda wskaźnik równy adres x.
Więc co będzie wartość ptr?
To będzie adres x, tutaj.
OK, więc ma wartość jest taki sam, jak adres.
To zadanie działać robię.
A potem PTR będzie mieć własny adres, który okazuje,
w tym przypadku, 8, OK?
>> A następnie utworzyć nową całkowitą kopię.
I mówię int kopii wynosi tam.
Więc idź do tego, co ptr wskazuje.
No, co to ptr mieć?
Ptr ma 0x04.
Co się stanie, jeśli spróbuję tam?
Znajdę faceta, który ma Adres x i, kto ma adres 4.
A kto ma zająć cztery jest x.
Czy to ma sens?
Tak?
>> STUDENT: W tym przypadku, jest wskaźnik w stosie?
>> Binky: W tym przypadku, it's-- dobre pytanie.
I tak naprawdę nie myślę o tym podczas przygotowania tych adresów.
Jednak, jeżeli jest to, podobnie jak wszystkie są to zmienne lokalne,
to x będzie żył in-- wszystko będzie żyć w stosie.
Więc wszystko idzie być wskazując na stos.
Dostajesz tylko sterty kiedy to zaczniesz używać malloc, prawda?
>> Więc jeśli przypomnieć stos jest za każdym razem, można wywołać funkcję w programie,
takie jak, na przykład główny lub dowolny innych funkcji, takich jak printf.
Wszystkie lokalne zmienne zamierza się umieścić w ramce stosu.
I dostaniesz jak ułożone w stos.
To, co nazywa się stos.
I wszystkie te zmienne lokalne są tam będzie.
I heap-- i jedziemy aby porozmawiać o tym later--
kupa jest gdzie wszystkie dynamicznie przydzielane życie pamięci.
Cool?
>> Idziemy do tego slajdu.
Tak?
>> STUDENT: Dlaczego nie jest int kopia powrocie 0x04?
>> Binky: Dlaczego nie jest int kopia powrocie 0x04?
>> STUDENT: Dlaczego nie jest to, że [niesłyszalne]?
>> Binky: Bo to, co jest wartością ptr?
>> STUDENT: 0x04.
>> Binky: 0x04.
Co się stanie, jeśli pójdziesz do 0x04?
Co otrzymasz?
>> STUDENT: Oh, OK.
Binky: Widzisz?
UCZEŃ: Tak.
Binky: Więc masz 5.
Więc kopia będzie miał 5, czy to ma sens.
Tak?
>> STUDENT: Czy możemy zdobyć 5 W polu Value [niesłyszalne]
jeśli stawiamy int skopiować [niesłyszalne].
>> Binky: Int-- my by, tak.
Że zrobiłby prawie to samo.
Ale w ten sposób, możemy przejść zwracam się do funkcji.
I to jest fajne mamy zamiar teraz zrobić.
>> Więc ten rodzaj ćwiczeń zawsze pojawia się on-- bardzo zwykle pojawia się w quizach.
Więc to jest naprawdę dobry, aby spróbować zrobić coś takiego samemu.
Więc staram się śledzić, co adres jest i chcesz wartości zmiennych
są w każdym punkcie.
Tak to jest dokładnie to, co będziemy robić.
Tutaj mamy kroki, jeden, dwa, trzy, cztery, pięć.
Jeden, dwa, trzy, cztery, pięć.
I będziemy śledzić z wartości x i.
>> Więc co to robi, jeśli jest to Kod buggy, staramy się zrobić do pięciu.
Więc staramy się dostać w zmienna i zmienić jego wartość do 5.
I pamiętam o analogii box i wręczając pole do kogoś?
Tak więc głównym ma to pole o nazwie x.
I zawiera wartość 3.
I staram się przekazać to pole, aby do pięciu.
>> I chcę, aby zmienić do pięciu Wartość tego pola do 5.
A potem po prostu wydrukować wartość x.
To jest to, co mój function-- jest to, co chcę robić.
Próbuję tylko do aktualizacji Wartość x 5.
Czy to jest jasne, co robi funkcja?
>> OK, więc co będzie Wartości x i tu,
pierwszej linii, tuż przed pierwszym line-- chciałbym say-- programu?
>> Student: Prawdopodobnie śmieci.
>> Binky: Tylko śmieci rzeczy.
Więc po prostu umieścić N / A. Tak naprawdę nie wiem.
Jak, nawet nie istnieje, dlatego, że nie nazywa się do pięciu.
Int nie jest zadeklarowana.
A x będzie istnieć tutaj, ale naprawdę nie ma
przypisane do niego żadnej wartości, tak dobrze?
>> A potem, co będzie wartości X oraz w numer dwa?
>> STUDENT: [niesłyszalne].
>> Binky: Tak x będzie trzech.
To proste, ponieważ mamy przypisanie do niej 3.
I nadal nie istnieje bo po prostu żyje w pięć.
Więc mam zamiar mieć trzy i nic.
lub jak śmieci, niezależnie, naprawdę nie zdefiniowane.
A teraz, jest to ważne, linia.
Tutaj mamy zamiar faktycznie zadzwonić do pięciu.
I pamiętaj, co powiedziałem.
Nigdy nie przechodzą w polu.
Po prostu skopiuj wartość okno do innego okna.
To nie wszystkie komputery, kopiowanie rzeczy z jednego miejsca do drugiego.
>> Więc do pięciu, co rzeczywiście robi to kopiuje wartość x do.
Więc to, co dzieje się tutaj?
Wartości x i.
3 i 3, po prostu skopiować to w ciągu od x.
Fajne.
>> Teraz jesteśmy tutaj.
A teraz idziemy aktualizacji wynosi 5.
Co się stanie w kolejce cztery?
>> STUDENT: [niesłyszalne].
>> Binky: jest aktualizowany, ale x nie aktualizowane.
Ponieważ x nadal mieszka w głównym, to zupełnie inny blok pamięci.
To inna zmienna.
jest inną zmienną.
Stało się, że mają I taką samą wartość, ponieważ
skopiowane wartości x do.
Ale teraz, kiedy robię wynosi 5, to tak naprawdę nie wpływa w żaden sposób x.
To jest trudniejsze część.
Czy to ma sens dla wszystkich?
Tak?
STUDENT: Jeszcze jedno pytanie, masz trzy.
Dlaczego already-- och, nie, to 3.
Niestety, nic nie szkodzi.
Czytałem 5.
>> Binky: Tak, 3, 3.
>> STUDENT: [niesłyszalne], tak.
Binky: A potem przypisać 5 do , ale tak naprawdę nie zmieni x.
Dobry?
UCZEŃ: Tak.
Binky: Tak?
Czy możesz wyjaśnić, w jaki sposób ponownie zostanie skopiowany [niesłyszalne]?
>> Binky: OK, więc gdy dzwonisz do pięciu x, więc tej linii kodu tutaj.
pięć x, co jest x?
x jest tylko 3 w tym momencie, prawda?
Więc może po prostu myśleć o wprowadzenie 3 w tu i zapominając o x.
Wystarczy umieścić 3 tutaj.
Jak, mamy zamiar skopiować wartość x do int a, który jest tam.
OK?
>> Tak więc wartość x 3.
Mamy zamiar skopiować 3 nad do.
A wszystko to drugi blok Pamięć ta druga zmienna
nazywany będzie miał 3, jak również.
Czy to ma sens?
Tak?
>> STUDENT: Jeśli dasz do pięciu, jak mieć go jako liczba całkowita x, a nie,
by to wszystko naprawić?
>> Binky: Jeśli to integer-- nie, że nie wszystko naprawić.
Więc to jest bardzo dobre pytanie.
To naprawdę nie ma znaczenia, co nazywasz tych zmiennych.
Ponownie, to będzie kwestia zakresu, dlatego, że nie jesteś sam x.
Są całkowicie różne miejsca w pamięci.
STUDENT: [niesłyszalne].
Binky: Więc to naprawdę nie robi znaczenia, co do nich zadzwonić.
To nie rozwiąże sprawy, OK?
Więcej pytań?
Tak?
>> STUDENT: Jak to jest z powrotem do numer pięć [niesłyszalne]?
Binky: OK, mamy nie zrobić tego jeszcze.
Chodźmy na numer pięć, a następnie.
>> STUDENT: [niesłyszalne]?
>> Binky: Co?
>> STUDENT: Czy masz zwrot w ogóle?
Binky: Nie mamy zwrotny, nie stanowi głównego.
Ale główne automatycznie powraca 0 jeśli nic nie powrócić.
Tak?
>> STUDENT: Czy mógłbyś zrobić main-- lub można wprowadzić do pięciu zwróci?
>> Binky: Mogliśmy do pięciu wrócić, tak.
Ale wtedy musielibyśmy przypisać x równa wartości zwracanej do pięciu,
który byłby nieco inny program.
To działa.
Ale to, co chcemy zrobić, to, co jest nazywa zmiana coś w miejscu.
Dlatego chcemy, aby rzeczywiście zmienić to pole i nie martwić się
o konieczności powrotu wartości lub cokolwiek.
OK?
>> To jest tak jak z funkcji zamiany David pokazał w wykładzie, z wyjątkiem jestem
tylko do czynienia z jedną zmienną.
I użył dwóch, więc int b i następnie tymczasowe zmienne i etażerka.
OK?
Więc co jest ostatnia linia?
Po pięciu zwrotów, to po prostu ma zamiar odejść.
Nie będzie już, i tylko x nadal będzie żyć.
>> I wiecie co? x nie zmienić jego wartość,
po wszystkim, bo jesteśmy tylko zmienia wartość.
Dlatego x 3 było w całym.
OK?
Dobra.
Tak więc ten program nie robi osiągnąć to, co chcieliśmy.
Teraz to naprawić.
>> A program jest za pomocą wskaźników naprawić.
Co możemy zrobić, to mamy trzy linie, które są różne.
Pierwsze z nich jest nie przekazujemy x.
Przekazujemy adres x.
Więc zamiast kopiowania na Wartość pola,
Jestem nadal będzie skopiować coś.
Ale ja przekopiowaniu adres skrzynki.
>> Więc jeśli mogę przekazać adres pole do do pięciu, a następnie do pięciu
będzie w stanie stwierdzić, że w pamięci i zmienić jej wartość.
>> Więc i tam mam że nie jest już int.
jest int gwiazda.
Jest to wskaźnik do liczby całkowitej.
A potem, ponieważ olewam zająć się tutaj, a następnie to, co robię
nie jest równy 5, ponieważ trzyma adres.
Więc to, co chcę zrobić, to pójść tam i aktualizować zawartość tego adresu
z 5.
>> OK, więc chodźmy przez wszystkie linie jednego po drugim.
Więc kiedy zaczynam tutaj, jeszcze N / A, N / N /
za wszystko w pierwszym linia, bo naprawdę nie mam
zadeklarował jeszcze rzeczy.
A potem druga linia, mam x równa się trzy.
Int gwiazda nie istnieją, samo, jak wcześniej.
>> Teraz robi się ciekawie.
Więc mam zamiar przekazać.
I załóżmy, że adres x jest 12 w systemie szesnastkowym.
Załóżmy po prostu to.
Zrobiłem to.
Więc co ja tu jest przechodząc do pięciu.
Olewam 12.
>> Więc jaką wartość ma mieć?
>> STUDENT: [niesłyszalne].
>> Binky: Przepraszam?
>> STUDENT: [niesłyszalne].
Binky: Tak, jak do niech Zakładam, że jesteśmy tutaj, teraz.
Pytam.
>> STUDENT: [niesłyszalne].
>> Binky: Został on zainicjowany.
>> STUDENT: [niesłyszalne].
Binky: Ponieważ minęło coś do funkcji.
Tak?
>> STUDENT: Adres x.
Binky: To będzie posiada adres x.
I adres x jest 12, dobra.
Więc x będzie trzech, ponieważ tak naprawdę nie zmieniło x jeszcze.
A potem będzie 0x12, więc adres x, bo to
co przekazywane do pięciu.
>> A potem co się dzieje, jeśli staramy się tam?
Co my teraz znaleźć?
Więc jeśli próbujesz drukować gwiazda, będziemy śledzić ten adres
i uzyskać wartość w środku.
I wartość jest po prostu sama wartość, x
ma bo to Adres x, który będzie 3.
Czy jesteśmy dobrze?
>> OK, a następnie teraz, faktycznie tam.
I aktualizujemy co W tym adresem 12.
Robimy to 5.
Więc teraz obaj x i gwiazda są 5.
>> Dlaczego tak jest?
Ponieważ adres x jest 12.
I 12, jak również jej wartości.
Więc jeśli kierujemy 12, jesteśmy po prostu będzie znaleźć x.
Więc co robimy z gwiazda będzie się działo
x, ponieważ zawiera adres x.
OK?
>> I to jest jak sedno poprawki.
Teraz jesteśmy w stanie, z do pięciu, w rzeczywistości
Pamięć dostępu, który mieszkał w głównym.
Więc ta pamięć nie mieszka w celu pięć, jak wcześniej, ten adres 12.
I udało nam się tam i zmienić jego wartość do 5.
>> A potem, gdy wrócimy, zapominamy o.
Zapominamy o star.
I x jest jeszcze pięć.
Więc jeśli chcesz zaimplementować funkcję wymiany,
byłoby po prostu zrobić dokładnie to samo, chyba trzeba int gwiazdy tutaj,
i tak dalej, i tak dalej.
OK?
Czy jesteśmy dobrze?
Fajne.
>> Więc arytmetyki wskaźników.
Jest to nieco trudne temat.
Tak więc okazuje się, że Wskaźniki są tylko liczby całkowite.
Można myśleć o nich jako liczby całkowite.
Bo w pamięci, jak masz Adres pamięci, zero, jeden, dwa, trzy,
cztery, pięć.
Możemy więc podsumować adresów pamięci.
>> I to jest zwykle to, co robisz, gdy jesteś w i tablicy, na przykład.
Tablica jest jak przyległe blok pamięci, z dużą ilością znaków,
na przykład wiele int.
Więc jeśli chcesz, aby przejść do Drugi int lub trzecim int,
Podsumowując można tylko coś pierwszy adres, i masz zamiar się tam dostać.
Więc to jest bardzo przydatne do tego.
>> A co do utrzymania pamiętać jednak to,
że to nie jest tak jak normalny w sensie arytmetyczna
że jeśli masz do czynienia z, powiedzmy, int gwiazda, i dodać 1 do niego,
wtedy nie będziesz dodać 1 do adresu,
masz zamiar dodać 4 do adresu.
Ponieważ int jest 4 bajty.
>> Tak to jest jak chodzenie na tablicy.
Jeśli mamy tablicę i wiele int Następnie staramy się przejść do drugiej,
to w zasadzie tylko zsumowanie adres pierwszego plus 1.
Ale to nie być: po prostu powiedzmy, że adres pierwszego jest 4.
Tutaj, w niniejszym przypadku.
A jeśli suma, więc jest to, co się dzieje.
Mamy int.
Int x równa się pięć.
X ma wartość 5.
I zainicjować ten wskaźnik, int y int gwiazda y równa adres x.
>> Załóżmy, że adres x 4.
Co się wydarzy teraz jeśli suma dodać 1 do r?
To będzie naprawdę suma 4, a nie tylko jeden.
Więc mogę dodać jedno, ale to rzeczywiście dodane 4, ponieważ komputer Smart.
Więc to będzie rzeczywiście dodać przez I razy Wielkość rodzaju wskaźnika.
OK?
>> Tak więc, jeśli to było char np gdyby to było gwiazdą char y,
a jeśli dodać 1 to ten będzie być 5, ponieważ char jest długa 1 bajt.
Dobry?
>> I wreszcie dotarliśmy do wskaźniki i tablice.
Okazuje się, że za każdym razem, masz do czynienia z tablicy,
jesteś rzeczywiście do czynienia ze wskaźnikiem.
Bardzo ładne koncepcyjne powodem jest to, że tablice są bardzo duże.
Więc pamiętaj, że powiedziałem, że za każdym razem przejść rzeczy wokół,
skopiować wszystko.
Więc jeśli masz tablicę to jest naprawdę duży,
naprawdę nie chcę za każdym razem, skopiować wszystko
przekazać ją wokół do innego funkcja, bo to jest po prostu
ogromne ilości pracy.
Więc co można zrobić, to tylko przeszłość adres pierwszego bajta.
I wtedy funkcja będzie miał dostęp do wszystkich elementów w tej tablicy.
Więc przeszedł szereg jego adres, tak adres pierwszego bajtu.
>> Jeśli więc zadeklarować int Tablica 3, tutaj, wiemy
sposób uzyskiwania dostępu do pierwszego elementu używając notacji nawiasu.
Jeśli pamiętasz wspornik zapis, wspornik tablicy 0 jest równa 1.
Cóż, będzie to dokładnie samo, jak tylko tam pojechać i umieścić jeden.
OK, jest dokładnie to samo.
Więc wspornika w zapisie tutaj będzie taka sama jak ta linii.
>> I wiecie co wspornik notacji do wspornika tablicy 1 będzie?
Będzie to po prostu to samo, co ten.
Więc dodać jeden do tablicy.
Przenieść jeden wzdłuż w pamięci.
Idź tam i umieścić dwa.
OK?
A ta linia to samo.
Chcemy, aby przejść do trzeciego okno, więc tablica plus 2.
Idź tam i umieścić trzy.
Tak więc w pamięci, co jest stanie się to, że jesteśmy
będzie mieć 1, 2 oraz 3, jako trzy elementy tej tablicy.
>> Mogliśmy zrobić to za pomocą nasz znajomy zapis wspornik.
Chcę tylko wiedzieć, chłopaki że są one tym samym.
OK, pytania o to?
Nicea.
Teraz mam zamiar oddać go do Hannah,
>> HANNAH: Yay, Yee-haw.
>> Binky: Mówiąc o Pamięć i artykuł rzeczy.
[APPLAUSE]
>> HANNAH: Cześć, fajnie, więc jesteśmy Porozmawiamy trochę więcej
o pamięci, która po prostu adresowane za pomocą wskaźników.
Tak więc istnieją dwa główne części pamięć, że jesteśmy zainteresowani.
Mamy stos, który rośnie do dna, i sterty, która
zachodzi od góry.
A stos będzie się trzymać wszystkich naszych zmiennych instancji.
Tak więc każda funkcja nazywa się dostaje własne małe ramki na stosie.
Tak Gabe wspomniano wcześniej, jeśli ponownie i ponownie wywołać funkcję,
będziemy układać rzeczy w górę na stosie.
>> I podobnie, kupa, który zaczyna się w górnej
będzie posiadać wszystkie pamięci że dynamicznie przydzielać.
I tak jak my dynamicznie przydzielić pamięci,
będzie zejść w kierunku dna.
Kilka rzeczy, aby mieć świadomość, kiedy używamy stosu i sterty,
ze stosu, jeśli mamy zbyt many-- niech say-- wywołań cyklicznych,
a my ponownie wywołanie funkcji, i znowu, i znowu, i znowu,
i to układanie się, układania, układanie się.
I to będzie rozbić się hałdy.
Jedziemy do wyczerpania pamięci.
To będzie powodować Problemem dla komputera.
I to się nazywa przepełnienie stosu.
Więc to na pewno coś ci powinni być świadomi i starają się unikać.
A kupa, trzeba pamiętać aby przypadkowo nie wyciek pamięci.
Za każdym razem używasz malloc, nie zapomnij zwolnić tę pamięć.
W przeciwnym wypadku będziesz tylko być na stercie zmarnowany,
a komputer nie będzie wiedział, że jest do korzystania z tej pamięci.
Więc te kilka rzeczy być bardzo ostrożnym z po
masz do czynienia z stosu i sterty.
Wszelkie pytania z tym?
Niesamowite.
>> OK, fajnie.
Więc tego rodzaju ma to samo Pomysł jak przepełnienie stosu, gdzie
jedziemy dalej Granice tego, co pamięć
jest, że powinniśmy być w stanie wykorzystać.
Więc weź, na przykład, bufor, albo może po prostu myśleć o tym jako tablica.
I powiedział: OK, mamy zamiar utworzyć tę miłą tablicę.
To będzie ciąg.
Albo to będzie przechowywać znaki.
A to po prostu się przywitać.
I to jest nieokreślona.
To wszystko.
>> Ale gdybym był ktoś zły i chciał zrobić coś złego z tej tablicy, co
Mogę zrobić, to spróbować napisać poza koniec ciągu.
A jak zobaczysz, jeśli Piszę tyle daleko,
Może faktycznie wpływać adres zwrotny.
A jeśli zacznę mieć wpływ adres zwrotny,
I mieć wpływ na program rzeczywiście działa.
I zamiast wracać, ci wiedzieć, jak szczęśliwy ciąg witam, ja
może zrobić coś złego, jak udać się do gdzieś w komputerze, nadal
pamięci, zmienić go, co chcę zrobić.
Więc to, co to będzie wyglądać to jeśli tylko trochę go wypełnić
z losowej wartości śmieci, w tym przypadku po prostu.
I wtedy, kiedy rzeczywiście dostał się do adresu pamięci,
Zacząłem go czymś napełniania że zrobił to, co chciałem zrobić.
Wszelkie pytania o przepełnienie bufora?
Niesamowite, latające tuż przez tych rzeczy.
>> OK, więc rozmawialiśmy dużo o wskaźnik z Gabe.
Jak mamy rzeczywiście uzyskać wskaźnik?
W jaki sposób możemy uzyskać adres w pamięci?
Cóż, możemy wykorzystać ten miły wywołanie funkcji malloc, która
dostanie Mały kawałek pamięci,
w szczególności w kupa, jak mówiliśmy,
i to będzie oddać wskaźnika do tego adresu w pamięci.
A argument, że dać do malloc
to ile miejsca w pamięci chcemy.
>> Więc widać, rozmiar w bajcie.
Powiedzmy, na przykład, lub w rzeczywistości, w tym przykładzie,
mamy tyle przeznaczyć miejsca dla 10 liczb całkowitych.
Więc chyba to, co będziemy chcieli umieścić tutaj jest tablicą 10 liczb całkowitych.
Więc dajemy mu rozmiar int, który Dowiedzieliśmy się, jak wiele bajtów?
STUDENT: 4.
HANNAH: 4, piękny, i chce 10 osób w rzędzie,
tak, że mamy wystarczająco dużo miejsca do przechowywać wszystkie 10 liczby całkowite, w tym przypadku.
Coś bardzo ważne, za każdym razem wywołać malloc,
trzeba sprawdzić, null.
Jeśli nie sprawdzić, null, dobrze, malloc, jeśli zabraknie miejsca
i nie może dać każdy więcej pamięci, zwróci wartość null.
Tak więc, jeśli nie sprawdzić, malloc może zwróci null.
I wtedy, gdy staramy się wyłuskanie wskaźnika null,
mamy zamiar uzyskać winy segmentacji, którego będziemy mówić o teraz.
Niesamowite.
>> OK, pytania z malloc?
Tak?
>> STUDENT: Czy sprawdzanie pusty [Niesłyszalne] nie rób tego na quiz?
>> HANNAH: Oczywiście, pytanie to matter-- w quizie,
dostaniesz punkty wyłączyć, jeśli nie sprawdzić dla wartości null?
Tak, dostaniesz punkty off jeśli nie sprawdzić, null.
Za każdym razem wywołać malloc, zarówno na Quiz i twoi psets i w prawdziwym życiu,
trzeba sprawdzić, null.
Dobre pytanie.
>> GABE: Co, jeśli nie uwolni?
HANNAH: Gabe chce wiedzieć co jeśli nie za darmo.
Wtedy będziemy mieć wyciek pamięci w naszym sterty.
Jeszcze jakieś pytania?
Tak?
>> STUDENT: Czy you-- przejść Przepełnienie bufora bardzo szybko ponownie?
>> HANNAH: Jasne.
Pytanie możemy przejść nad Naprawdę szybkie przepełnienie bufora.
Wróćmy do tych preparatów.
Więc bufor, można po prostu myśleć o tym, jak tablicy, prawda?
Masz trochę miejsca w pamięci.
A kiedy po raz pierwszy tworzymy tablicę, wiemy, że tablice mają stałe rozmiary,
lub naszego bufor ma określony rozmiar.
>> Więc powiedzmy, że w tym przypadku mamy tylko wystarczająco dużo miejsca, aby napisać ciąg komentarzy.
Jeśli mijamy, że granica, jeśli mijamy co nasza tablica powiedzieliśmy może posiadać,
moglibyśmy zacząć pisanie do pamięci
że komputer nie robi chce nam napisać do.
A konkretnie, czy trafiliśmy coś w zamian
adres funkcji, która, jak każdy inny element pamięci
jest po prostu gdzieś w komputer, można rzeczywiście
to zmienić i zacząć robić złe rzeczy.
Odpowiedź na Twoje pytanie?
Niesamowite, coś jeszcze?
Tak?
>> UCZEŃ: Tak stos [niesłyszalne] ci powiedział przejść od dołu w górę.
W zasięgu stosu, nie Pamięć iść z, jak,
z góry na dół dotyczące każdej przerwie?
>> HANNAH: Jak you-- odroczyć do Roba na ten jeden.
>> ROB: będzie rosnąć w tym samym kierunek jak stos rośnie.
HANNAH: OK.
ROB: Więc ja się mylić.
To ma być abstrakcją.
HANNAH: OK.
ROB: To prawda.
Tak więc, jeśli stos rośnie w górę, a następnie generally-- go
nie musi tak być. ale można zadeklarować int x.
Następnie zadeklarować int y.
Następnie int x będzie na ogół niższe niż na stosie int y.
Ale to po prostu fakt.
To nie jest tak ważną rzeczą nasion.
>> ROB: Więc znowu była tylko kwestia co się dzieje, każda klatka buduje.
Tak więc każda funkcja dostaje Mały kawałek stosu.
A jak idziesz do góry, w terminie, który mały kawałek, w tym ramy,
powiemy, że zmienne w tym ramy również przenieść się.
Pytanie?
>> ROB: Wystarczy być na mikrofonie.
HANNAH: Oh, tak.
ROB: będę mówić do Ciebie.
HANNAH: Oh, tak, OK.
ROB: Wyjątkiem jest dla tablic i strukturach,
gdzie macierze, niższe indeks w tablicy,
i w strukturach na wyższe pola w strukturach
są na pewno w niższych adresów później niż wartość w tablicy.
Więc te są gwarantowane.
Ale w jakieś szczególne zmienne, jak int x, int y wewnątrz funkcji,
nie ma potrzeby związek między ich adresami.
HANNAH: Kolejne pytanie tutaj?
STUDENT: Więc w buforze przepływu, tylko przepełnienia buforu
Gdy tylko stało nie, jak, przypisany
Ilość macierzy że wtedy jest większa?
Jak, można?
Więc jeśli pytasz o coś z user--
>> HANNAH: Mm-hm.
STUDENT: mogą przymusowo dać coś w zamian
to jest większy niż cokolwiek ty przeznaczone na nich?
HANNAH: Jasne, tak Pytanie było w zasadzie,
może dać użytkownikowi więcej niż prosisz?
UCZEŃ: Tak.
HANNAH: Cóż, można zapobiec użytkownik z robić.
Można wyraźnie powiedzieć nie daj mi więcej, niż przez bajtów x ilość
Mam tylko wam pokój dla x liczba bajtów, x ilość znaków.
Więc to jest coś, co chcesz, aby zapobiec.
Tak?
Co jest różnica pomiędzy przepełnienie stosu i przepełnienia buforu?
>> HANNAH: OK, więc stos overflow-- och, co
jest różnica między stosu Przepełnienie i przepełnienie bufora?
Dlatego chcemy, aby myśleć o przepełnienie stosu dzieje się, kiedy jesteśmy rzeczywiście
układania tych wywołań funkcji.
Powiedzmy, że masz funkcję rekurencyjną, ponieważ wiemy, że za każdym razem
wywołać funkcję, to dostaje własnej ramki na stosie.
>> Więc stos zbyt wysokie, a następnie zaczniemy przelewać.
I używamy zbyt dużo pamięci, I nie mamy nigdzie w lewo.
Dostajemy ten błąd.
>> Przepełnienie bufora jest w ramach programu.
Chcemy, może nie koniecznie zabraknie pamięci w taki sam sposób
że moglibyśmy jeśli mamy układania aż tak wielu wywołań funkcji,
ale piszemy obok pamięci że wiemy, że możemy korzystać.
A to pozwala nam robić złe rzeczy.
Tak?
>> ROB: Tak, możesz aby tylko powtórzyć to,
ale można też myśleć z przepełnienie stosu
tak jak szczególnego rodzaju z przepełnienia bufora.
Albo po prostu myśleć o stos jako naprawdę duży bufor.
Wtedy, kiedy przepełnienia stosu, to trochę jak przepełnienia bufora.
Ale przepełnienie stosu jest tylko specyficzny termin używany, gdy stos
Sam przelewa.
>> HANNAH: Tak, tak, aby powtórzyć dla filmu,
to można myśleć o przepełnienie stosu jako specyficzny typ przepełnienia bufora.
Cool?
Jakieś pytania, zanim udamy się?
Niesamowite.
>> OK, fajnie, więc porozmawiajmy o pewne wspólne komunikaty o błędach.
To jest coś, co ma pokazał się na wielu konkursach,
więc coś, co jest warte biorąc drugi przyjrzeć.
Jestem pewien, że już napotkał co najmniej niektóre z tych
jak robisz ustawia twój problem.
Więc upewnij się, że można mówić o nich na quiz.
>> Tak więc pierwszy jest Błąd segmentacji.
I to za każdym razem mamy próby uzyskania dostępu do pamięci
że nie wolno nam dostęp.
Więc migh widzieliście tego, Na przykład, w podgrupach.
W przypadku wykrycia kolizji zwróci null, a następnie
Próbowałem coś zrobić z tym wartość null,
Komputer da Ci winy segmentacji.
Tak jeden, ważne jest, aby zrobić, aby unikać tego
jest, aby zawsze sprawdzić, null.
>> Możesz również postrzegane niejawna deklaracja funkcji.
Więc to jest to, co się dzieje, kiedy Allison pokazałem
jak zrobić prototyp, prawda?
Więc powiedzmy, że mamy pewne Funkcja zdefiniować.
Powiedzmy kostkę.
I który przechodzi u dołu naszej funkcji, pod głównym.
>> Jeśli zapomnij powiedzieć o komputer kostka, gdy główny próbuje zadzwonić kostkę,
Komputer będzie, jak, o mój Boże.
Nie mam pojęcia, co to znaczy.
Nie wiem, co zrobić, tutaj.
Więc prototyp mówi nie martw się.
Mam zamiar powiedzieć.
>> To będzie pochodzić.
Nie krzycz na mnie.
Nie daj mi ukryte deklaracja funkcji.
Więc jeśli masz ten problem, jeden co masz zamiar chcesz zrobić
to upewnij się, że masz swój prototyp.
OK?
>> I ostatnie, ale nie najmniej, Identyfikator nierejestrowana
jest zasadniczo przy próbie użycia zmienne, które nie zostały uznane.
Więc nagle zacząć mówiąc, jak N powiększonej plus.
I komputer mówi co n?
Nigdy nie powiedział mi, n był rzeczą.
>> Więc jedna rzecz trzeba upewnić się, nie jest powiedzieć komputerowi, co n jest.
Tak na przykład, n może być liczbą całkowitą.
I wtedy będzie można uniknąć tego błędu.
Wszelkie pytania dotyczące typowych błędów?
Tak?
>> STUDENT: Dla niejawna Deklaracja funkcji,
może to być również, że pominięto jeden bibliotek miałeś
obejmujące, raczej niż prototyp?
>> HANNAH: Tak, tak, Pytanie było, można
także ten błąd, jeśli zapomniałeś to biblioteka.
>> UCZEŃ: Tak.
>> HANNAH: Absolutnie, ponieważ w ten sam sposób,
które chcemy umieścić nasze prototypy przed główną funkcją,
jeśli mamy bibliotekę, ci będą zasadniczo do obejmują prototypów
obejmują definicje z tych funkcji.
Świetne pytanie.
>> STUDENT: Dla segmentacji przyczepić, to, że również
stanie, jeśli, tak jak próbował dostępu do zmiennej
jak, w innym [niesłyszalne] niż zostało to zadeklarowane w?
HANNAH: Jasne, że tak będzie uzyskać winy segmentacji
jeśli próbował uzyskać dostęp zmienna poza zakresem?
Czy to było pytanie?
UCZEŃ: Tak.
HANNAH: Piękny.
Więc pewnie, masz zamiar dostać nierejestrowana błąd identyfikator zamiast.
Więc to po prostu powie Nie wiem co to jest.
Fajne, coś jeszcze?
Tak, OK, piękne.
>> W porządeczku, więc rekurencji.
Więc już wspomniałem kilka razy że możemy uzyskać przepełnienie stosu
dlatego, że dzwonisz naszym Funkcja rekurencyjna tak wiele razy.
Dostajemy wszystkie te stos Ramy, bla, bla, bla.
Co jeszcze jest rekurencyjna funkcja?
Cóż, jest funkcja rekurencyjna każda funkcja, która nazywa siebie.
>> Niektóre rzeczy być świadomy, kiedy realizują funkcję rekurencyjną,
Nie zapomnij podać sprawę podstawową.
Baza jest przypadek Punkt, w którym kończymy.
Tak więc, na przykład, jeśli mamy kodowania , Powiedzmy, Fibonacci rekurencyjnie,
Chcemy mieć pewność, że gdy mamy do lub pierwszego numeru Fibonacciego 0,
te dwa numery są te przypadki, bo te nie są zależne
na rzeczy, które przyszło wcześniej.
Ci mają własne wartości.
>> Niektóre plusy do rekursji, które jest Pytanie widzieliśmy w ostatnich konkursach.
Mogą one prowadzić do bardziej zwięzłe, elegancki kod.
I wiele funkcji, wiele różnych algorytmów,
rzeczywiście nadają się do rekursji.
Ich definicja może być rekurencyjnych w sobie.
Więc Fibonacciego jest jeden.
Silnia jest jednym.
Sortowanie przez scalanie znaczy jedno- wszystko rzeczy, które możesz patrzeć.
OK, jakieś pytania?
Tak?
>> STUDENT: Czy przypadek rogu podobny do przypadku bazowego?
Albo jest to, że dla niektórych innych rodzaj [niesłyszalne]?
>> HANNAH: Jasne, tak Sprawa jest any-- więc narożnik
Sprawa jest taka sama, jak róg przypadku podstawowym?
Sprawa rogu jest coś, że twój Kod może zachowywać się trochę inaczej.
Wariant podstawowy jest rodzajem związanych, w że są jak szczególnych przypadkach
że chcesz patrzeć.
Ale idea przypadku bazy jest to, że chcesz się z funkcji rekurencyjnej
zatrzymać w pewnym momencie.
Nie może utrzymać nazywająca siebie na zawsze.
To musi się zatrzymać w pewnym momencie.
>> ROB: Tak, często, wasze przypadki bazowe Może być przykładami zasad narożnych.
>> HANNAH: Prawo, fajne, cokolwiek?
>> STUDENT: Czy mógłbyś wyjaśnić opiera trochę więcej?
I nie bardzo rozumiem [Niesłyszalne] przypadki bazowe.
>> HANNAH: przypadków bazowych?
>> STUDENT: przypadki bazowe, tak.
>> HANNAH: O tak, na pewno.
Zobaczmy.
Czy mamy tu kredy?
Tak, my.
OK, więc bardzo szybko, będę Staram się pisać na tyle duże,
więc można zobaczyć na ekranie.
Porozmawiajmy o tym, naprawdę szybko, Fibonacciego.
Więc dam ci sekwencji Fibonacciego.
Możesz sprawdzić definicję.
>> Zasadniczo, każdy numer w kolejności jest sumą dwóch poprzednich numerów.
OK, więc sposób, że tylko opisane Fibonacciego,
słychać rekurencję, prawda?
Kiedy powiedziałem, że każdy numer jest Suma dwóch poprzednich liczb
można powiedzieć OK.
Cóż, n-ty Fibonacciego number-- więc niech
że mamy tej funkcji nazywa fib-- fib n
będzie równa fib n minus 1 plus-- przykro,
my przejściem do następnej linii ponad here-- fib n minus dwa.
>> OK, więc to działa świetnie, jeśli jesteś patrząc na przykład zero, jeden,
dwa, trzy, cztery, Piąty numer Fibonacciego,
gdzie można powiedzieć, że 5 jest równe 2 plus 3.
Ale co, jeśli jesteś na początku?
Co zrobić, jeśli jesteś po prostu uderzając te dwie pierwsze wartości?
>> Aby uzyskać ten jeden, nie można powiedzieć, dodać dwa poprzednie,
bo tego zera and-- nie wiem.
Więc w pewnym momencie musimy się zatrzymać.
W pewnym momencie trzeba powiedzieć, że te dwa po prostu mają własne definicje.
Numer 0 Fibonacciego 0.
I pierwszy numer Fibonacciego jest 1.
>> Więc sposób mogę zakodować to, że powiedziałbym, jeśli n jest mniejsza niż dwa,
a potem po prostu wrócić n.
I to będzie mój przypadek bazowy.
W ten sposób wiem, aby zatrzymać z funkcji rekurencyjnej.
Czy to jasne?
Niesamowite.
Wszystko inne na rekursji?
Piękny.
>> Niech szybko mówić o wyszukiwania i sortowania prowadzone razy.
A potem dam Davin niektórych czas, aby porozmawiać o przykłady kodowania.
Więc tutaj są głównym wyszukiwarka i rodzaju, które powinieneś wiedzieć o.
Guarantee-- nie mogę zagwarantować, bo nie widziałem quiz--
ale pojawia się quizu po quizie po rzucić.
Więc na pewno korzystać z tego wykresu.
Jak podjąć ten wykres.
Umieść go na swojej ściągawki.
Będziesz szczęśliwy człowiek.
>> To mówi nam czasów pracy każdego tych algorytmów sortowania i wyszukiwania.
Więc wyszukiwarka liniowy, można zobaczyć przebieg czas, a sam z wyszukiwaniem binarnym.
Przejść nad tym, co tych algorytmów zrobić, ogólną ideę.
Spójrz na jakiś Pseudokod, jeśli nie kodować się.
>> Zobaczysz, że sortowanie bąbelkowe ma górny związana w najgorszym przypadku n kwadratu.
Jeśli więc nasza tablica była całkowicie wstecz przed chcieliśmy go rozwiązać,
moglibyśmy powiedzieć, że jest to zajmie n kwadratowe kroki.
Ale w najlepszym przypadku tak dolna granica dla najlepszego przypadku
będzie, jeśli to już doskonale sortowane.
Wtedy wszystko, co musimy zrobić, to sprawdzić, czy nie jest to klasyfikowane.
Czy istnieje pytanie tutaj?
>> STUDENT: kiedy chcesz używać rodzaju?
Sortowania.
Jestem po prostu ciekawy.
>> HANNAH: Kiedy planujesz chcesz używać wyboru rodzaju?
To jeden?
Jeden, który jest n do kwadratu w obu przypadkach?
>> STUDENT: [niesłyszalne].
>> HANNAH: Więc to jest bardzo różne.
Jeśli masz konkretne Wymagania dla programu,
jak rzeczy, jak gdyby po prostu powiedział: wdrożenie search-- sorry--
realizacji swego, będziesz prawdopodobnie chcesz iść
w jednym z tych, które ma najlepszy przypadek n,
lub dolnej granicy w najlepszym przypadku n.
Ale nie może być pewne rzeczy, jak, powiedzmy,
Swapy są naprawdę kosztowne z jakiegoś powodu.
Następnie, co chcesz zrobić sortowanie bąbelkowe, bo Ciebie
musisz zrobić tak wiele swapy, takie rzeczy.
Wszelkie other-- tak?
>> STUDENT: Czy jest [niesłyszalne] powiedzieć, że [niesłyszalne]?
HANNAH: To jest jedna rzecz by powiedzieć, że
jeśli szukasz na realizację.
I rzeczywiście tak myśleć o tym, dlaczego to n
kwadrat jest to, że mamy do pracy przez naszą tablicę długości n,
za każdym razem, co najwyżej, n swapów.
I musimy zrobić ten proces n razy.
>> Więc kiedy masz do co najwyżej n swapy i dla n przebiega tablicy,
nie będzie n do kwadratu.
Ale tak, to zostaną ujawnione dzięki tej podwójnej pętli for,
jak pytanie asked-- lub zagnieżdżonych pętli, powinienem powiedzieć.
OK?
>> A następnie połączyć rodzaju, które jest najszybszym rodzajem teraz,
lub które omówiliśmy w CS50, wiem, że algorytm jest głównym
ten pomysł włamania do sztuk i wtedy posortowanych
łącząc razem te posortowane bitów.
I będzie się nam log n log n.
Wszelkie pytania dotyczące poszukiwań i rodzaju, zanim go przekazywać?
Zobaczmy.
>> Och, związane list.
Niestety, mam jeszcze jeden temat.
OK, niesamowite, związane list.
Problem z tablicami, mają ustaloną wielkość.
Więc jeśli nie wiesz, jak duży Twój wkład będzie,
nie chcesz, aby utworzyć tablicę.
Bo jeśli tworzymy tablica, że ​​jest zbyt mały,
możemy uruchomić do przepełnienia bufora.
>> Więc zamiast tego, co mogliśmy zrobić coś z list, które powiązanych
pozwala nam na dynamiczny wielkości, struktury danych
który pozwoli nam na przechowywanie bardziej elastyczne ilość danych.
Tak więc w ciągu każdego węzła w naszym listy powiązane, mamy dwa kawałki.
Mamy rzeczywistą wartość, że przechowuje.
Więc to jest tylko rzeczą, którą będzie patrz w tablicy, na przykład.
A potem również śledzić wskaźnik do następnej rzeczy w pamięci.
>> W przeciwieństwie do tablic, które wiemy wszyscy będą
aby być: elementy tablicy są jednym po drugim w memory-- związane
list może być w dowolnym miejscu w pamięci.
Są dowolnych miejscach.
Więc gdybyśmy rzeczywiście iść je znaleźć, możemy
trzeba śledzić Następną rzeczą na naszej liście.
>> A następnie w celu poznania w przypadku, gdy lista jest jako całość,
wszyscy musimy śledzić to Pierwszym elementem naszej listy.
I że będziemy pozwalają nam po drodze.
>> Tak to jest, jak można określić tryb.
Jest to świetna okazja, wykorzystać strukturach.
Bo masz ten pomysł, dobrze, dla danego węzła, mam dwa kawałki.
Mam wartość rzeczywistą sam.
A potem mam wskaźnik do Kolejnym elementem w połączonej listy.
Więc widać, mamy liczbę całkowitą n, który będzie rzeczywista wartość,
a następnie wskaźnik do Węzeł, zwany dalej.
Tak, że będzie następny elementem naszej listy.
UCZEŃ: Tak?
Czy trzeba określić, że gwiazda jest jak struct?
>> HANNAH: Tak, tak, od tego jest prawie jak rodzaj,
wydaje się rekurencyjny definicja w tym my
trzeba wiedzieć, co jest węzeł wewnątrz do znalezienia węzła.
Ponieważ tak nie jest w rzeczywistości wiedzieć, co jest całkowicie węzła
aż dojdziemy do końca this-- i po tym można po prostu nazwać to
node-- wewnątrz tej definicji, musimy nazwać węzeł struct.
Świetne pytanie.
Coś jeszcze?
Tak?
>> STUDENT: Dlaczego my powiedzieć węzeł dwa razy?
Bo kiedy byliśmy w [niesłyszalne] po prostu musieliśmy to zrobić w średnikiem,
ale teraz mamy do stwierdzenia, że węzeł struct? [Niesłyszalne].
HANNAH: Więc wierzę W ostatnim przykładzie
my właśnie stworzenie w każdej chwili chciał wykorzystać studenta po tym, ty
musiałem użyć struct node-- Jestem sorry-- studenta struct.
To pozwoliło nam, po fakcie, po prostu węzeł wykorzystanie dodać nowy typ, zasadniczo.
To ma sens?
Więc musielibyśmy wrócić i przed spojrzeć na kod.
Ale przypuszczam, że nie używać typedef.
I zadał pytanie, dlaczego musimy użyć typedef?
Typedef pozwala nam uniknąć Słowo struktura na początku.
Tak?
STUDENT: Jakie pytania przyjdzie się
chodzi w sensie węzły i związane listy?
>> HANNAH: Więc jedno jest można powiedzieć, w jaki sposób możesz przeglądać połączonej listy?
OK, bo to nieco bardziej skomplikowane
niż jeśli szukasz za pośrednictwem tablicy.
Możemy tylko patrzeć na elemencie zerowym, jeden element, element dwa, bla, bla,
bla.
Jeśli chcemy, aby szukać dzięki połączonej listy,
my rzeczywiście podążać ten mały labirynt wskaźników.
Więc rzeczywiście iść przez to bardzo szybko.
Co możemy zrobić w zamówić to-- Powiedzmy, że
chcą po prostu iterację nasz całkowicie związana lista.
Chcemy zacząć od głowy.
A następnie, w celu przejść do następnego elementu,
a nie tylko zwiększając o jeden jak moglibyśmy w przejściu przez tablicę,
my rzeczywiście będzie kolejnemu wskaźnik,
więc możemy dowiedzieć się, gdzie w Pamięć Kolejnym elementem jest.
Tak wiem, że to nie wystarczy wziąć to wszystko w tej chwili,
ale musisz te slajdy.
Więc można przejść przez to trochę wolniej.
Ale zasadniczo, co chcemy zrobić, to wykonaj następujące wskaźniki
przez całości połączonej listy.
Więc to jest pytanie możesz zostać poproszony.
>> Coś zauważyć z wstawiania, powiedzmy,
chcieliśmy umieścić nowy element z przodu naszej listy.
Musimy być bardzo ostrożni o kolejności, w której
przypisane kursory.
Bo powiedzmy, że ja po prostu powiedział OK.
Dodać punkt głowy do tego nowego elementu.
Wystarczy zrobić to wskazać na jeden Następnie mamy zasadniczo stracił resztę naszej liście,
bo nie pamiętam, gdzie dwa życia.
>> Tak więc mamy do czynienia w bardzo konkretne zamówienie.
Po pierwsze, aby nowy punkt w głowę elementem.
A potem robimy głowę wskazuje na nowy element.
Zobaczmy więc, co to wygląda z arrows-- tak po prostu.
Więc najpierw nowe punkt do starej głowie elementem.
A teraz, mamy głowę aby wskazać nowy pierwszego elementu.
Wszelkie pytania z tym?
>> OK, tutaj jest jakiś kod ponownie, coś przyjrzeć się nieco później.
A teraz zwracam go do Davina dla GDB i trochę praktyki
kodowanie na papierze.
Piękny.
>> ROB: I Rob.
>> HANNAH: Och, Davin i Rob.
Przykro mi.
>> STUDENT: Woo!
>> ROB: Dzięki.
>> DAVIN: Czy chcesz powiedzieć, wszystko bardzo szybko?
ROB: Tak, tak.
DAVIN: Kiedy jestem w górę.
OK, a Rob kładzie mikrofon, więc co to GDB?
Każdy powinien widziałem w GDB klasy, a także w godzinach pracy.
I powinno być go używać.
Więc co jest GDB?
Ktokolwiek?
>> Student: To debugger.
>> DAVIN: To debugger.
A co to pozwala zrobić?
Jak, dlaczego lubimy GDB?
STUDENT: Aby spowolnić program.
DAVIN: Tak, więc można chodzić przez to jak człowiek tempo.
A więc jakie są polecenia można zrobić?
Cóż, prawdopodobnie jest przerwa Twój ulubiony poleceń.
Dlatego, że pozwala złamać Program i faktycznie przejść przez to
linia po linii.
>> Uruchom pozwala go uruchomić.
Następnie, jak wchodzenie przez.
Co znajduje się między obok i kroku?
Czekaj, że głośno.
To było prawidłowe.
>> STUDENT: [niesłyszalne].
>> DAVIN: Tak, niesamowite.
Więc jak, następny i krok, jeśli you're-- powiedzmy, że masz funkcję
zdefiniować.
Powiedzmy, że niektórzy w swojej głównej funkcji, i jesteś po prostu uderzając obok, obok,
następny.
Jesteś rzeczywiście będzie wykonywania tej funkcji,
ale masz zamiar skakać nad nim.
Jeśli trafisz krok, lub s lub cokolwiek, jesteś
będzie faktycznie skok do tej funkcji,
a następnie można trafić następna aby zobaczyć różne połączenia
wewnątrz danej funkcji.
Tak?
>> STUDENT: Czy istnieje sposób skakać, jak, się wycofać?
DAVIN: Zakończ, tak, zakończyć skok cię.
Tak to się kończy, że Funkcja, a następnie jesteś
będzie z powrotem w głównym, na przykład.
Wydruk będzie go wydrukować jeden raz.
Coś zawsze używam jest wyświetlacz.
Wyświetlacz będzie go wydrukować stale na całym całości
z programu.
>> Na przykład, jeśli jesteś w pętli for i
chcę zobaczyć, jak coś się zmienia, a ty nie chcesz, jak, stale
robić jak print, druku, druk, ekran
wyświetli tej zmiennej w sposób ciągły, za każdym razem trafisz Dalej.
I kontynuować.
Więc GBD, to GDB.
>> Student: Co znajduje się jeden gdzie [niesłyszalne]?
DAVIN: Co to jest?
>> Student: Co the-- zmienne lokalne.
ROB: Jest coś, co w rzeczywistości jak miejscowi albo coś.
I can't--
>> DAVIN: To może być coś w tym stylu, tak.
>> HANNAH: W miejscowych?
>> DAVIN: To jest to.
To jeden.
ROB: Piękny.
>> DAVIN: Tak.
>> Student: Co dalej robić?
>> DAVIN: To continues-- więc jest to po prostu zamierza kontynuować swoje programy.
Więc jeśli złamać i uderzyć dalej, to będzie
po prostu uruchomić ten program, aż trafi, że przerwy ponownie.
Tak na przykład, jeśli wybuchła w funkcji,
i masz zamiar zrobić, jak na pętli lub coś w tym stylu,
i trafisz dalej, to będzie dalej i wrócić do tej przerwie.
Czy nie ma przerwy, to będzie kontynuować i zakończyć program.
>> ROB: Więc tak jak działają przystanki na pierwszy punkt przerwania
trafisz, jeśli Ciebie to hit dalej, to będzie trzymać
będzie aż będzie następny punkt przerwania.
I dalej pójdzie do następnego przerwania.
DAVIN: Wszelkie inne pytania dotyczące GDB?
Więc myślę, że w przeszłości, prosiliśmy, co
GDB jest i dać Przykładem niektórych rzeczy
można zrobić z GDB, więc naprawdę proste, ale tak.
Proszę bardzo.
I węzły?
>> ROB: Tak, tak, w jakim kierunku to było?
Student: To było to.
DAVIN: Poczekaj.
ROB: Ten facet?
DAVIN: To jeden.
ROB: Ten facet, oh, nie zdawałem sobie sprawy.
Więc nie były jasne na co the-- ja nie
wiem, kto to was-- ale pytanie.
Nie wiemy dokładnie, co pytali o to, tak po prostu
coś wyjaśnić.
Więc po pierwsze, jak już wcześniej powiedziałem, typedef masz zawsze przy użyciu tylko
tworzenia pseudonimu dla typu.
Więc tutaj, pseudonim jesteśmy tworzenie jest dla tego typu węzła struct.
>> Więc po pierwsze, ignorując w ten węzeł typedef, więc ta struktura węzeł kręcone
przygotować się do następnego kręcone klamra jest typ węzła struct.
I musimy się do tego węzła tam, bo
trzeba odwołać węzeł tutaj.
Więc z tego typu rekurencyjnego struct, trzeba dać tej struktury nazwę,
bo nie mogłem powiedzieć węzeł struct tutaj.
Podczas gdy przed z uczniem kiedy zostały wpisane, jak sądzę,
nie mają do powiedzenia Student znajduje się, bo my
nie powiedzieć struct Student wewnątrz samego struct.
Więc to, że rekurencyjne zmusza nas do powiedzenia tam węzeł.
>> Ten węzeł jest tylko nazwa jesteśmy dając do węzła typedef.
Tak, że węzeł nie jest sama, jak węzeł.
Ale to jest węzeł struct sama, jak węzeł struktury.
DAVIN: Więc kiedy zadzwonisz, jak, węzeł w funkcji main,
nie będziemy powiedzieć węzeł struct.
Można tylko powiedzieć, węzeł, ponieważ węzeł jest different-- jest w zasadzie
mówisz, OK.
Zamiast konieczności połączenia węzeł struct w moim kodu,
Chcę tylko, aby zmienić jego nazwę jako węzła, aby ułatwić.
>> ROB: Jeśli zawsze używać typedef, to
to jedyne miejsce, będziesz miał zadeklarować zmienną z węzła struct
gwiazda, tak.
>> DAVIN: OK, więc ostatnia część jest trudno nauczyć because--
ROB: Co?
>> DAVIN: Bo to kodowanie na papierze.
Więc co roku mamy Kod na pytania papieru.
Więc myślę, że w zeszłym roku, 12 z 80 punktów były Kod na papierze.
Rok wcześniej, 10 z 80, Rok wcześniej, że 20 na 100,
więc sporo z nich.
Więc masz zamiar być w stanie kodować się te funkcje ręcznie.
>> Więc pomyślałem, możemy przejść Kilka z nich i zobaczyć, jak ludzie,
rodzaj spacer je powoli z ludźmi.
Więc ogólnie, strlen i atoi były bardzo popularne.
W zeszłym roku, myślę, że mieliśmy GetPositiveInt i RandomInt.
Ale pow, więc moc, także pozytywny zbyt.
Miejmy tylko przejść może jedna lub dwie spośród nich razem.
Co ludzie chcą zobaczyć?
>> STUDENT: atoi.
UCZEŃ: Tak.
DAVIN: atoi?
STUDENT: [niesłyszalne].
DAVIN: OK, będę to zrobić na forum.
Czy masz preferencje jeśli robię to tu czy tam?
Nie, Gabe mówi nie.
>> ROB: I to jest ogólne myśli na te pytania kodowania.
Spróbuj napisać coś.
Nie pozostawić puste.
>> DAVIN: Tak.
ROB: Jeśli można uzyskać powrót typu prawidłowe,
czy może moglibyśmy dać go do ty, ale jeśli możesz, jak,
Napisać ogólną podpisu funkcji, Jeśli można uzyskać przypadki bazowe prawidłowe,
lub przypadki, narożne lub pamiętając czek na null,
tak długo, jak masz jakiś rzeczy, to być może
może dać Ci kilka wskazuje na problem.
Nie należy po prostu zostawić to pole puste.
>> DAVIN: Tak, i jeśli są po prostu całkowicie
zastanawiał się, jak rzeczywiście przekształcić się w kodzie.
Jeśli piszesz Pseudokod, to jest całkiem dobre.
Więc jak to jest, to jest sześć punkt pytanie i napisać poprawne Pseudokod,
będziesz miał co najmniej dwa punkty.
Więc nie tylko pozostawić je puste.
Staraj się umieścić coś.
>> ROB: To musi być prawidłowe pseudokod, choć.
>> DAVIN: Tak.
ROB: Tak więc jesteśmy na ogół są mniej wyrozumiali dla błędów w Pseudokod.
Davina: OK, więc chłopaki chciałem zobaczyć atoi.
OK, więc po prostu really-- więc co chcesz zrobić
jest masz zamiar być podane jakieś liczby.
Ale liczba ta nie jest będzie int, prawda?
Co to będzie?
>> STUDENT: [niesłyszalne].
>> DAVIN: To będzie ciąg, prawda?
Więc jeśli podano string-- niech say--
>> ROB: powinienem otwieramy w edytorze?
Mogę wyciągnąć up--
>> DAVIN: Och, chcesz zrobić on--
>> ROB: Wolisz płytę?
>> DAVIN: Co chcesz zrobić?
Chodzi mi o to, czy chcesz to zrobić ręcznie?
Lub chcesz to zrobić za pomocą komputera?
>> ROB: zrobić to ręcznie.
>> DAVIN: [śmiech]
ROB: zrobić to ręcznie.
>> DAVIN: OK, więc to będzie atoi.
Więc co it-- To znaczy, że będziesz prawdopodobnie dać ci tego.
Ale to, co idzie do powrotu?
>> STUDENT: Int.
>> DAVIN: To będzie powrót int, prawda?
SO- nie chcę, aby to zrobić tam.
Zrobię to tutaj.
>> ROB: można pociągnąć go w dół a następnie wcisnąć się na nim.
>> DAVIN: tak.
[Śmiech] zmiana gry.
OK, więc to będzie int atoi, i co to potrwa?
Gwiazda char, więc po prostu łańcuch, gwiazda s, tak.
>> ROB: Ładny gwiazda, ładne.
DAVIN: To może nie być tam, OK.
ROB: Tak.
DAVIN: OK, więc pierwsza rzeczą, którą chcesz do-- I
nie wiem, czy ktoś spojrzał praktyki w solutions--
ale co masz zamiar chce zrobić, to jesteś
będzie chciał mieć pętli, bo jesteś
będzie chciał rzeczywiście przejść przez ten ciąg.
Więc helpful-- więc powiedzmy, jedziemy do pętli,
i będziemy krok po kroku każdy element łańcucha.
Ile to jest?
Ile razy będziemy do iteracji w pętli for, że?
STUDENT: Sterln?
DAVIN: Sterln, tak.
Więc powiedzmy, int długość równa sterln s.
I po prostu ciekawi, dlaczego jest to zawsze rodzaj z lepiej zrobić to na zewnątrz pętli?
Jak, dlaczego lepiej jest zadzwonić Funkcja ta poza pętlą?
Wystarczy sprawdzić szybkie rozsądek?
Tak?
STUDENT: Więc nie zachować sprawdzenie go.
Możesz po prostu [niesłyszalne].
>> DAVIN: Dokładnie tak, tak, dokładnie to, co powiedziała.
Więc nie trzeba zaglądać go.
Tak na przykład, jeśli dzwonię funkcja wewnątrz pętli,
wtedy będę wzywasz funkcja ta wiele razy.
I to się dzieje, aby zmniejszyć Skuteczność programu.
Dlatego zawsze przydatne zadeklarować ją na zewnątrz.
>> ROB: To się mówi, na każdy z tych problemów
prawie tak długo, jak masz rozwiązanie działa, masz pełny kredyt.
Więc nie martw się, jeśli projekt jest absolutnie przerażające.
To może uczynić nas zdenerwowany czytanie kodu.
Jednak pod warunkiem, że działa dostaniesz punkty.
>> DAVIN: Tak.
OK, więc wtedy będę zadeklarować jakąś zmienną.
To po prostu będzie zadzwonić int suma.
I mam zamiar ustawić to równy zeru, tak.
A to po prostu będzie być zastępczy.
Tak, że będzie co mam zamiar wrócić.
Więc mam zamiar w końcu zwrotu kwoty tego programu.
Więc mam te dwie zmienne.
Ja mam długość.
Mam sumę.
A teraz wskoczyć do naszego łańcucha.
>> Więc pozwala Posiadamy do pętli.
Tak więc cztery int I jest równa 0 w, podczas gdy I jest mniejsza niż długość ja plus plus.
I now--
ROB: Nicea.
DAVIN: OK, a teraz tutaj pochodzi mięso naszego kodu.
Więc rzeczywiście można zrobić to w zasadzie w jednej linii.
Więc czy ktoś ma pomysł z tego, co mamy zamiar zrobić?
OK, więc to jest OK.
Więc robimy powiedzieć sumę equals-- pozwól mi wiać ten over-- sumę
równa razy suma 10 plus-- jesteśmy zajmie s i minus jeden
cytat 0 jeden cytat zrobić, tak.
ROB: Bardzo intuicyjne.
>> DAVIN: Kruszywo go.
OK, więc someone-- mam go, mam go.
OK, więc jest to wyraźnie rośnie.
Co to oznacza?
Więc czy ktoś wie, co to oznacza?
Czy każdy może to zobaczyć?
Nie, nikt nie może zobaczyć, OK.
Idę to--
>> ROB: Idę napisać Formuła właśnie tutaj.
DAVIN: OK, Rob idzie to zrobić na komputerze, który jest zabawa.
ROB: O mój Boże.
Albo nie będę.
DAVIN: Stand by.
STUDENT: Mam pytanie.
DAVIN: Tak, na pewno.
STUDENT: [niesłyszalne]?
DAVIN: OK, więc to rzeczywiście, jak tylko na ogół
jeśli było umieścić, jak, w tej deklaracji int
I jest równa długości 0 przecinkami równa sterln, that--
>> STUDENT: [niesłyszalne].
>> DAVIN: To dobrze, bo that--
STUDENT: Dlaczego chcesz nawet trzeba użyć długość?
Dlaczego nie mógł po prostu [niesłyszalne] sterln s, jak cały czas [niesłyszalne]?
>> DAVIN: Masz na myśli tutaj?
>> UCZEŃ: Tak.
DAVIN: Ponieważ każdy Czas to dla przebiegów pętli,
to będzie ocenić ten warunek.
STUDENT: Prawo.
DAVIN: A jeśli masz sterln istnieje, to jest to
będzie musiał faktycznie zadzwonić że funkcja każdym razem.
Więc zamiast tylko Porównując go do int,
idziesz do wywoływania Funkcja, a następnie porównanie go
do wartości zwracanej.
Tak, tak, to jest po prostu, tak.
>> Ładny, OK, więc teraz każdy może go zobaczyć.
Co does-- to jest jak, to jest to.
To jest dżem, tutaj.
Co to oznacza?
Co ja robię?
Tak, pomysł?
Tak?
>> Student: No, więc kiedy jesteś wejściem tablicę,
masz zamiar jechać od lewej do prawej
tak masz zamiar jechać w dziesiętnej z dół [niesłyszalne].
DAVIN: Dokładnie.
STUDENT: Więc każdy trzeba pomnożyć
co widziałeś jako wartość przez int czas masz przejść, że nad jednym.
>> DAVIN: Doskonały, doskonały, tak, na przykład, niech
powiedzieć, że dał you-- jestem zamiar napisać tutaj.
Nie, nie jestem.
Mam zamiar napisać tutaj.
Powiedzmy, że dałem ci 76, prawda?
Powiedzmy, że dam ci 76.
To ciąg na początek, OK?
>> Tak więc długość jest co?
2, prawda?
Suma 0.
Potem skok w naszej pętli.
OK, pierwsza iteracja to, co to będzie?
To będzie suma wynosi 0.
Więc Podsumowując razy 10 0.
To bez znaczenia.
Następnie co to robić?
STUDENT: [niesłyszalne].
>> DAVIN: To się okaże, że znaków do liczby całkowitej, prawda?
To trochę tak jak z telefonem Problem set-- tym light--
to trochę jak z Problem ustawienie Visioneer.
Masz do czynienia z wartościami ASCII.
Więc jeśli dam ci, jak, siedem, ale to znak,
i chcesz wiedzieć, OK, co cyfra to jest?
Tak, może, tak.
Więc co cyfra to jest?
Można z niej odjąć 0, ale trzeba odjąć 0, charakter.
>> A gdzie ludzie się potknął się, że są
jak, dobrze, dobrze, muszę wiedzieć wartości ASCII dla tego quizu?
Nie, na pewno nie wiedzieć ASCII
wartości, jak, małymi literami , wielkie litery, zero.
>> ROB: Nie ma powodu, aby kiedykolwiek umieścić to na ściągawki.
>> DAVIN: Zdecydowanie nie marnować miejsca z tym.
Możesz literally-- tylko zamiast powiedzieć 48, podobnie jak prawo do
tam, które jest równoważne z mówiąc jedno, jeden apostrof,
tak, dokładnie tak samo.
>> ROB: Można prawie że o tym, jak if-- Boga, muszę mój,
oops-- można prawie myśleć a jeśli mamy coś takiego mieszania
zdefiniować 0 jako 48.
To nie będzie działać.
Ale uważam, że jest pojedynczy cudzysłów 0 apostrof, a dla wszystkich znaków.
Pomyśl o tym, jak stała oznacza, że ​​wartość ASCII.
>> DAVIN: Tak.
OK, więc po raz pierwszy przez siebie tak, z 76-- więc za pierwszym razem,
to tylko znak 7 minus znak 0,
i to są siedem integers-- dobrze, te
siedem miejsc od siebie inne na wykresie ASCII lub cokolwiek.
Tak, że zamierza powrócić int z 7.
Więc teraz, suma jest równa 7.
>> OK, dobrze, niech skakać do tego pętli ponownie.
OK, teraz jest to suma razy 10.
Więc jesteś skutecznie przesuwania 7 w lewo.
Czy to ma sens?
Skutecznie jesteś przesuwając go w lewo.
>> A potem add-- to będzie 6 minus 0.
To 6.
Więc to będzie 70 oraz 6.
76, to jest twój numer.
Tak więc niezależnie od jakiej liczby Dałem wam, że to właśnie powoli
zamierza przenieść większych wartości z lewej strony, czynnik 10 1
za każdym razem w pętli, a następnie dodać w miarę potrzeby.
>> W plecy?
Student: Nie mamy zrobić każda kontrola w programie?
>> ROB: Tak o ile sprawdzenie idzie do programu,
moglibyśmy powiedzieć dość dużo, co trzeba sprawdzić.
Jeśli nie powiedzieć, cokolwiek, to na ogół
Zakładam, że masz sprawdzić większość rzeczy.
Tak jak może, tylko być bezpieczne, prawdopodobnie powinien sprawdzić, hej, jest s zerowy?
Wtedy nie mam pojęcia, co do powrotu.
Ale możemy powiedzieć, że tego typu rzeczy.
0, nie wiem.
>> DAVIN: A dlaczego chcesz ponownie sprawdzić, czy s jest równa NULL?
STUDENT: [niesłyszalne].
DAVIN: Bo gwiazdy char.
To wskazówka.
Więc całkowicie dopuszczalne oświadczenie, mógłbym powiedzieć, OK,
s jest równa null, ponieważ to może być wskaźnik na null.
Więc gdy masz wskazówki w drogę w ten sposób,
powinieneś sprawdzić.
Bo jeśli nie sprawdzić, że i następnie przejdź do swojej pętli,
a ty doing-- wiać w dół.
Scoot dół.
>> ROB: Niestety, to jest to.
>> DAVIN: I tak, jak, jeśli jest pusty, a następnie
robić to, co błąd masz zamiar dostać?
STUDENT: Zamierzasz dostać zestaw błąd.
DAVIN: Będziesz ustawiony winy, w prawo, bo jesteś
starając się indeksu na null.
Więc masz zamiar spróbować indeksu w pamięci, że nie jest właścicielem.
Więc to, czy to jest null, a to zrobisz, będziesz cykl.
>> ROB: Myślę też na egzamin, w którym poprosiliśmy to pytanie, powiedzieć
że można po prostu przyjąć, jest to liczba dodatnia.
Oczekuje się również, ponieważ atoi obsłużyć liczb ujemnych,
więc trzeba by szczególnym przypadku.
Hej, to pierwszy znak kreska, w tym przypadku, OK,
teraz jest ujemną liczbą całkowitą.
Powiemy wam tego rodzaju rzeczy.
Powiemy ci, co trzeba obsłużyć.
DAVIN: Tak.
Więc jestem pewien, że niektórzy ludzie mogą have-- jeśli zaczął patrząc na starych egzaminów,
Widziałeś sterln.
To popularny.
I myślę, że w sterln, trzeba było zrobić ten test na null, powrót
0 lub coś w tym stylu.
Jak, trzeba było sprawdzić, null.
A jeśli nie, to było zwrócić się w quizie.
W każdym razie, nie wszyscy czuć się dobrze z atoi?
Czy ktoś chce przejść części ponownie?
ROB: O tak, myślę, że możemy również powiedzieć ci
Można założyć, że wszystko is-- że oni faktycznie wprowadzania numeru,
że nie musisz się martwić, jak, litery są w ciągu, tak.
DAVIN: Tak.
Tak?
STUDENT: Czy można przejść w ciągu jednej chwili, gdy więcej
użyć podwójny cudzysłów i apostrof?
>> DAVIN: Pewnie tak, cudzysłowy, bardzo po prostu, jest podwójne cudzysłowy są łańcuchami.
Więc jeśli cudzysłów cokolwiek, to ciąg.
Więc jak, gdybym miał to 0 tutaj, a ja to zrobił, to ciąg.
To już nie jest znak.
Więc nie mogę znaleźć tej wartości na moim ASCII wykres, bo to ciąg, tak.
>> OK, jakieś inne pytania?
Tak?
>> STUDENT: Więc masz już odpowiedział to,
ale jak, kiedy jesteśmy rzeczywiście pisanie to na quiz,
chcesz nam pisać tnie zer [niesłyszalne]?
DAVIN: Nie
Pytanie powinieneś umieścić ukośnik przez zer
wskazać, czy są zera?
Nie, my zrozumieć.
Tak, dzięki, że są dobre.
OK, coś jeszcze?
Czy ktoś chce to-- więc myślę my uruchomić trochę w czasie.
Czy chcesz zobaczyć inny, lub?
STUDENT: RandomInt.
>> DAVIN: RandomInt, OK, dokładnie.
Więc zróbmy RandomInt.
Zrobię to tutaj.
Więc RandomInt jest znacznie prostsze.
Myślę, że atoi jest chyba najtrudniejszy które prosiliśmy w poprzednich latach.
STUDENT: [niesłyszalne].
>> DAVIN: Co?
ROB: widzę, czy jest to rodzaj z widoczny z tutaj.
DAVIN: Czy to jest?
ROB: Nie sądzę, że to going-- myślę to będzie działać na prawo.
DAVIN: OK, tak zrobię tego.
A potem po prostu umieścić go na ekranie.
>> ROB: Wszystko w porządku.
>> DAVIN: Chcesz być moim uczony?
>> ROB: Tak.
>> DAVIN: Nicea.
OK, mogę wymazać tego?
>> UCZEŃ: Tak.
>> DAVIN: To jest tak trudno.
(Śpiewa) Robisz co robisz.
I robi to, czego nie robić.
Dobrze.
>> OK, jeśli dobrze pamiętam, na Quiz RandomInt było jak,
OK, mam zamiar dać Ci dwa numery, jak a i b.
I chcę, aby mi dać RandomInt między tymi liczbami.
Więc RandomInt będzie wziąć dwa numbers--
tak RandomInt-- i to zamierza powrócić int.
>> Więc co jest zwracana wartość?
Właśnie mówiłem.
Int, prawda?
Tak, i to jest to potrwa dwa ints.
Więc to zajmie int i int b, tak.
Więc co RandomInt jest zamiar zrobić, to to będzie
powrót jakąś losową wartość między tymi dwiema wartościami.
Więc to będzie większy niż, mniej niż b.
Więc myślę, że prawdopodobnie można przyjąć, że jest mniejszą z dwóch wartości.
Tak więc, jeśli mamy do czynienia z przypadkowość, co funkcja
widzieliśmy, że daje nam losowe rzeczy?
STUDENT: Drand.
DAVIN: Drand, dokładnie.
Więc masz zamiar prawdopodobnie chcą korzystać z drand.
Więc można powiedzieć, int losowa, a my po prostu powiedzieć, że jest równa 0 teraz.
I oni mamy zamiar powiedzieć, OK, losowe równi drand 48.
A co to ma powrócić?
Co to funkcja daje?
>> STUDENT: od 0 do 1.
>> DAVIN: Tak, od 0 do 1.
Więc to będzie być:
>> ROB: I myślę, że to is-- my ci to powiedzieć.
Jak można używać drand 48.
Można to sprawdzić na ostatnim egzaminie.
Ale my chyba powiedzieć ci Można stosować drand 48, która
zwraca pływaka między 0 a 1.
>> DAVIN: Tak, tak, jestem całkiem pewien, na egzaminie
mówi Ci prawdopodobnie użyć drand, tak.
Tak to się dzieje, aby powrócić niektóre wartości pomiędzy 0 a 1.
A potem co ty będzie chciał zrobić?
Cóż, chcesz pomnożyć by-- poczekać, myślę, że to tak, przepraszam.
Ja po prostu to zrobić.
Nie wiem.
>> Tak b minus.
Więc dlaczego b minus?
Więc powiedzmy drand daje powrotem int-- OK, po prostu zrobić resztę,
tak plus.
Więc co does-- y jest minus b.
Więc powiedzmy, że drand daje powrót Maksymalna wartość to mogło ewentualnie
dać.
Co to będzie?
UCZEŃ: 1.
>> DAVIN: 1, prawda?
Więc jeśli jest to 1, a ty pomnożenie przez b minus,
dobrze, że to tylko Różnica pomiędzy minus A.
A jeśli dodać, że wtedy z powrotem na, to co?
To w zasadzie b.
Czy to ma sens?
>> UCZEŃ: Tak.
>> DAVIN: Więc jeśli jest to maksymalna wartość mogłaby ona być,
to będzie jeden.
I to jest właśnie Różnica między tymi dwoma.
Dodawać na, więc jest zamierza powrócić losowo.
A w przypadku rożnego drand daje powrót 1,
losowo będzie po prostu skutecznie b.
Ale to może być maksymalna.
Więc jeśli będzie mniej niż że, więc powiedzmy, że jej jak 0,9,
tak to 0,9 b minus będzie mniej
niż różnica między b minus.
>> A potem, jeśli dodać, że na, to, że wartość jest
będzie większa niż, ponieważ dodajesz coś na nim,
ale to będzie mniej niż b.
Więc dostaniesz losowo liczba, ponieważ dzwonisz drand.
I że rand, że liczba losowa jest będzie gdzieś pomiędzy
i b.
Czy to ma sens?
>> ROB: Wystarczy umieścić go w konkretne numery, więc
powiedzmy, że chcemy wybrać Liczba losowa pomiędzy 7 i 10.
Tak b minus to nasza oferta.
Więc nie jest oferta trzech numery chcemy wybierać.
A następnie pomnożenie że pomiędzy 0 a 1 1
jeśli to daje nam some-- powiedzmy, że daje nam 1,5.
>> Następnie 1,5, chcemy iść od 7 do 10.
Więc 1,5 oraz 7 przynosi nam z powrotem do naszego 7 do 10 zakresu.
A potem mamy przechowywanie go wewnątrz liczbą całkowitą, tak że obcięty do 8.
A potem po prostu wrócić, że.
Tak b minus to nasza oferta.
przesuwa się ją do liczby że chcemy w tym zakresie.
Tak między 7 a 10, a potem może powrócić, co skończy się.
>> DAVIN: Tak, miło.
>> ROB: Dziękuję.
>> DAVIN: Tak, o co chodzi?
>> STUDENT: Czy możemy uruchomić go na wszelkiego rodzaju Błędy ASCII gdy we're-- jeśli drand jest
powrót pływaka [niesłyszalne].
>> ROB: Tak jak powiedział Rob, ponieważ nie jest przypadkowy int
tak drand będzie pływak.
Tak, a następnie mnoży się.
A może masz jakiś rodzaj liczb zmiennoprzecinkowych.
I wtedy to się obciąć.
>> STUDENT: OK.
DAVIN: Tak.
ROB: I jeśli były ostrzec kompilator ty o, jak, utrata precyzji,
tylko rzucony int w tam, i to jest dobre.
DAVIN: Tak?
>> STUDENT: Czy to ma samo prawdopodobieństwo dostania,
jak, b lub [niesłyszalne]?
>> ROB: Tak is-- jestem naprawdę wondering-- jest RandomInt rzekome
się numer z mniej niż b?
Jak, czy to między 7 a 10, jakie są możliwości?
7, 8 i 9 lub 7, 8, 9, 10?
DAVIN: zapomnę.
Na set-- problemów
>> ROB: Myślę, że to 7, 8, 9.
>> DAVIN: To wyraźnie mówi czyjejś włącznie, a jeden na wyłączność.
>> ROB: Tak.
>> DAVIN: Ale don't-- jestem not--
>> ROB: Więc myślę, że to jest nie wliczone w cenę, w tym przypadku,
nie jest równa Prawdopodobieństwo 7, 8 i 9.
Nie ma prawdopodobieństwo 10.
DAVIN: Tak?
STUDENT: Mam pytanie.
Chcemy zdefiniować funkcję zwraca nie jedną wartość, ale tablicę.
Więc co będzie Składnia po powrocie?
>> DAVIN: OK, więc wtedy would-- po powrocie?
Więc powiedzmy, że oświadczył, Tablica gdzieś tam.
Wtedy po prostu wrócić Nazwa tablicy.
>> STUDENT: OK, dziękuję.
Wtedy po prostu wrócić z A--
DAVIN: Oh wait, tak mi przykro.
Pytanie było jak Pan zwraca tablicę.
>> ROB: Mimo, że nie mógł być tablica zadeklarowana
na stosie, lub coś podobnego.
To musiałoby być coś malloced, ponieważ malloc
to, w jaki sposób obejść automatyczna alokacja pamięci.
>> DAVIN: Tak.
ROB: Jak można obejść zasięgu lokalnym.
>> DAVIN: Ale będzie tylko zwrócić jego name--
>> STUDENT: [niesłyszalne] to nie jest jeden wartości, na przykład, dwa numery, więc
[Niesłyszalne].
>> DAVIN: Nie możesz wrócić numer wielokrotne.
Nie można, jak, return--
>> STUDENT: Rozmawiałem o powrocie tablica czy coś takiego.
>> DAVIN: Tak, więc pytanie jest Mogę zwracać wiele wartości.
Nie można zwracać wiele wartości.
Nie można, jak, po czym wrócić powrót b czy coś takiego.
Bo po powrocie, ci powrócić z funkcji.
A następnie jest wykonywana funkcja i jak Rob mówi, jest na stosie.
>> Więc wszystko, pamięci tylko dostaje zwrócone do komputera.
Wszystko zostanie zapomniane, w zasadzie.
Więc jeśli chcesz, aby powrócić wielokrotnego wartości, trzeba zwrócić tablicę,
I sposób to zrobić jest mallocing.
A potem wrócisz x tak.
Zasadniczo, po prostu zwróci nazwę.
A po powrocie coś takiego, że jesteś
faktycznie nie zwracając wartość.
>> Więc powiedzmy, że przechowywane wartości w tablicy.
Nie jesteś naprawdę powrót tych wartości.
Jak, jeśli wróciłem int, jestem naprawdę powrocie kopie wartości.
Ale jeśli miałbym wrócić coś takiego,
Wracam odniesienie do tych wartości.
Więc wracam, w zasadzie, adres pamięci do wartości.
Czy to ma sens?
UCZEŃ: Tak.
DAVIN: Nicea.
Tak?
>> STUDENT: Kiedy jesteś używając drand tutaj,
masz umieścić srand wcześniej?
>> DAVIN: Nie, nie, nie myślę tak.
>> ROB: Tak, tak, masz powiedzieć coś o srand?
Domyślnym was nigdy mówiąc srand w ogóle, to po prostu zrobić srand null.
Więc drand pracy własnej woli.
I automatycznie z nasion aktualny czas, to co to wykorzystuje.
DAVIN: Tak?
STUDENT: Czy ci [niesłyszalne] z numerami?
DAVIN: Tak, można.
STUDENT: tak można powiedzieć, jak, 4 razy 2.
Chodzi o to, że nie można zakładać, następnie int jest cztery bajty.
Only--
>> DAVIN: Mam na myśli, na quizie można.
[Śmiech]
>> ROB: Mm, nie.
DAVIN: Tak, tak można.
Jeśli zapytać, jak duże int jest, nie może być, jak, czterech lub ośmiu.
ROB: Oh, więc jeśli Pytanie jest konkretnie
Na przykład, jeśli jest to problem kodowanie należy powiedzieć, rozmiar wew.
Jeśli jest to tabela, lub mówi, jak wiele bajtów,
nie należy wypełniać w rozmiarze int.
>> STUDENCI: [śmiech]
>> DAVIN: Tak, tak, to dlaczego rozmiar int ważnego tutaj?
Więc jak, jeśli jedziemy do 32-bit procesor lub coś w tym stylu,
to będzie cztery bajty.
Ale na niektóre nowsze rzeczy, to może być co?
To może być osiem, prawda?
Więc this-- jeśli tylko ciężko Kod cztery, następnie na niektórych maszynach, to będzie działać.
Niektóre maszyny, nie działa.
Ale jeśli w quizie jesteśmy jak, jak duży jest int?
Włóż cztery.
ROB: Prawo.
DAVIN: Tak?
Uczeń: Tak, ponieważ jesteśmy deklarując [Niesłyszalne] wewnątrz funkcji,
należy umieścić trzy wewnątrz tej funkcji?
Albo możemy używać go na zewnątrz?
DAVIN: Można go używać poza tą funkcją.
Więc pyta za darmo.
>> STUDENT: stracić gdzie [niesłyszalne].
>> ROB: Och, nie happen-- darmo to część magii malloc
jest to, że nie jesteś ograniczona do zasięgu lokalnego.
Masz pełną kontrolę nad jak długo zmienne żyć.
Tak nazywamy malloc tutaj, to może być całkowicie odrębne funkcje.
Może to być 10 godzin później że w końcu zadzwonić za darmo.
>> DAVIN: Tak na przykład, jak, kilka tygodni od teraz, kiedy wreszcie
zrobić słownika Speller psets, będziesz
do niektórych funkcji, które mają Tworzy ton węzłów.
Więc mallocing ton węzłów w tej funkcji.
A później w oddzielna funkcja, jesteś
będzie chciał uwolnić tych wszystkich węzłów.
Więc można dosłownie przejść do uwolnić wskaźnik, więc adres pamięci
do czego malloced.
I że będzie dobrze.
Nie trzeba się uwolnić, podobne, w tej samej funkcji.
Tak?
>> UCZEŃ: Tak malloc zmienna [niesłyszalne] na zewnątrz?
Czy to, co mówisz?
DAVIN: Czekaj, mówisz?
Przepraszam.
>> STUDENT: Jeśli zmienna malloc może być wolny w dowolnym miejscu w kodzie,
następnie mogą być dostępne w dowolnym miejscu w kodzie?
Możesz zachować je lokalnym?
>> DAVIN: Och, zapytała, jak zmienna, like--
>> ROB: Więc trzeba jeszcze mają jakieś odniesienie
do bloku malloc w pamięci.
Więc tutaj mamy powrót x.
STUDENT: Och.
ROB: Jeśli nie wrócimy x tutaj, i to było po prostu nieważne,
wtedy nie mamy dostępu do wskaźnik, który został malloced,
i to wyciekły pamięć.
>> STUDENT: OK.
>> DAVIN: Więc jak, powiedzmy, ma to, jak, tutaj.
ROB: Nie
DAVIN: W mojej podstawowej funkcji, nie mogę zadzwoń to x i być, jak, OK,
w tej funkcji, zrobiłem to.
>> ROB: Prawo.
>> DAVIN: Więc mam zamiar zadzwonić x w, jak, głównym lub coś w tym stylu.
Nie możesz tego zrobić.
Masz zamiar powrócić coś.
Ale to, co masz zamiar wrócić?
Masz zamiar wrócić adres pamięci.
A ponieważ powrót pamięci adres, który jest dostępny gdzie indziej.
Jeszcze jakieś pytania?
Tak?
>> STUDENT: Czy funkcja powyżej jest czek na [niesłyszalne]?
>> DAVIN: Dlaczego nie muszę robić?
STUDENT: [niesłyszalne].
DAVIN: Bo jesteś nie mallocing nic.
Więc to not-- tak, to nie jak ciąg s.
Jest to wskaźnik gdzieś.
Są to tylko wartości.
STUDENT: OK.
DAVIN: Tak.
Coś jeszcze?
ROB: Tak?
STUDENT: Ale kiedy [niesłyszalne]?
>> ROB: Tak, aby uwolnić pamięci, będziemy tutaj mówić.
Więc x jest nasz wskaźnik do blok pamięci.
Uwolnimy ten wskaźnik.
I nie koniecznie to zrobić tutaj.
Możemy to zrobić w dowolnym miejscu.
Ale tylko dzwonić za darmo na coś, że malloc zwraca.
Więc malloc, tutaj, wrócił co jest przechowywane w x.
Tak więc możemy zadzwonić bezpłatnie na x.
Jakieś ostatnie pytania?
>> DAVIN: Jakieś ostatnie pytanie?
Tak?
>> STUDENT: Przykro nam, możesz ponownie wyjaśnić dlaczego chcesz uwolnić się tam?
Dlaczego [niesłyszalne]?
>> DAVIN: Bo tu?
>> UCZEŃ: Tak, jak zaraz po.
DAVIN: Prawdopodobnie nie chcę tutaj za darmo.
ROB: Prawdopodobnie nie.
DAVIN: Tak, że to nic nie robić.
To, jak, stworzyć pamięci, robić rzeczy, do tego,
a następnie natychmiast zapomnij o tym, tak.
>> ROB: Ale możemy zrobić, jak, tutaj z jakiegoś powodu.
Można powiedzieć, int gwiazdę y równa return array.
Zrobić kilka rzeczy z y, może wydrukować zawartość.
I wtedy wreszcie skończymy.
Możemy uwolnić y.
STUDENT: [niesłyszalne].
DAVIN: Czy mogę przewinąć w dół?
Dzięki.
ROB: Nicea.
>> DAVIN: OK, to jest to.
ROB: Dobra, dobra.
Powodzenia.
>> DAVIN: Jeśli masz jakieś pytania, napisz do nas.
Powodzenia.