>> [Přehrávání hudby]
>> DAVIN: Tak jo, chlapi.
Tak tohle je recenze pro první kvíz.
Jsou všichni připraveni na kvíz ve středu?
ALLISON: Woo!
STUDENT: Woo!
DAVIN: Jo.
ALLISON: Yeah!
DAVIN: Ten chlap je připraven.
Ten chlap, dvě ruce, pěkný.
Takže kvíz recenze dnes, bude to být asi hodinu a půl.
Chystáme se jít přes všechny hlavní koncepty, měli byste vědět, na kvíz.
Chystáme se jít přes nějaké kódování podle příklady ruční, které jsou na každém testu.
A pokud budete mít dotazy, neváhejte se zvednout ruku a všechno
takhle.
No, logistika o kvíz online.
Tak jdeme lidi rozdělit do různých místností.
Je založen na jejich jména.
Takže pokud máte nějaké otázky o tom, kde jít, nebo o tom, co je materiál, jako,
oficiální slovo o tom, co se děje být na testu, zkontrolujte online.
A to je vše aktuální.
Takže v případě, že nejsou žádné dotazy na začátek, jdeme na start.
A tady je Allison.
>> [Tleská]
>> ALLISON: OK, díky, Rob.
Vážím.
Davin měl převrácený na to.
Toto je neúplný seznam témata, jako vždy, jako Davin právě řekl.
Obraťte se na dokumentaci on-line informace o testu nulové.
Ale to je docela much-- to je na sylabu
je všechno, co jsme dosud probrali.
Všechno je tu fér hra, stejně jako cokoli jiného
, které mohou být uvedeny v přednášce.
>> Můj oddíl, zde je jen hodně přezkumu.
Existuje několik cvičení že vy jste mohl pracovat.
Ale z větší části, opravdu se chtějí dostat do Davin s těmi kódem
ručními cvičení.
>> Takže já budu létat přes to.
Máte-li nějaké otázky, zastavit mě.
Zvedněte ruku.
Slibuji, že budu asi vidět.
Pokud ne, tak mávat kolem.
Budu se rychle mluvit.
Doufám, že všichni v pořádku s tím.
>> OK, speciální slovo, Davin samozřejmě zapomněli listovat těchto snímků.
[Směje se] Jste v průšvihu, člověče.
Takže tipy na kvíz nula, praxe kódování na papíře.
Vy se chystáte sehnat praxe se, že nyní se Davin,
takže nebudete úplně sami.
Myslím si, že jsme vlastně děje prostřednictvím těchto dvou funkcí.
Tak budete dobře připraveni tam.
>> Seznamte se s vašimi problémovými sad.
Tam byly otázky Na základě předchozích kvízy
že se vás zeptá, například pro kód něco velmi podobného Mario.
Takže být velmi dobře obeznámeni s váš problém sady, jakož i
jako otázky, žádáme vás, na začátku na formuláři
že vyplníte, bude poslouží vám velmi dobře.
>> Proveďte předchozí kvíz pod časová omezení.
Tyto kvízy jsou dlouhé.
Čas běží velmi rychle.
A často si ani neuvědomují, jak rychle to půjde, dokud se skutečně
Vžijte se do těchto omezení.
Takže pokud můžete jen vybojovat, víte, 75 minut, a to buď dnes večer nebo zítra
vzít jednu z těchto kvízů pod to, že budete v mnohem lepší kondici.
>> A také, vytváření referenční listinu.
Pamatujte si, že dostanete jeden strana přední a zadní
jako referenční pro váš kvíz ve středu.
Vytvoření, že je skvělý způsob, jak studovat.
Cokoliv, co máte potíže s Chcete-li zahrnout tam.
Cokoliv, co vaše TFS byly, jako, je to opravdu důležité.
Měli byste vědět, jsou možná věci, které jste tam
pokud nemáte je do paměti.
I když víte, je opravdu dobře, někdy s to tam
je jen trochu pohodlí pro vás, o němž vím, kvízy jsou stresující.
Takže jakýkoli komfort vám může pomoci.
V pořádku, také si spánek a jíst a rád normální věci
že jsme vám na kvízy.
>> Takže rozjezdu snadné, datové typy a velikosti.
Jak jsem řekl, je to jen tak se mi hodil spoustu věcí
tady, které byste měli vědět.
Takže máme znaků že jsou jeden byte, ints
že jsou čtyři byty, dlouhá dlouhá, což je osm bajtů.
V podstatě je to jen vy chtějí držet větší celá čísla.
Plováky, které jsou čtyři, dvoulůžkové, které jsou osm.
Opět platí, že právě vám dává více prostor pro vaše plováky.
A potom zadejte hvězdu, takže každý ukazatel na 32-bitovém stroji,
což je vše, co chlapi potřebují vědět, je čtyři bajty.
>> Takže všechny věci, které by Víš, možná věci
Chcete-li mít na Vaše referenční list.
OK, binární konverze na binární, konverze
na šestnáctkové tam a zpět, všechny věci, které byste měli vědět.
Tak z binární do desítkové soustavy.
Vy chcete, aby se rychle minutu a pokusit se přijít na to, každý z nich
a pak mi řekni, co jsou zač?
>> Mám také sladkosti v tašce, takže každý kdo odpoví dostane cukroví, mimochodem.
A já mám hodně.
Nech mě chytit to.
Chystám se dát to Gabe.
Takže můžete rozdávat cukroví ten, kdo to pěkné a kooperativní.
>> OK, viděl jsem ruku tam vzadu.
>> STUDENT: Jo, první z nich je 42.
>> ALLISON: Ano, první z nich je 42, v pořádku.
STUDENT: [neslyšitelné].
[SMÍCH]
ALLISON: druhá, tam zpátky ve žluté?
STUDENT: 110.010.
ALLISON: Správně, a to poslední, tady dole?
Také, jo, víte chcete?
Jen vyhodil cukroví.
Jak se o cukroví pro každého?
>> STUDENT: [neslyšitelné], když jsme hotovi.
>> ALLISON: Ššš.
A pak ten poslední.
Kdo chce odpovědět?
Přímo tam.
>> STUDENT: 11100.
>> ALLISON: 11100, podívej se na to.
Gratulujeme, skvělá práce, všichni.
OK, každý druh pochopit, proces, jak toho dosáhnout?
Jste, bude z binární do desítkové soustavy jak jsem tendenci dělat to, píše se
síly 2.
Tak říkám, OK, 0 krát 2-0, takže to je 0, 1 x 2 na první,
je 2 jít dál tímto způsobem.
Někdo chce, abych se explicitně projít příklad binární?
OK, v pohodě.
>> Decimal do dvojkové soustavy je velmi podobná.
Mám ve zvyku psát se pravomoci 2.
Začněte s tím, že je největší, ale nejde kolem desetinné čárky
které hledáte.
A pak druh práce si cestu dozadu sečtením věci podle potřeby.
>> A pak se toho, že je to stejně jako normální navíc.
Pokud budete mít případ, kam přidáním dvou 1s, to samozřejmě bude 2.
2 v binární je nyní 1 0, takže budete potřebovat nést své 1 do dalšího sloupce.
V pohodě.
>> Hexadecimální, by to mohlo být něco která je o něco méně známé.
Tak jako Rob mi jen říkám předem, jeho trik na to
je jen rozdělit ji do čtyř bajtů kousky, OK?
Bity, sorry.
Vidíš?
Díky Rob.
To je důvod, proč jste tady. [NOISE] OK, tak jsme jen s tím skonči
do čtyř bitů kousky.
Tak s binárky hexadecimální, se podíváme na první 4,
který je, pokud máme čtyři 1s v řádek, jaké číslo to má symbolizovat?
>> STUDENT: F.
>> ALLISON: Takže v tomto případě, co je 11111111 nebo-- ano?
STUDENT: FF.
ALLISON: Perfektní, FF.
Tak velký, cukroví pro vás.
Nyní, jak hexadecimální do binární jsme Jen si myslím o tom trochu opačně.
Pro každé číslo nebo písmeno, které máme v šestnáctkové soustavě,
jen převést jej do své čtyři bit [Smích] a jeho čtyři bitové konverzi.
Takže 5, v tomto případě, co je 5, pokud jsme to představuje čtyři bity?
>> STUDENT: 010?
Mm-hm.
A pak, což je ve skutečnosti 10, by?
1010.
Takže máme to tady.
Takže převod mezi šestnáctkové soustavě a binární vlastně není tak špatné.
Podíváte-li se na to ve čtyřech bitů kusy, bude zlatá.
Everyone-- ano?
>> ROB: To je hloupé, ale já vždy pamatovat
A, protože to má být 10.
A binární je jen 10 10, tak--
>> ALLISON: Á, tady to máme.
>> ROB: Ahoj.
>> ALLISON: Hele, cukroví pro Rob.
K dispozici je non-čokoládové věci tam.
Takže můžete mít některé z nich.
Tak ASCII matematika.
Chovat.
Takže ASCII matematika, jako vy asi dobře pamatovat
p sada 2 s Visioneer a Caesar, jste hodně to.
Pamatujte si, že znaky jsou Fundamentally jen čísla.
Takže můžeme dělat matematiku s nimi, stejně jako my matematiku s ints.
>> Takže máme jen trochu jednoduchá věc tady.
Máme někteří v to inicializovány na 65 let.
A B rovná hodnotě ASCII A plus 1, char C rovna D minus 1,
a Char D roven 68.
Takže se budeme tisku všechny z nich, jak vidíme zde.
A může mi někdo říct, Co to bude tisknout?
STUDENT: [neslyšitelné].
ALLISON: Přesně tak, jedna věc ke zprávě je
že jsme z tisku znaky pokaždé, zde.
Jsme označení, i když A a B jsou ints když jsme deklarovali jejich výše.
Jsme tiskem jako charaktery procent C a naše printf prohlášení,
tak budou všechny tisknout jako znaky.
A samozřejmě, je hodnota ASCII 65, vytisknout jako A. ASCII hodnotu A plus 1
by bylo 66, což by hrdý na to, B. Takže ve skutečnosti jsme
se tam dostat B C D Každý dobrý?
Nějaké otázky?
Úžasné.
>> OK, rozsah.
Takže prostor je samozřejmě velmi důležité pochopit, tady.
Mnoho z vás, pokud vás mají kompilaci chyby,
a říká, že nemáte přístup k nějaké proměnné,
je to pravděpodobně proto, že jste definoval ve smyčce
a pak se pokusil k němu přístup z ní, nebo naopak.
>> Takže prostor ve svém jádru, to prostě určuje, kde
říkáme proměnná existuje, kde jsme může změnit, kde můžeme přistupovat.
Je to tak nějak říkat nich jsou jediná místa, kde máte přístup k
k této proměnné.
>> Takže tyto dva obory, které jsme mluvit o během vyučování jsou globální a lokální.
Tak globální proměnné mluvíme o při definování je nad hlavní.
To znamená, že vaše nekastrovaných Program má k němu přístup,
a existuje tak dlouho Při běhu programu, OK?
Místní znamená, že je více omezeny na oblasti.
Takže kdykoli budete mít specifické funkce jako odkládací prostor, vždy mluvit.
Vždycky jsme mluvit o swapu s A a B. A a B existují v této funkci.
Neexistují nikde jinde.
>> Stejně tak, když máte v případě, prohlášení nebo pro smyčky.
Vždy, když se, například, v pro smyčce máme int I = 0.
Máme nějakou podmínku, a my ji aktualizovat.
I existuje pouze v rámci šle o tom, pro smyčce.
Pokud se pokusíte o přístup jinam, váš kompilátor by křičet na vás.
Bylo by to, jako to, co se snažíte dělat?
To neexistuje.
Tak to je dva různé typy rozsahu.
Znamená to, že smysl pro každého?
>> Tak například zde, tento je jen několik jednoduchých programů.
Co si vy myslíte, že je bude dít v každém bodě
že se snažíme tisknout?
Tak tohle tady, co se bude dít?
Student: To bude tisknout tři.
ALLISON: Správně.
Bude vytisknout tři.
Co je tady?
Student: To nebude fungovat.
ALLISON: Nebude to fungovat.
Jste z oboru, že jo?
Lokální proměnná neexistuje mimo tyto závorky v pořádku?
A co potom tady?
>> STUDENT: [neslyšitelné].
>> ALLISON: Co je?
Rob, jít.
>> ROB: jsem právě řekl.
Globální proměnné by měly být globální proměnné podtržítko.
>> ALLISON: Ach, ano, je mi líto.
Díky, Rob.
Rob je jako náš rezidentní kompilátor.
Bude jen křičet na nás, když jsme potřebovat. [Směje se] Ano,
by měla být globální proměnné podtržítko.
Za předpokladu, že tak, že byl globální podtržítko
variabilní, co se bude dít tady?
STUDENT: To bude fungovat.
ALLISON: Bude to fungovat.
Takže to bude tisknout, tak jen velmi jednoduchý příklad.
OK, prototypy.
Tak samozřejmě, opravdu zdůraznit pro vás
aby funkce, pokud smysl ve svých programech.
Ale samozřejmě, když vás vytvořit vlastní funkce,
obvykle budete je definovat po hlavní.
A vy, pokusím se je zavolat hlavní.
A pokud nechcete použít prototyp, váš kompilátor bude křičet na vás.
>> Prototyp je v podstatě jen říkám kompilátoru
že jsem tuto funkci pod hlavní.
Budu říkat předtím, než jsem ji definovat.
Jen vydrž.
Slibuji, že je to definováno, a bude mít vše, co potřebujete.
>> Takže způsob, jak to udělat, je jen váš návrat typ, Vaše jméno funkce, váš vstup
seznam.
Je to v podstatě první řádek ze své deklaraci funkce.
Je to opravdu vše, co je.
Ale to je jen Obecně druh formátu.
>> Takže v našem příkladě, které jste kluci měli
viděli v kapitole na nějakém místě, máme
některé int kostka, která trvá nějakou int vstupu.
A máme náš hlavní funkce, která volá kostky.
A krychle je definován po faktu.
>> Takže pokud jsme neměli int kostka vstup na vrcholu, když jsme říkali kostka
v rámci hlavního, náš překladač by se zlobit na nás.
Bylo by to jako to, co to mluvíš?
Cube neexistuje.
Nevím, na co se ptáte na.
A já jsem prostě jít zastavit.
>> Ale protože jsme náš prototyp na vrcholu, jsme řekli,
Víte, když vidíte krychle, nebojte se o tom.
Slibuji, že je to definováno později.
A to vás nechám dělat, co chcete.
Takže pokud budete mít funkci který je vyhlášen poté, co tomu říkáte
poprvé, budete muset jsou to prototyp nahoře.
>> Ano?
>> ROB: Je to na druhou, ne cubing.
>> ALLISON: Oh můj bože.
Nechtěl jsem have-- Gabe, myslel jsem, jste náš korektor.
OK kluci, mějte se mnou, tady.
Doufám, že všichni se dostat nápad.
OK, takže by to mělo mít byl čtvercový, ne kostičky.
Ale myšlenka zůstává stejná.
Jakékoli funkce, které jsme volání po skutečnost by měla mít prototyp.
Všichni dobře s tím?
Jakékoliv jiné překlepy?
OK.
Veškeré zde překlepy, než začneme, Robe?
[Smích] OK, tak structs.
V podstatě, structs vám umožňují vytvořit svůj vlastní datový typ.
Tolik jako int nebo char nebo float, je to jen jiný typ.
Líbí se mi, že na to, jak, jako, vytvořit svůj vlastní datový typ.
Tak to můžete udělat.
A to platí různých typů dat.
>> Takže pokud si vzpomínáte, v poli jsme může mít pouze věci podobného typu.
Struktury nám umožňují držet více věci různých typů.
Takže v tomto případě zde máme mají struct názvem Student,
zde jmenován na dně.
A máme nějaké int id a některé string name.
Takže je to jen jiný typ dat.
Nyní máme datový typ s názvem Student.
>> Proto, že my můžeme myslet na to jen jako jiný typ dat,
můžeme deklarovat proměnné jak jsme každý jiný.
Takže místo toho, jen mít, jako, int student, jen musíme studenta,
Student 1.
Oh, podívej.
Je to Rob.
Tak tady jsme vyhlášení struct, nebo variabilní
volal studentka 1 typu studenta.
Takže to bude mít id a název s ním spojené.
>> A způsob, jak k nim přistupovat prvky v naší struct
je s operátorem tečka, tady.
Takže v tomto případě jsme prohlásil některé studenty 1.
Přidělen jsme ID na 1.
A my přiřazen název jako Rob.
OK, všichni dobře s tím?
Použijte jej pouze like-- ano?
>> STUDENT: Jo, když typedef-- dělat, musíme použít typedef?
>> ALLISON: Takže typedef jen říká that-- Rob, můžete
mě opravte na to, jestli jsem wrong-- ale typedef je prostě skutečně prohlásil
to jako druh, který můžete použít, že?
>> ROB: Jo, je to v podstatě, takže je to jen vytváření
alias nebo přezdívka pro určitý typ.
Takže můžete psát, že [neslyšitelné].
Takže [neslyšitelné] existuje, a teď jen musíme
[Neslyšitelné] znamená přesně totéž.
A tak tady máme napsaný, myslím, některé struct typ 2 [neslyšitelné].
Takže je to jen přezdívka pro daný typ.
>> STUDENT: String [neslyšitelné] knihovna bylo napsáno se jako char hvězdy.
>> ALLISON: Pro naše účely zde, pokud jste prohlásil struct,
prostě typedef struct.
OK, takže předem, to je jen normální proměnná zde.
Jsme přistupovat s tečkou.
máme-li ukazatel na struct, můžeme ve skutečnosti
použít šipku, která je docela v pohodě.
>> Takže v tomto případě máme ukazatel na student 1, který je typu studenta.
Pamatujte si, že se svým ukazatel konstrukce,
Chcete bez ohledu na typ ukazatel ukazuje se, že je na začátku.
Takže máme nějaký student, 1, zde.
A od té studenta 1 je nyní špičatý,
skutečně můžeme jít studentů názvu 1 arrow místo tečky, protože je to ukazatel,
a přiřadit Rob.
A teď, pokud chceme změnit Rob na Davin,
je to jen, že vám ukazuje jiný způsob, jak to udělat.
>> Takže místo toho, pomocí šipky, můžete může also-- budu dokončit a pak
vzít question-- byste mohli také provést referenční studenta 1.
To říká, jako jít do co je na studenta 1, která
by naše studentka struct.
Přistupovat s tečkou a prvkem které chcete, a pak ho přiřadit.
Tam byla otázka.
Žák: Ano, tak jak to máte používat [neslyšitelné], když jste
dělá studentů hvězda bez [Neslyšitelné] studentka?
ALLISON: Protože tento vytváří ukazatel.
ROB: Budeme o tom mluvit.
ALLISON: Budeme mluvit o tom později v recenzi.
Takže stačí se držet té myšlence.
Pokud se vám stále vadí na konec, přišel mluvit s někým z nás.
>> Tak to dělat přesně totéž.
Jsme jen zobrazující dva různé způsoby, jak to udělat.
Student 1 je nyní ukazatel tak, můžete přistupovat k názvu prvku
v struct s šipkou.
Nebo můžete dereference ukazatelem, a k němu přistupovat jako obvykle.
Má to smysl každého?
Pokud je celá ukazatel věci jsou trochu matoucí, Gabe bude hovořit o tom,
a pak možná to bude dávat větší smysl.
Ano?
>> Žák: Ano, tak jak je odlišné od?
ALLISON: předchozí?
Takže student 1 v tomto případ není ukazatel.
Je to jen vaše aktuální struct.
>> STUDENT: OK.
>> ALLISON: vzhledem k tomu, je tento je ukazatel na struct.
>> STUDENT: OK, ale dělá to druh skončit pracovní stejný [neslyšitelné].
>> ALLISON: Účinně funguje stejně.
Váš syntax je prostě jiný.
STUDENT: OK.
>> ALLISON: Jo, jsou fakticky stejné.
Je to jen v závislosti na kontextu, budete chtít jeden přes druhého.
Ano?
>> STUDENT: Když to uděláte odkazy na 1--
ALLISON: Mm-hm?
STUDENT: Proč vás mají závorky?
ALLISON: Vzhledem k tomu, studentka 1 je ukazatel.
Takže je potřeba, aby se ujistil, že jste jen dereferencing ukazatel.
>> STUDENT: OK.
>> ALLISON: Takže v tomto případě zde, Závorky kolem něj
znamená, že jste dereferencing studenta 1.
Takže budete-li žák 1 bod, což je vaše struct.
Takže teď si můžete myslet to jako, že struct,
takže můžeme použít náš normální provoz dot.
Nějaké další otázky?
Cool, úžasné.
>> Tak to poslední, co si myslím, že je můj poslední snímek, woo!
OK, tak s plovoucí desetinnou čárkou nepřesnost.
Bavili jsme se krátce o to během přednášky.
V podstatě, máme nekonečně mnoho reálných čísel.
A pokud někdo z vás kluci rád matematiku, je tu
všechny druhy super věci u nás.
>> Ale existuje nekonečně mnoho reálných čísel.
Ale jsou to jen konečný počet bitů, které máme.
Takže jste vždycky mají nepřesnosti, to je všechno.
A to je to jen trochu jako něco, co byste měli vědět.
Že stejně jako my, může vás požádat, proč s plovoucí desetinnou čárkou nepřesnost existují?
Takže jen něco, co byste měli vědět.
A s tím jsem soustružení to se k ukazateli.
>> Binky: Ahoj, kluci.
Jmenuji Binky.
Budu hovořit o ukazateli.
Jo, takže ukazatele je ve skutečnosti moje oblíbená část v tomto kurzu.
Takže jen aby bylo jasné, Allison byl zde mluví, tak z důvodu,
why-- jediný rozdíl, velký rozdíl byl způsob,
prohlašujeme věci.
Takže student, hvězda znamená, že tento je ukazatel na studenta.
Vzhledem k tomu snímku před, student Skutečná struct, jako skutečný student,
obsahující některé z těchto věcí.
>> A důvod, proč jsme Chcete-to-- ano, Davin?
>> DAVIN: Co šipka znamená?
>> Binky: Prostředky šipkami přesně stejné jako to.
Takže nemáte opravdu potřebují šipku.
Stejně jako, když jste jediný program v C, stačí použít to.
Omlouváme se, ale já ne, co to je.
Stačí použít tuto syntaxi.
>> Ale někteří lidé, když byly projektování C,
se přišlo, že lidé používá tuto syntaxi tak,
že se bude líbit jen přijít s konstrukcí syntaxe pro to.
A to se konalo v forma tohoto šipky.
A je to opravdu pěkné, protože symbolizuje něco
jako bychom vlastně po tento šíp, tento ukazatel,
k nějaké místo v paměti.
A když se tam dostaneme, chceme podívejte se na název tohoto studenta,
pokud to dává smysl.
OK?
>> Tak to je přesně to samé.
To je přesně to samé, jako to.
Dostanou sestaven přesně stejný, OK?
A důvod, proč jsme tady malloc něco, to proto, že v tomto případě,
naše proměnná je vlastně jen ukazatel proměnná.
Takže máme jen nějaký prostor v paměti, že drží ukazatel.
Jsme opravdu nemají žádné místo že má skutečné Struct.
>> Takže to musí být provedeno ve dvou krocích.
Musíme vytvořit Paměť dát struct v.
A musíme vytvořit paměti, aby ukazatel v.
Takže jsou v podstatě dvě různé proměnné, zde.
Jedním z nich je typ studenta, kromě něj není opravdu mít název.
A druhý je typu studenta hvězdy.
A pak studentské 1 bodů tam, pokud to smysl.
OK?
>> Takže důvod, proč používáme ukazatele je skutečnost, že vše
v počítači, každá proměnná v počítači, má dvě věci.
To má svou hodnotu.
A to je jeho adresu.
A dobrý způsob, jak pojímat je tu
mnoho problémů, když se zkuste použít funkce.
A budeme se snažit, aby podívejte se do jedné z nich.
Konkrétně to bude přemýšlet o paměti jako pole.
>> Vždycky si myslel, proměnných když říkáte, že na rovná 5.
Myslíte si, že uvedení 5 do krabice.
Takže co když chcete předat že int do funkce?
Právě jste pass-- vůbec se mi nelíbí víš-- x do funkce.
Ale co se stane, je normálně jako lidé, si
by si myslel něco jako, že jsem předáním pole člověka.
A to opravdu není stane v počítačích.
Co se stane, je, zkopírovat hodnotu krabice na krabici osoby.
>> Takže to, co se snažím říct je, že v případě, Máte function-- zde sorry--,
máme-li funkci jako na pět až tam, pokud se pokusíte předat proměnnou,
je to jen bude kopírovat.
Pokud initialize nx se rovná 3, to se děje kopírovat tuto hodnotu do proměnné A
tam nahoře.
OK, a to je důvod, druh Proto chceme používat ukazatele.
Vzhledem k tomu, místo toho, dávat jen hodnotu,
ne jen kolem jen hodnota funkce,
chceme předat odkazem.
To, co nazýváme přihrávku odkazem je druh dát políčko na funkci,
tak, aby funkce lze také změnit hodnoty v tomto poli.
>> OK, takže jen některé základní ukazatele věci je vytvořit ukazatele,
stačí deklarovat to typ, a si dát hvězdu hned po něm.
A typ je jen co jste ukázal na.
Takže pokud je to int hvězda, jste ukázal na int.
Pokud je to char hvězda, jste ukázal na grafu.
A pokud je to student hvězda, jste ukázal na studenta.
OK?
>> A jsou všechny 4 bajty.
Protože tato proměnná to není ve skutečnosti
je třeba držet char, int, nebo student.
Chce to jen držet adresu.
To je důvod, proč jsou všechny 4 bajty dlouho v normálním 32-bitové stroje.
OK?
Tak zde, x je proměnná, která poukazuje int. Y ukazuje na char. z bodů
na plováku.
Jakékoliv dotazy zde?
V pohodě.
A jsou tam dva různé symboly, které mají
mít na mysli, když přichází na ukazatel.
Tak odkazů a dereferencing jsou ty velké.
Takže ampersand z název proměnné vám dává?
STUDENT: adresa.
Binky: adresa.
Takže pokud jste deklarovat INT rovná 5, pak ampersand
ze bude vám adresu.
A můžete skutečně vyzkoušet vytisknout to a vidět
jakou adresu v paměti vaše proměnná má.
A pak dereferencing-- tak, aby bylo odkazování,
získání address-- dereferencing je přesný opak.
OK, stejně jako doby je opak divize,
hvězda je opakem ampersand.
Takže dereferencing prostředky tam.
Takže pokud dáte star-- I ne víš-- 50, to je
pokusím se jít na adresu číslo 50 uvnitř počítače.
OK, a proč vidíme že se protiklady?
Protože to, co se stane, když děláte něco jako hvězda ampersand?
No, ampersand vám adresu proměnné, adresa.
Ale hvězda znamená jít tam.
>> Takže to, co se stane, když vás přejděte na adresu?
Právě jste dostat, ne?
Tak bude na adresu je totéž jako.
To je důvod, proč oni jsou obvykle uvedené same-- této
a to se odkazuje jako opak operátoři.
OK?
Tak v pohodě.
>> Pod kapotou, například, pokud budeme deklarovat int x se rovná 5,
máme proměnnou.
A pamatujte si, že jsem řekl, každý proměnná-- a to je dobrá věc
aby v mind-- má dva různé věci spojené s.
Má projednána, jakož i hodnotu.
OK?
>> Takže hodnota je v tomto případě 5.
A adresa je-- řekněme, že jsem aby se něco up-- je to 0x04.
A jediný důvod, proč jsme se obvykle představují adresy v šestnáctkové soustavě
je, protože je to jako dobro.
Hodí se binární.
Je to snadné převést do az binární.
A to není příliš velký, pokud máte velmi velké číslo.
Tak jsme chtěli použít hexadecimální v tisku adres.
Ale já jsem mohl představovat to jako celé číslo.
To je v pořádku.
>> A tak to má adresu 4 a hodnota 5.
A pak jsem si řekl, int hvězda ukazatel.
Tak tohle je jiný typ, oznámení.
Int hvězda ukazatel se rovná adresa x.
Takže to, co se bude hodnota PTR?
To bude adresa x, tady dole.
OK, takže hodnota bude být stejná jako adresa.
To je úkol pracovat dělám.
A pak ptr bude mít vlastní adresu, které ukázalo,
v tomto případě 8, OK?
>> A pak jsem se vytvořit novou kopii celé číslo.
A já říkám, int kopie rovná tam.
Takže jděte do toho, co je ptr ukazuje.
No, co to ptr mít?
PTR je 0x04.
Co se stane, když se pokusím tam?
Najdu chlapa, který má Adresa x a kdo má adresu 4.
A kdo má řešit čtyři je x.
Dává to smysl?
Ano?
>> STUDENT: V tomto případě je ukazatel v zásobníku?
>> Binky: V tomto případě, it's-- dobrá otázka.
Nechtěl jsem opravdu myslíte, že o tom při sestavování těchto adres.
Ale pokud je to, jako, vše se jedná o lokální proměnné,
pak x je žít in-- vše bude žít v zásobníku.
Takže vše, co se děje aby ukázal na sebe.
Dostanete jen haldy, když začnete používat malloc, že ​​jo?
>> Takže pokud si vzpomínáte stack je pokaždé volání funkce v programu,
jako je, například hlavní, nebo jakékoli další funkce, jako je printf.
Všechny lokální proměnné jsou bude si dát do rámce zásobníku.
A oni dostanou jako nashromáždily v zásobníku.
To je to, co se říká stack.
A všechny ty lokální proměnné jsou tam bude.
A heap-- a budeme mluvit více o tom later--
haldy je místo, kde všechny dynamicky alokované paměti životy.
V pohodě?
>> Jdeme k tomuto snímku.
Ano?
>> Žák: Proč není pravý kopie návratu 0x04?
>> Binky: Proč není pravý kopie návratu 0x04?
>> Žák: Proč není to, že [neslyšitelné]?
>> Binky: Vzhledem k tomu, jaká je hodnota PTR?
>> STUDENT: 0x04.
>> Binky: 0x04.
Co se stane, když jdete na 0x04?
Co získáte?
>> STUDENT: Oh, OK.
Binky: Vidíte?
Student: Ano.
Binky: Takže jste si 5.
Takže kopie bude mít 5, pokud to dává smysl.
Ano?
>> STUDENT: Mohli bychom se dostali 5 V poli Hodnota [neslyšitelné]
Dáme-li kopírovat int [neslyšitelné].
>> Binky: Int-- bychom, jo.
To by udělal skoro totéž.
Ale tímto způsobem, můžeme projít řešení k funkcím.
A to je super věc budeme dělat právě teď.
>> Takže tento druh cvičení vždy přijde on-- velmi obvykle přijde na kvízy.
Takže je to opravdu dobré, aby se pokusili dělat takové věci sami.
A tak se snaží sledovat, co na adresu je, a chcete, aby hodnoty proměnných
jsou v každém bodě.
Tak tohle je přesně to, co budeme dělat.
Zde máme kroky, jeden, dva, tři, čtyři, pět.
Jedna, dvě, tři, čtyři, pět.
A budeme sledovat z hodnoty x a.
>> Takže, co to dělá, je-li to buggy kód, snažíme se dělat na pět.
Takže se snažíme dostat do variabilní a změňte její hodnotu na 5.
A vzpomínám na svou analogii s krabice a podal krabici s někým?
Takže hlavní je toto políčko s názvem x.
A obsahuje hodnotu 3.
A já se snažím předat Tento box se na pět.
>> A já chci, aby pět změnit Hodnota tohoto pole 5.
A pak jsem jen vytisknout hodnotu x.
To je to, co můj function-- To je to, co se snažím dělat.
Jen se snažím aktualizovat hodnota x až 5.
Je to jasné, co funkce dělá?
>> OK, takže to, co se bude hodnoty x a tady,
první řádek, těsně před první line-- bych say-- programu?
>> STUDENT: Pravděpodobně odpadky.
>> Binky: Jen odpadky věci.
Tak jsem dal N / A. Tak jsme opravdu nevím.
Stejně jako, ani ještě neexistuje, protože jsme povoláni k pěti.
Int není deklarován.
A x bude existovat tady, ale máme opravdu
přiřazena žádnou hodnotu, takže v pořádku?
>> A potom, co se bude hodnoty x a A v počtu dvou?
>> STUDENT: [neslyšitelné].
>> Binky: Takže x bude 3.
Je to jednoduché, protože jsme přiřazení k ní 3.
A ještě neexistuje protože jen žije v pět.
Takže budu mít 3 a nic.
nebo jako smetí, cokoliv, ve skutečnosti definován.
A nyní, toto je důležitý řádek.
Zde se budeme vlastně volání na pět.
A pamatujte si, co jsem řekl.
Nikdy jsme se projít v krabici.
Právě jsme zkopírovat hodnotu box na jiné pole.
To je vše, počítače provést, zkopírujte věci z jednoho místa na druhé.
>> Tak na pět, co to vlastně dělá je zkopíruje hodnota x se.
Takže to, co se tu bude?
Hodnoty x a.
3 a 3, budeme jen kopírovat se přes od x.
V pohodě.
>> Teď jsme tady.
A teď jdeme aktualizovat rovná 5.
Co se bude dít v souladu čtyři?
>> STUDENT: [neslyšitelné].
>> Binky: se aktualizuje, ale x nedostal aktualizovány.
Protože x stále žije v hlavním, je to úplně jiný blok paměti.
Je to jiná proměnná.
je další proměnná.
Oni se stalo, že stejná hodnota, protože já
zkopírovány hodnoty x.
Ale teď když jsem si rovná 5, je není opravdu vliv x v žádném případě.
To je složitější část.
Má smysl, aby všechny?
Ano?
STUDENT: Ještě jedna otázka, máte 3.
Proč already-- oh, ne, to je 3.
Omlouváme se, ale nevadí.
Četl jsem 5.
>> Binky: Jo, 3, 3.
>> STUDENT: [neslyšitelné], jo.
Binky: A pak jsme přiřadit 5 až , ale opravdu nemění x.
Dobré?
Student: Ano.
Binky: Ano?
Můžete mi vysvětlit, jak znovu dostane kopírovat [neslyšitelné]?
>> Binky: OK, takže když zavoláte do pěti x, takže tento řádek kódu zde.
na pět x, co je x?
x je jen 3 v tomto bodě, že jo?
Takže si mohl myslet na umístění 3 sem a zapomenout x.
Stačí dát 3 zde.
Stejně jako, že budeme kopírovat přes hodnota x na int a, že je tam nahoře.
OK?
>> Takže hodnota x je 3.
Budeme kopírovat 3 se k.
A to vše další blok paměti, to jiné proměnné
tzv bude mít 3, stejně.
Dává to smysl?
Ano?
>> STUDENT: Dáte-li do pěti, jako mají to jako celé číslo x místo,
by to opravit všechno?
>> Binky: Pokud je to integer-- ne, že by se opravit všechno.
Tak to je velmi dobrá otázka.
To není opravdu jedno, co zavoláte tyto proměnné.
Opět platí, že to bude otázka rozsahu, protože nejsme stejní x.
Jsou zcela různé mezery v paměti.
STUDENT: [neslyšitelné].
Binky: Takže to opravdu není na tom, co jim říkáte.
To nevyřeší věci, OK?
Další otázky?
Ano?
>> Žák: Jak je to zpátky do číslo pět [neslyšitelné]?
Binky: OK, jsme to ještě neudělali.
Pojďme na číslo pět, pak.
>> STUDENT: [neslyšitelné]?
>> Binky: Co je?
>> STUDENT: Máte návrat vůbec?
Binky: Nemáme návrat, ne hlavní.
Ale hlavní vrací0 automaticky pokud se nic nevrací.
Ano?
>> STUDENT: Mohl byste, aby main-- nebo můžete provést pět vrátit?
>> Binky: Mohli bychom mít pět vrátit, ano.
Ale pak bychom museli přiřadit x rovná návratovou hodnotu na pět,
které by byly mírně jiný program.
Že to bude fungovat.
Ale to, co chceme udělat, je to, co je volal něco změnit na svém místě.
Takže chceme, aby skutečně změnit tento box a nestarat se
o nutnosti vrátit se hodnoty nebo tak něco.
OK?
>> To je stejně jako funkce odkládací David ukázal v přednášce, s výjimkou, že jsem
obchoduje pouze s jednou proměnnou.
A použil dvě, takže int a, b a pak dočasné proměnné a kdoví co ještě.
OK?
Takže to, co je na posledním řádku?
Po pěti vrátí, je to prostě půjde pryč.
Nebudeme mít už, a pouze x bude stále žít.
>> A hádejte, co? x nezměnil jeho hodnotu,
po tom všem, protože jsme pouze změnou hodnoty.
To je důvod, proč byla 3 x v celém textu.
OK?
Dobře.
Takže tento program není dosáhnout toho, co jsme chtěli.
Nyní se pojďme opravit.
>> A oprava programu je pomocí ukazatelů.
Co děláme, je, máme tři linky, které jsou odlišné.
První z nich je, že nejsme kolem x.
Jsme absolvování adresu x.
Takže místo toho, zkopírování hodnota pole
Jsem stále hodláte kopírovat nad něčím.
Ale já jsem zkopírování adresa z krabice.
>> Takže když jsem se projít adresu pole se na pět, a pak na pět
bude schopen zjistit, že v paměti a změnit jeho hodnotu.
>> Tak a pak tam mám že není již int.
je int hvězda.
Je to ukazatel na celé číslo.
A pak, protože jsem kolem řešit tady, a pak to, co mám dělat
není rovná 5, protože drží adresu.
Takže to, co chci udělat, je jít tam a aktualizaci obsahu této adrese
s 5.
>> OK, tak se pojďme projít všechny linky po jednom.
Takže když začnu tady, jsem ještě N / A, N / N /
za všechno, co v první line, protože jsem opravdu
prohlásil ještě věci.
A pak řádek dva, mám x rovná 3.
Int hvězda neexistují, to samé jako předtím.
>> Teď to začíná být zajímavé.
Takže jdu projít.
A předpokládejme, že adresa x je 12 v šestnáctkové soustavě.
Prostě předpokládají, že tato.
Udělal jsem to.
Takže to, co mám kolem tady je pět.
Mám kolem 12.
>> Takže to, co hodnota se má?
>> STUDENT: [neslyšitelné].
>> Binky: Cože?
>> STUDENT: [neslyšitelné].
Binky: Jo, jako, se pojďme Předpokládejme, že jsme tady a teď.
Ptám se.
>> STUDENT: [neslyšitelné].
>> Binky: Bylo zahájeno.
>> STUDENT: [neslyšitelné].
Binky: Protože jsme prošli něco, co se funkce.
Ano?
>> STUDENT: Adresa x.
Binky: Bude to mají adresu x.
A adresa x 12, dobrá.
Takže x bude 3, protože jsme se opravdu změnil x dosud.
A pak bude 0x12, tak adresu x, protože to je
to, co jsme míjeli na pět.
>> A co se pak stane když se budeme snažit, aby tam jít?
Co budeme hledat?
Takže pokud se pokusíte tisknout hrát, budeme sledovat tuto adresu
a získat hodnotu uvnitř.
A hodnota je jen Hodnota, kterou x
má, protože to je adresa x, který bude 3.
Jsme dobře?
>> OK, a pak už jsme vlastně tam.
A my aktualizovat cokoliv je v této adrese 12.
Děláme to 5.
Takže teď oba x a hvězda jsou 5.
>> Proč tomu tak je?
Vzhledem k tomu, adresa x je 12.
A má také 12 jako jeho hodnotu.
Takže pokud budeme následovat 12, my jsme jen tak najít x.
Takže bez ohledu děláme s hvězda se stane
x, protože obsahuje adresa x.
OK?
>> A to je jako jádru opravy.
Takže teď jsme schopni, z pěti, ve skutečnosti
přístup k paměti, která žila v main.
Takže to paměť nežije do pět, stejně jako předtím, tato adresa 12.
A my jsme byli schopni jít tam a změňte její hodnotu na 5.
>> A pak, když se vrátíme, zapomínáme.
Máme zapomenout na hvězdy a.
A x je stále pět.
Takže pokud chcete, aby implementovat funkci swap
byste prostě přesně to samé, kromě musíte zde int hvězdy,
a tak dále a tak dále.
OK?
Jsme dobře?
V pohodě.
>> Takže ukazatel aritmetiku.
To je poněkud složité téma.
Tak to dopadá, že ukazatele jsou jen celá čísla.
Můžete si je představit jako celá čísla.
Vzhledem k tomu, v paměti máte, jako adresa paměti nula, jedna, dva, tři,
čtyři, pět.
Takže můžeme shrnout adresy paměti.
>> A to je obvykle to, co děláte, když jste v poli a, např.
Pole je stejně jako sousedící blok paměti, spousty znaků,
například spousta ints.
Takže pokud chcete jít do Druhý int nebo třetí int,
stačí sečíst něco jako první adresu, a budete se tam dostat.
Tak tohle je opravdu užitečné pro to.
>> A to, aby na paměti, i když je
že to není jen rád normální aritmetika v tom smyslu,
že pokud máte co do činění s, řekněme, int hvězda, a přidáte 1 na to,
pak nebudeš přidat 1 na adresu,
budete se přidají 4 na adresu.
Vzhledem k tomu, int je 4 bajty.
>> Tak to je stejně jako chůzi na pole.
Pokud máme řadu spoustou ints a pak se snažíme jít do druhé,
je to v podstatě jen jako součet adresa prvního plus 1.
Ale to nebude be-- jen řekněme, že adresa prvního je 4.
Zde, v tomto případě.
A pokud bychom shrnout, tak to je to, co se děje.
Máme int.
Int x se rovná 5.
X má hodnotu 5.
A my inicializovat ukazatel, int y int hvězda y se rovná adresu x.
>> Předpokládejme, že adresa x 4.
Co se bude dít Nyní, když součet přidat 1 k y?
Bude to vlastně součet 4, ne jen 1.
Tak přidám 1, ale ve skutečnosti přidáno 4, protože počítač je chytrý.
Takže to bude opravdu sečíst i časy velikost typu ukazatele.
OK?
>> Takže pokud to bylo znak, například, pokud by se jednalo o char hvězda y,
a když jsme přidali 1, pak by být 5, protože znak je 1 byte.
Dobré?
>> A konečně jsme se dostali do ukazatele a pole.
Ukazuje se, že pokaždé, když máte co do činění s řadou,
jste vlastně do činění s ukazatelem.
Velmi pěkné koncepční důvod pro je to, že pole jsou velmi velké.
Takže pamatujte, že jsem řekl, že pokaždé, když se projít věci kolem sebe,
kopírování všechno.
Takže pokud máte pole To je opravdu, ale opravdu velký,
nemáte opravdu chcete kopírovat vše pokaždé
ho projít kolem druhého funkce, protože to je prostě
obrovské množství práce.
Takže to, co děláte, je hned za adresa prvního bajtu.
A pak funkce bude mít přístup na všechny prvky v tomto poli.
Takže si prošel řadu jeho adresy, takže adresa prvního bajtu.
>> Takže pokud budeme deklarovat int pole 3, zde víme,
Jak získat přístup k první prvek pomocí držáku notace.
Pokud si pamatujete na držák notace, pole držák 0 se rovná 1.
No, bylo by to přesně stejně jako právě tam a dal 1.
OK, je přesně totéž.
Takže držáku zápisu v zde bude stejný jako tomto řádku.
>> A hádejte, co se držák zápis pro pole držáku 1 bude?
To bude jen to samé, jako to.
Takže přidat jeden na pole.
Přesunout jeden po paměti.
Jděte tam, a dát 2.
OK?
A tato linka je totéž.
Chceme jít do třetí box, takže pole a 2.
Jděte tam, a dal 3.
Tak v paměti, co je se stane, je, že jsme
bude mít 1, 2, a 3, tři prvky tohoto pole.
>> Mohli jsme to udělali pomocí naše seznámit držák notace.
Chci jen vy vědět že jsou to samé.
OK, dotazy týkající se tohoto?
Nice.
Teď jdu do ruky to se k Hannah,
>> HANNAH: Yay, Yee-haw.
>> Binky: Povídání o paměti a článek věci.
[APPLAUSE]
>> HANNAH: Ahoj, v pohodě, takže jsme mluvit trochu víc
o paměti, které jsme právě řešit pomocí ukazatelů.
Takže tam jsou dvě hlavní části paměti, že jsme zabývá.
Máme hromadu, která roste up ve spodní a haldy, které
jde dolů z vrcholu.
A zásobník bude držet všechny naše instanční proměnné.
Tak každý volání funkce dostane vlastní malý rámeček na zásobníku.
Tak jako Gabe již bylo zmíněno, pokud se znovu a znovu volání funkce,
budeme na sebe věci na zásobníku.
>> A podobně, haldy, který začíná na vrcholu
bude držet všechny paměti že jsme dynamicky přidělit.
A tak jako my dynamicky alokovat paměť,
to přijde dolů směrem ke dnu.
Pár věcí, být vědomi, pokud jsme pomocí zásobníku a haldy,
s komínem, máme-li příliš many-- pojďme say-- rekurzivní volání,
a my jsme volání funkce znovu, a znovu a znovu a znovu,
a to je stohování up, stohování up, stohování up.
A to bude narazit do haldy.
Chystáme se spustit z paměti.
To bude způsobovat Problémem pro počítač.
A to nazývá přetečení zásobníku.
Tak to je určitě něco, co vás měli být vědomi a snaží se vyhnout.
A haldy, mít na paměti, ne náhodou úniku paměti.
Kdykoliv budete používat malloc, ne zapomněl uvolnit tuto paměť.
Jinak to bude jen být na haldě promarněné,
a počítač nebude vědět, že je zdarma k použití, že paměť.
To jsou jen pár věcí být velmi opatrní při
máte co do činění s zásobníku a haldy.
Jakékoliv otázky s tím?
Úžasné.
>> OK, v pohodě.
Takže tento druh má stejné nápad, protože přetečení zásobníku, kde
jdeme nad rámec meze toho, co paměť
Je bychom měli být schopni používat.
Tak se například vyrovnávací paměť, nebo mohl jen myslet na to jako pole.
A my jsme řekli OK, jdeme na vytvořit tento pěkný malý pole.
Bude to být řetězec.
Nebo to bude ukládat znaky.
A to jen tak pozdravit.
A je to neurčité.
To je všechno.
>> Ale kdybych byl někdo zlý a chtěl něco špatného s tímto polem, co
Co jsem mohl udělat, je pokusit se napsat za koncem řetězce.
A jak uvidíte, je-li Píšu dost daleko,
Já si skutečně ovlivnit zpáteční adresa.
A pokud začnu mít vliv na zpáteční adresa,
I vliv jak program ve skutečnosti běží.
A místo návratu, ty Víte, šťastný řetězec jako ahoj, jsem
mohl udělat něco špatného, ​​jako jít do někde jinde v počítači, stále
paměť, změňte jej, co chci dělat.
Takže to je to, co by to vypadat je, když jsem se trochu naplnil ji až
s náhodnou hodnotou odpadků, V tomto případě, jen.
A pak, když jsem se ve skutečnosti dostal na adresu v paměti,
Začal jsem ji naplníte něčím že udělal to, co jsem chtěl, aby to dělat.
Jakékoliv dotazy se přetečení vyrovnávací paměti?
Úžasné, létání vpravo prostřednictvím této věci.
>> OK, takže jsme hodně mluvili o o ukazatele s Gabe.
Jak se vlastně dostat ukazatel?
Jak se dostaneme adresu v paměti?
No, můžeme použít tento pěkný volání funkce malloc, které
dostane kousek paměti,
konkrétně haldy, jak jsme se bavili,
a to bude vám zpět ukazatel na tuto adresu v paměti.
A argument, že jsme dát na malloc
je, kolik místa v paměti chceme.
>> Takže vidíte, velikost v byte.
Řekněme, například, nebo ve skutečnosti, v tomto příkladu,
jsme se přidělit dostatečně prostor pro 10 celá čísla.
Takže asi to, co budeme chtít aby zde je pole 10 celých čísel.
Tak jsme se dát velikost ints, který jsme se dozvěděli, bylo, kolik bajtů?
STUDENT: 4.
HANNAH: 4, krásný, a my Chcete 10 z nich v řadě,
takže máme dostatek prostoru pro uložit všechny 10 celá čísla, v tomto případě.
Něco extra důležité, kdykoliv budete volat malloc,
budete se muset podívat null.
Pokud nemáte kontrolu null, dobře, malloc, pokud dojde k zaplnění
a vám už dá jakýkoli více paměti, vrátí null.
Takže pokud nechcete zjistit, malloc může vrátit hodnotu null.
A pak když se snažíme dereference null ukazatel,
budeme mít poruchu segmentace, které budeme mluvit právě teď.
Úžasné.
>> OK, otázky s malloc?
Ano?
>> STUDENT: Má kontrolu null [Neslyšitelné] nedělejte to na testu?
>> HANNAH: Jasně, byla otázka to matter-- na kvíz,
dostanete body, kdyby nezaškrtnete NULL?
Ano, dostanete body off pokud nemáte kontrolu null.
Kdykoli budete volat malloc, a to jak na kvíz a vaše psets a v reálném životě,
budete se muset podívat null.
Dobrá otázka.
>> Gabe: Co když nemám osvobodit?
HANNAH: Gabe chce vědět, co když ne zadarmo.
Pak budeme mít nevracení paměti v našem haldy.
Nějaké další otázky?
Ano?
>> STUDENT: Může you-- jít přes buffer overflow real znovu rychle?
>> HANNAH: Jasně.
Otázkou bylo, můžeme jít přes buffer overflow opravdu rychle.
Vraťme se k těm snímků.
Tak vyrovnávací paměť, můžete jen myslet na to jako pole, ne?
Máte nějaké místo v paměti.
A když jsme se poprvé vytvořit naší nabídku, víme, že pole mají pevnou velikost,
nebo naši pufr má pevnou velikost.
>> Takže řekněme, že v tomto případě máme jen dostatek prostoru k napsání řetězec ahoj.
Pokud půjdeme kolem, že mez, když půjdeme kolem co naše pole jsme si řekli, by to mohlo mít,
bychom mohli skutečně začít zápisu do paměti
že počítač není Chcete nám napsat na.
A zejména, když jsme hit něco jako návrat
řešení funkce, které, jako každý jiný kus paměti,
je jen někde v počítač, můžete skutečně
změnit a začít dělat zlé věci.
Odpověď na vaši otázku?
Super, něco jiného?
Ano?
>> Žák: Takže stack [neslyšitelné] se se tím, že jdou od dna stoupá.
V zásobníku rozsahu, dělá paměť jít z, stejně jako,
nahoru dolů vztahující se ke každé přestávce?
>> HANNAH: Jak you-- odložit na Rob na tento jeden.
>> ROB: To bude růst ve stejném směr jako zásobník roste.
HANNAH: OK.
ROB: Tak jsem se zmást.
To bude abstrakce.
HANNAH: OK.
ROB: To je v pořádku.
Takže v případě, že zásobník roste up, pak ji generally--
nemusí být takhle. ale můžete deklarovat int x.
Pak můžete deklarovat int y.
Pak int x bude obecně nižší ve frontě, než int y.
Ale to je prostě fakt.
To není jako důležitou osiva věc.
>> ROB: Takže otázka znovu bylo jen co se děje každý snímek buduje.
Takže každá funkce dostane Kousek zásobníku.
A jak jdete nahoru, v rámci které kousek, v tomto rámci,
budeme říkat, že proměnné v tomto rámci také pohybovat nahoru.
Otázka?
>> ROB: Jen aby se na mikrofonu.
HANNAH: Oh, yeah.
ROB: Budu mluvit do vás.
HANNAH: Oh, jo, OK.
ROB: Výjimkou je pro pole a structs,
kde pole, nižší index v poli,
a structs na vyšší pole v structs
je zaručeno, že při nižších adresách pozdější než hodnota v poli.
Tak ty jsou zaručeny.
Ale nějaké konkrétní proměnné uvnitř, jako int x, int y ve funkci,
není nutné vztah mezi jejich adresy.
HANNAH: Další otázka tady?
Žák: Takže v pufru toku, pouze přetečení vyrovnávací paměti
došlo pouze tehdy, když se, jako, přiděleno
množství pole že pak je větší?
Stejně jako, že?
Takže pokud se ptáte na něco z user--
>> HANNAH: Mm-hm.
STUDENT: Může se násilně dát něco zpět
to je větší než cokoliv jste přiděleny pro ně?
HANNAH: Jasně, takže otázka byla v podstatě,
Uživatel může dát více, než jste chtěli?
STUDENT: Jo.
HANNAH: No, mohli byste zabránit uživatel v tom, že.
Dalo by se konkrétně říci ne dej mi víc než x počet bajtů od
Jen jsem vám dal prostor pro x počet bytů, x počet znaků.
Tak to je něco, co chcete, aby se zabránilo.
Ano?
Jaký je rozdíl mezi stack overflow a přetečení vyrovnávací paměti?
>> HANNAH: OK, takže zásobník overflow-- oh, co
je rozdíl mezi stoh overflow a buffer overflow?
Takže chceme myslet na přetečení zásobníku děje, když jsme ve skutečnosti
stohování do těchto volání funkce.
Řekněme, že máte rekurzivní funkci, protože víme, že pokaždé, když se
volání funkce, je to dostane vlastní rám v zásobníku.
>> Tak jsme se vyrovnat příliš vysoká, a pak začneme přetečení.
A my používat příliš mnoho paměti, a Nemáme nikde odešel.
Jsme si, že chyba.
>> Přetečení vyrovnávací paměti je v rámci programu.
Chceme nemusí nutně mít nedostatek paměti stejným způsobem
že bychom mohli, pokud jsme stohování až tak mnoho volání funkcí,
ale píšeme kolem paměti že víme, že můžeme použít.
A to nám umožňuje dělat zlé věci.
Jo?
>> ROB: Ano, možná budete chtít, jen zopakovat to,
ale můžete si také myslí, o přetečení zásobníku
jako jako určitý typ z přetečení vyrovnávací paměti.
Nebo si jen myslíte, že vaše zásobník jako opravdu velký vyrovnávací paměti.
Pak, když jste přetečení jste zásobník, je to něco jako přetečení vyrovnávací paměti.
Ale přetečení zásobníku je jen specifický termín používá, když zásobník
sám přetečení.
>> HANNAH: Jo, tak opakujte pro video,
to si můžete myslet přetečení zásobníku jako specifický typ přetečení vyrovnávací paměti.
V pohodě?
Jakékoli další otázky, než budeme pokračovat?
Úžasné.
>> OK, v pohodě, tak se pojďme mluvit o Některé běžné chybové zprávy.
To je něco, co má ukázali na více kvízy,
tak něco, co stojí za to přičemž druhý pohled na.
Jsem si jistý, že jste se setkali alespoň některé z nich
jak děláte váš problém sady.
Takže ujistěte se, že můžete mluvit o nich na kvíz.
>> Takže první z nich je poruchy segmentace.
A to kdykoliv jsme pokusu o přístup k paměti
že nejsme povolen přístup.
Takže jste migh viděli to, Například, v útěku.
Pokud detekovat kolizi vrátí hodnotu NULL, a pak vás
se snažil udělat něco s touto hodnotou null,
počítač by dal Jste chyba segmentace.
Takže člověk, důležitá věc udělat, aby se pokusili vyhnout se této
je vždy zkontrolovat null.
>> Možná jste také vidět implicitní deklarace funkce.
Tak tohle je to, co se stane, když vás Allison ukázal
jak udělat prototyp, ne?
Takže řekněme, že máme nějaké funkce, které jsme definovat.
Řekněme kostky.
A, která jde na dně naší funkce, pod hlavní.
>> Pokud bychom zapomněli říct počítač o krychle, kdy hlavní pokusí volat kostky,
počítač bude, stejně jako, ach můj bože.
Nemám ponětí, co to znamená.
Nevím, co mám dělat, tady.
Takže prototyp říká, nebojte se.
Já jsem ti to říct.
>> To přijde.
Nekřič na mě.
Nedávej mi implicitní Prohlášení o funkce.
Takže pokud se tato chyba, jeden věc, kterou budete chtít udělat,
je ujistěte se, že máte prototyp.
OK?
>> A v neposlední řadě, nedeklarovaný identifikátor
je v podstatě, když se pokusíte použít variabilní, že jste prohlásil.
Takže najednou začnete říká, jako n a navíc plus.
A počítač říká, že to, co je n?
Nikdy jsi mi neřekla n byla věc.
>> Takže jedna věc, kterou musíte se ujistit, že udělal, je říci počítači, co je n.
Tak například, n může být celé číslo.
A pak se vyhnout této chybě.
Jakékoliv dotazy týkající se běžných chyb?
Ano?
>> STUDENT: Pro implicitní prohlášení o funkci,
by také mohlo být, že jste zapomněli na jednu knihoven jste měli
zahrnout, spíše než prototyp?
>> HANNAH: Jasně, takže Otázkou bylo, mohl byste
také získat tuto chybu, pokud si zapomněli například: knihovna.
>> Student: Ano.
>> HANNAH: Určitě, proto, že stejným způsobem
že chceme, aby naše prototypy před hlavní funkci,
pokud budeme mít knihovnu, ty jdou v podstatě zahrnují prototypy,
zahrnují definice funkcí.
Velká otázka.
>> STUDENT: Pro členění poruchy, by to také
se stalo, kdybychom, jako se snažil o přístup k proměnné,
jako v jiném [neslyšitelné] než byla vyhlášena v roce?
HANNAH: Jasně, takže by jsme se dostat chybu segmentace
pokud jsme se snažili přistupovat proměnná z působnosti této směrnice?
Byla to otázka?
Student: Ano.
HANNAH: Beautiful.
Takže pravděpodobně budete dostat undeclared chyba namísto identifikátor.
Takže to jen tak říct, Nevím, co to je.
Cool, něco jiného?
Jo, OK, překrásná.
>> V pořádku, takže rekurze.
Tak jsem se zmínil párkrát že bychom mohli dostat přetečení zásobníku
proto, že jsme volání našich rekurzivní funkce tolikrát.
Dostáváme všechny tyto stoh rámy, bla, bla, bla.
Co ještě je rekurzivní funkce?
No, rekurzivní funkce nějaká funkce, která volá sama sebe.
>> Některé věci mít na paměti, když vás provádějí rekurzivní funkce,
nezapomeňte zahrnout základní věci.
Referenční případ, je bod, ve kterém jsme se nakonec.
Tak, například, když jsme kódování, Řekněme, Fibonacci rekurzivně,
chceme, aby se ujistil, že až se dostaneme na 0 nebo první číslo Fibonacciho,
tyto dvě čísla mají tyto případy, protože ty nejsou závislé
na věci, které bylo předtím.
Ti, kteří mají své vlastní hodnoty.
>> Někteří profesionálové na rekurzi, což je otázka, kterou jsme viděli v minulých kvízy.
Ty mohou vést k stručné, elegantní kód.
A mnoho funkcí, mnoho různých algoritmů,
ve skutečnosti samy o sobě k rekurze.
Jejich definice by mohla být rekurzivní a sama o sobě.
Takže Fibonacci je jedna.
Faktoriál je jeden.
Merge sort znamená one-- všechny věci, které si můžete prohlédnout.
OK, nějaké otázky?
Ano?
>> STUDENT: Je rohový případ podobně jako základní případ?
Nebo je to, že pro některé další druh [neslyšitelné]?
>> HANNAH: Jasně, takže roh případ je any-- tak
rohová případě stejná jako základní věci?
Rohový případ je něco, že vaše kód může trochu chovat jinak.
Základní případ je trochu souvisí, v že jsou jako zvláštní případy
že budete chtít podívat na.
Ale představa, že základní věci je to, že chcete, aby váš rekurzivní funkce
zastavit na nějakém místě.
To nemůže držet volat sebe navždy.
Je třeba se zastavit na nějakém místě.
>> ROB: Ano, často, vaše základní případy mohou být příklady rohových základen.
>> HANNAH: Jasně, v pohodě, nic?
>> STUDENT: Mohl byste vysvětlit, zakládá trochu víc?
Nemám úplně pochopit [Neslyšitelné] základní případy.
>> HANNAH: z obecných případech?
>> STUDENT: případy Základní, jo.
>> HANNAH: Jo, jistě.
Pojďme se podívat.
Máme křídou tady?
Ano, máme.
OK, tak velmi rychle, budu zkuste napsat dost velký
takže můžete vidět na obrazovce.
Pojďme se bavit o opravdu rychle, Fibonacci.
Tak ti dám Fibonacciho posloupnost.
Můžete se podívat na definici.
>> V podstatě každé číslo v pořadí je součtem dvou předchozích čísel.
OK, tak tak, že jsem právě popsal Fibonacci,
jste mohli slyšet rekurzi, že jo?
Když jsem řekl, každé číslo je součet dvou předchozích čísel,
Dalo by se říci OK.
No, nth Fibonacci number-- tak pojďme
že máme tuto funkci volal fib-- fib n
se bude rovnat fib n minus 1 plus-- líto,
budeme jít na další řádek přes here-- fib n minus 2.
>> OK, tak to funguje skvěle, pokud jste při pohledu na, například, nula, jedna,
dva, tři, čtyři, páté číslo Fibonacci,
kde si lze říci, že 5 je rovno 2 + 3.
Ale co když jste na začátku?
Co když jste jen bít Tyto první dvě hodnoty?
>> Chcete-li získat tento jeden, nemůžete říkají přidat předchozí dva,
proto, že nula a- nevím.
Takže v určitém bodě, musíme zastavit.
V určitém okamžiku, je třeba říci, že tyto dva prostě mají své vlastní definice.
Číslo 0 Fibonacci je 0.
A první číslo Fibonacci je 1.
>> Takže způsob, jak bych mohl tento kód, I by se říct, jestli n je menší než dva,
pak už jen vrátit n.
A to by byla moje referenční případ.
To je, jak vím, že přestat s rekurzivní funkce.
Je to jasné?
Úžasné.
Něco dalšího o rekurzi?
Krásné.
>> Pojďme rychle mluvit o vyhledávání a třídění běží čas.
A pak dám Davin některých čas mluvit o kódování příklady.
Tak tady jsou hlavním vyhledávacím a druhy, které byste měli vědět.
Guarantee-- nemohu zaručit, protože jsem neviděl quiz--
ale to přijde kvíz po testu po ukončení programu.
Takže určitě použít tento graf.
Stejně jako tento graf.
Dej si to na svůj tahák.
Budete mít šťastný člověk.
>> To nám říká, dobu chodu každého těchto třídit a hledat algoritmy.
Takže lineární vyhledávání, můžete vidět běh čas, a to samé s binární vyhledávání.
Jít nad tím, co tyto algoritmy dělat, obecnou představu.
Podívejte se na nějaké pseudokódu, ne-li kód sám.
>> Uvidíte, že bublina druh má horní vázané v nejhorším případě n na druhou.
Takže pokud naše pole byl zcela zpět předtím, než jsme chtěli, aby to třídit,
bychom říci, že je to bude trvat n čtverců kroky.
Ale v nejlepším případě, takže dolní odhad pro nejlepší případ
bude-li to již dokonale řazeny.
Pak vše, co musíte udělat, je zkontrolujte, zda je třídit.
Je tu otázka, tady?
>> Student: Když by Chcete-li používat druh?
Sort.
Jsem jen zvědavý.
>> HANNAH: Pokud byste který chcete použít pro výběr druhu?
To z nich?
Ten, který je n na druhou v obou případech?
>> STUDENT: [neslyšitelné].
>> HANNAH: Takže je to velmi odlišné.
Máte-li specifické požadavky programu,
jako věci, jako kdybychom právě řekl realizovat search-- sorry--
zavést jakési, budete pravděpodobně chtít jít
pro jeden z těch, které má nejlepší případ n,
nebo dolní mez v nejlepším případě n.
Ale tam by mohlo být některé věci, jako, řekněme,
swapy jsou opravdu drahé z nějakého důvodu.
Pak byste chtěli dělat bubble sort, protože vás
musíte udělat tolik swapy, podobné věci.
Jakékoliv other-- ano?
>> STUDENT: Bylo by [neslyšitelné] říci, že [neslyšitelné]?
HANNAH: To je jedna věc, že by se říct,
pokud hledáte na implementaci.
Jak bych vlastně přemýšlet o tom, proč je n
squared je, že máme běžet přes naše pole délky n,
pokaždé, takže ve většině, n swapů.
A musíme udělat tento proces n krát.
>> Takže když budete muset provést nejvýše n swapy a pro n běží přes pole,
tam to bude n na druhou.
Ale ano, to bude odhaleno prostřednictvím tohoto dvojího pro smyčce,
jako otázka asked-- nebo vnořené smyčky for, řekl bych.
OK?
>> A pak sloučit druh, který je nejrychlejší druh nyní,
nebo že jsme probrali v CS50, vědí, že hlavní algoritmus je
Tato myšlenka vloupání do tříděné kusy a pak
Sloučením těchto tříděné bitů.
A dostane nás log n log n.
Jakékoliv dotazy týkající se vyhledávání a druhy, než jsem ji přenést na?
Pojďme se podívat.
>> Oh, spojových seznamů.
Omlouváme se, ale mám ještě jedno téma.
OK, super, spojových seznamů.
Problém s poli, mají pevnou velikost.
Takže pokud nevíte, jak velký váš vstup bude,
nechcete vytvořit pole.
Protože pokud budeme vytvářet matice, která je příliš malá,
můžeme narazit na přetečení vyrovnávací paměti.
>> Takže místo toho, mohli bychom udělat něco s spojových seznamů, které
nám umožňuje dynamicky velké datové struktury
které nám umožní uložit pružnější množství dat.
Takže v každém uzlu v našem spojový seznam, máme dva kusy.
Máme skutečnou hodnotu, která se ukládají.
Tak to je právě věc, kterou by viz v poli, např.
A pak jsme také sledovat ukazatel na další věci v paměti.
>> Na rozdíl od pole, které víme, že jsou všechny děje
na be-- prvky pole jsou jedním po sobě v memory-- souvisí
Seznam může být kdekoliv v paměti.
Jsou libovolné umístění.
Takže pokud bychom měli skutečně jít najít, jsme
je třeba sledovat Další věc, kterou v našem seznamu.
>> A pak, aby se vědět kde tento seznam jako celek,
všechno, co máme sledovat je První element v našem propojeném seznamu.
A že to nám umožní dotáhnout do konce.
>> Takže to je to, jak můžete definovat režim.
To je skvělá příležitost využít structs.
Protože máte tuto myšlenku, dobře, pro daný uzel, mám dva kusy.
Mám skutečnou hodnotu sám.
A pak jsem se ukazatel další prvek v připojeném seznamu.
Tak vidíte, máme celé číslo n, který bude skutečná hodnota,
a pak se ukazatel na uzel, nazvaný další.
Tak, že to bude další prvek v našem propojeném seznamu.
STUDENT: Ano?
Máte určit, že hvězda je jako struct?
>> HANNAH: Ano, tak od té doby to je skoro jako druh,
vypadá to, že rekurzivní Definice v tomto my
Potřebujeme vědět, co je uzel dovnitř k nalezení uzlu.
Vzhledem k tomu, že není ve skutečnosti vědět, co je uzel je kompletně
až se dostaneme na konec tohle-- a poté, co to se můžeme jen říkat
node-- uvnitř této definice, musíme říkat uzel struct.
Velká otázka.
Ještě něco?
Ano?
>> Žák: Proč my mají dvakrát říkat uzel?
Vzhledem k tomu, když jsme byli v [neslyšitelné] prostě jsme to udělat v středníkem,
ale teď musíme zjistit, že struct node? [Neslyšitelné].
HANNAH: Já se domnívám, V posledním příkladu,
jsme jen vytvořit, kdykoliv budete chtěli použít studenta po to, že jste
musel použít struct node-- Jsem sorry-- struct studenta.
To nám umožněno, po faktu, právě Použití uzel přidat nový typ, v podstatě.
To smysl?
Takže budeme muset vrátit a podívejte se na kód před.
Ale já bych, že jsme nepoužili typedef.
A my jsme se ptal, Proč musíme použít typedef?
Typedef nám umožňuje, aby se zabránilo slovo struct na začátku.
Ano?
Student: Jaký druh otázky by přijít
v podmínkách, pokud jde o uzly a spojové seznamy?
>> HANNAH: Takže jedna věc je, že jsme mohli říct, jak můžete vyhledávat prostřednictvím propojeného seznamu?
OK, protože je to trochu složitější
než kdybychom hledáte přes pole.
Můžeme se jen podívat na element nula, prvek jeden, prvek dva, bla, bla,
bla.
Pokud chceme hledat prostřednictvím propojeného seznamu
bychom skutečně následovat tento malý bludiště ukazatelů.
Takže pojďme skutečně jít přes to opravdu rychle.
To, co jsme mohli udělat v objednat to-- Řekněme, že
chcete jen iterovat naše zcela spojový seznam.
Chtěli bychom začít u hlavy.
A pak, aby se přesun na další prvek,
místo toho jen zvyšování jedním jako bychom mohli při přechodu přes pole,
jsme vlastně bude sledovat další ukazatele,
tak můžeme zjistit, kde v paměti další prvek.
Takže vím, že to není dost vzít to vše právě teď,
ale budete mít tyto snímky.
Takže se můžete projít Tato pomaleji.
Ale v podstatě to, co chceme, udělat, je sledovat tyto ukazatele
přes celé propojeného seznamu.
Tak to je otázka, můžete být požádáni.
>> Něco všímat s vložení, řekněme,
Chtěli jsme, aby nový prvek na před naším spojené seznamu.
Musíme být velmi opatrní, o pořadí, ve kterém
přeřazen ukazatele.
Vzhledem k tomu, řekněme, že jsem právě řekl, OK.
Udělat hlavy přejděte na tento nový prvek.
Jen ujistěte se, že poukazují na 1, pak jsme v podstatě ztratil zbytek našeho seznamu,
protože si nepamatuji kde 2 životy.
>> Takže musíme udělat velmi specifické objednávky.
Za prvé, jsme se vytvořit nový prvek přejděte na hlavě.
A pak uděláme hlavu poukazují na nový prvek.
Takže pojďme se podívat, jak to vypadá s arrows-- jen tak.
Takže musíte nejprve nový prvek přejděte na staré hlavě.
A teď máme hlavu přejděte na nový první prvek.
Jakékoliv otázky s tím?
>> OK tady je nějaký kód opět něco se podívat na trochu později.
A teď se otočte na Davin pro GDB a trochou praxe
kódování na papíře.
Krásné.
>> ROB: A Rob.
>> HANNAH: Oh, Davin a Rob.
Je mi to líto.
>> STUDENT: Woo!
>> ROB: Díky.
>> DAVIN: Chceš říct, vše opravdu rychle?
ROB: Jo, jo.
DAVIN: Poté, co jsem se.
OK, zatímco Rob dává mikrofon na, takže to, co je GDB?
Každý by měl vidět v GDB třídy a také na pracovní dobu.
A vy byste měli být jeho použití.
Takže to, co je GDB?
Někdo?
>> Student: To je debugger.
>> DAVIN: Je to debugger.
A co to vám umožní dělat?
Stejně jako, proč se máme rádi GDB?
STUDENT: Chcete-li zpomalit program.
DAVIN: Dobře, takže můžete chodit přes to jako člověk tempo.
A tak to, co jsou některé Příkazy můžete udělat?
No, přestávka je pravděpodobně váš oblíbený příkaz.
Vzhledem k tomu, že umožňuje rozdělit Program a vlastně jít přes něj
řádek po řádku.
>> Run umožňuje spustit.
Další, jako krokování.
Jaký je mezi další a krok?
Počkej, to nahlas.
To bylo správné.
>> STUDENT: [neslyšitelné].
>> DAVIN: Ano, úžasné.
Tak jako vedle a krok, pokud you're-- Řekněme, že máte funkci, kterou
definovat.
Řekněme, že některé v hlavní funkce, a vy jste jen bít dál, dál,
další.
Ty vlastně bude vykonávat tuto funkci,
ale budete skákat přes něj.
Pokud stisknete krok, nebo s nebo co, ty jsi
bude vlastně skočit do této funkce,
a pak můžete zasáhnout další vidět různé hovory
v této konkrétní funkce.
Jo?
>> STUDENT: Existuje způsob, jak skočit, jako, vycouvat?
DAVIN: Finish, jo, skončit se skákat ven.
Tak to bude až do konce, že funkce, a pak jste
bude zpátky v hlavním, například.
Print vytiskne ji jednou.
Něco, co jsem vždy použít, je na displeji.
Na displeji se ji vytisknout neustále v celém rozsahu
vašeho programu.
>> Například, pokud jste v cyklu for, a
Chcete vidět, jak se něco mění, a nechcete, aby, stejně jako neustále
dělat jako tisku, tisk, tisk, zobrazení
Zobrazí se této proměnné neustále, pokaždé, když stisknete Další.
A pokračovat.
Tak GBD, to je GDB.
>> STUDENT: Co je to jedno kde jste [neslyšitelné]?
DAVIN: Co je to?
>> STUDENT: Co je the-- místní proměnné.
ROB: Existuje něco, co ve skutečnosti stejně jako místní obyvatelé, nebo tak něco.
I can't--
>> DAVIN: Mohlo by to být něco takového, jo.
>> HANNAH: V místních obyvatel?
>> DAVIN: To je ono.
To je jedno.
ROB: Beautiful.
>> DAVIN: Jo.
>> Student: Co dělat i nadále?
>> DAVIN: Je continues--, takže je to jen bude pokračovat vaše programy.
Takže pokud se zlomí a hit pokračovat, bude to
jen spustit tento program, dokud zasáhne, že přestávku znovu.
Tak například, pokud zlomil ve funkci,
a budeš dělat, jako pro smyčka nebo něco takového,
a stisknete pokračovat, bude to pokračovat a vrátit se k této přestávce.
Nebo je to bez přerušení, bude to pokračovat a dokončit program.
>> ROB: Takže jen rád zastaví, v prvním zlomu
narazí-li vás, pak hit pokračovat, bude to držet
bude, až je to další bod zlomu.
A pak pokračovat půjde na další zarážky.
DAVIN: Nějaké další otázky týkající se GDB?
Takže myslím, že v minulosti, Požádali jsme vás, co
GDB je a dát Příklad některých věcí, které
můžete dělat s GDB, tak real jednoduché, ale jo.
Tady to je.
A uzly?
>> ROB: Ano, ano, jaký směr to bylo?
Student: Tak to bylo.
DAVIN: Počkejte.
ROB: Ten chlap?
DAVIN: Ten.
ROB: Ten chlap, oh, jsem si neuvědomil.
Takže jsme nebyli jasné, na to, co the-- vůbec se mi nelíbí
vědět, kdo to was-- ale otázka.
Nevíme přesně, co si žádali o to, aby právě
objasnit něco.
Takže nejprve, jak jsem řekl dříve, typedef budete vždy používat jen
vytvoření názvu pro typ.
Tak tady je přezdívka jsme tvorba je pro tento typ struct uzel.
>> Takže nejprve, nebude-li to uzel typedef, takže to struct node kudrnaté
obrnil se na další kudrnatý Ortéza je typu struct node.
A musíme do tohoto uzlu tam, protože jsme
je třeba referenční uzel zde.
Tak s tímto druhem rekurzivní struct, je třeba dát to struct jméno,
jinak byste nemohli říkají struct uzel zde.
Zatímco dříve se studentem když jsme napsali, myslím,
jsme neměli říkat Student tam nahoře, protože jsme
Nemusel říkat struct Student uvnitř struct sám.
Tak to je rekurzivní, že nás nutí říci uzel tam.
>> Tento uzel je jen název jsme dávat uzel pro typedef.
Tak, že uzel není stejně jako tento uzel.
Tento struct uzel, ale je stejný jako ten struct uzel.
DAVIN: Takže kdykoli budete volat, jako uzel v hlavní funkce,
nebudeš se musím říci struct uzel.
Stačí si jen říct, uzel, protože Uzel je different-- je v podstatě
říkáš, OK.
Místo toho, aby volání struct uzel v mém kódu,
Já jen chci, aby to přejmenovat jako uzel, aby bylo snazší.
>> ROB: Pokud jste vždy použití typedef, pak tento
je jediným místem, kde budete mít deklarovat proměnnou s struct uzel
hvězda, jo.
>> DAVIN: OK, takže poslední část Je těžké naučit protože--
ROB: Co je?
>> DAVIN: Vzhledem k tomu, že to kódování na papíře.
Takže každý rok máme Kód na papírových otázky.
Takže myslím, že v loňském roce, 12 z 80 bodů se kód na papíře.
Rok před tím, 10 z 80, před rokem, že 20 ze 100,
tak poměrně málo z nich.
Takže budete muset být schopni kódovat těchto funkcí rukou.
>> Tak jsem si myslel bychom mohli projít několik z nich, a vidět, jak lidé,
druh projít je pomalu s lidmi.
Takže obecně, strlen a atoi byly velmi populární.
V loňském roce, myslím, že bychom měli GetPositiveInt a RandomInt.
Ale pow, tak moc, i pozitivní moc.
Pojďme se jen projít možná jeden nebo dva z nich společně.
Co lidé chtějí vidět?
>> STUDENT: atoi.
STUDENT: Jo.
DAVIN: atoi?
STUDENT: [neslyšitelné].
DAVIN: OK, já jdu na to na desce.
Máte přednost když jsem to tady nebo tam?
Tam, Gabe říká, že existuje.
>> ROB: A to je obecné myšlenky na tyto otázky kódování.
Zkuste něco napsat.
Nenechávejte prázdné.
>> DAVIN: Ano.
ROB: Pokud se můžete dostat vrátí typ správné,
nebo možná bychom mohli dát to vy, ale pokud je to možné, stejně jako,
napsat obecnou funkci podpisu, Pokud se můžete dostat na základní věci v pořádku,
nebo rohové případy, nebo pamatovat šek na null,
pokud máte nějaké věci, pak možná budeme
vám může dát pár upozorňuje na problém.
Nepoužívejte jen nechat prázdné.
>> DAVIN: Ano, a pokud máte jsou jen zcela
agitoval na to, jak ve skutečnosti promění kódu.
Pokud napíšete pseudokódu, to je docela dobrý taky.
Takže je to jako, že je to šest bodem otázka, a píšete správné pseudokódu,
budete mít alespoň dva body.
Takže to není jen nechat prázdné.
Zkuste si dát něco.
>> ROB: To musí být správné pseudocode, ačkoli.
>> DAVIN: Ano.
ROB: Takže jsme obecně méně shovívavý chyby v pseudokódu.
Davin: OK, tak vy chtěl vidět atoi.
OK, tak jen really-- takže to, co chcete dělat,
je budete mít vzhledem k tomu nějaká čísla.
Ale toto číslo není bude int, ne?
Jaké to bude?
>> STUDENT: [neslyšitelné].
>> DAVIN: Bude to být řetězec, ne?
Takže pokud jste dostali string-- pojďme say--
>> ROB: Mám vytáhnout editor?
Nemohu vytáhnout up--
>> DAVIN: Oh, chceš to udělat on--
>> ROB: Chtěli byste raději desku?
>> DAVIN: Co chcete dělat?
Myslím, že to chcete udělat ručně?
Nebo si chcete udělat na počítači?
>> ROB: Udělej to po ruce.
>> DAVIN: [směje se]
ROB: Udělej to po ruce.
>> DAVIN: OK, takže to bude atoi.
Takže to, co je to-- Myslím, že budeme pravděpodobně dát to na vás.
Ale co to jde vrátit?
>> STUDENT: Int.
>> DAVIN: Bude to návrat int, ne?
Takže-- Nechci, aby to tam.
Udělám to tady.
>> ROB: můžete vytáhnout ho dolů a zatlačte až na to.
>> DAVIN: jo.
[Smích] změna Game.
OK, takže to bude int atoi, a to, co to bude trvat?
Char hvězda, tak jen string, hvězda s, stejně jako to.
>> ROB: Pěkný hvězda, pěkný.
DAVIN: To nemusí být tam, OK.
ROB: Jo.
DAVIN: OK, takže první věc, kterou chcete do-- I
nevím, jestli někdo podíval v praxi solutions--
ale to, co se chystáte chtít udělat, je, že jste
bude chtít mít smyčka, protože jsi
bude chtít skutečně krokovat tohoto řetězce.
Tak helpful-- takže řekněme, že budeme pro smyčce,
a budeme krokovat každý prvek řetězce.
Jak dlouho to je?
Kolikrát budeme iterovat v tom, že pro smyčce?
STUDENT: Sterln?
DAVIN: Sterln, jo.
Takže řekněme, že délka se rovná int sterln s.
A jen zvědavý, proč je to vždy trochu lepší to udělat mimo smyček?
Stejně jako, proč je lepší zavolat Tato funkce mimo smyčky?
Stačí zkontrolovat rychlý zdravý rozum?
Jo?
Žák: Takže vy ne musí udržet kontrolu.
Stačí si jen [neslyšitelné].
>> DAVIN: Přesně tak, tak jo, přesně to, co řekla.
Takže jsme nemuseli udržet kontrolu.
Tak například, pokud volám Tato funkce uvnitř smyčky,
pak budu mít volání Tato funkce vícekrát.
A že to bude klesat účinnost vašeho programu.
Takže je to vždy užitečné prohlásit ho ven.
>> ROB: To je řekl, na některou z těchto problémů,
skoro tak dlouho, jak vám pracovního roztoku, dostanete plné uznání.
Tak to pokud váš návrh nebojte je naprosto strašný.
Mohlo by nás naštvaný číst váš kód.
Ale tak dlouho, jak to funguje, dostanete body.
>> DAVIN: Ano.
OK, tak pak budu prohlásit nějakou proměnnou.
Je to jen tak zavolat int částku.
A já jdu nastavit tento roven nule, jako je, že.
A to jen tak jako zástupný symbol.
Tak, že to bude co budu vracet.
Takže jdu nakonec vrátit částku z tohoto programu.
Takže mám tyto dvě proměnné.
Mám délku.
Mám částku.
A teď pojďme skočit do našeho řetězce.
>> Tak umožňuje máme pro smyčce.
Takže čtyři int I = 0 w, zatímco I je menší než délka I s plus.
A now--
ROB: Nice.
DAVIN: OK, a teď tady pochází maso z našeho kódu.
Takže se můžete skutečně dělat to v podstatě v jedné linii.
Takže nemá někdo nějaký nápad o tom, co budeme dělat dál?
OK, tak to je v pořádku.
Takže děláme říci částku equals-- dovolte mi, abych uhánět tento over-- součet
se rovná součtu časů 10 plus-- jsme bude trvat S i mínus jedna
quote 0 jeden citát udělal, takhle.
ROB: Velmi intuitivní.
>> DAVIN: Drcený to.
OK, takže someone-- jsem to, mám to.
OK, tak je to jednoznačně stoupá.
Co to znamená?
Takže Ví někdo, co to znamená?
Může každý vidět?
Ne, nikdo nemůže vidět, OK.
Jdu to--
>> ROB: Chystám se napsat vzorec právě zde.
DAVIN: OK, Rob to bude dělat na počítači, což je zábava.
ROB: Oh můj bože.
Nebo nebudu.
DAVIN: Stand by.
STUDENT: Mám dotaz.
DAVIN: Jo, jasně.
STUDENT: [neslyšitelné]?
DAVIN: OK, tak to ve skutečnosti, podobně, jen obecně,
pokud jste měli dát, jako, v tomto prohlášení int
I rovná délce 0 čárkou rovná sterln, that--
>> STUDENT: [neslyšitelné].
>> DAVIN: To je v pořádku, protože that--
Žák: Proč byste dokonce nutné použít délku?
Proč by ne jen [neslyšitelné] sterln s, stejně jako po celou dobu [neslyšitelné]?
>> DAVIN: Myslíš tady?
>> Student: Ano.
DAVIN: Protože každý čas to pro smyčce běží,
to bude hodnotit tuto podmínku.
STUDENT: Správně.
DAVIN: A pokud máte sterln tam, pak je to
bude mít skutečně volat že funkce každý čas.
Takže místo toho jen porovnejte ji s int,
budete volat Funkce a poté porovnáním
na návratovou hodnotu.
Jo, tak je to prostě, jo.
>> Nice, OK, takže teď může každý vidět.
Co does-- je to jako, to je ono.
Jedná se o jam, přímo tady.
Co to znamená?
Co to dělám?
Jo, nápad?
Jo?
>> STUDENT: Dobře, takže když jste zadání pole,
budete jít zleva doprava,
takže budete jít do Desetinná z dolů [neslyšitelné].
DAVIN: Přesně tak.
Žák: Takže každý musíte násobit
co jste viděli, jak hodnoty int strany když se dostanete k pohybu, že více než jeden.
>> DAVIN: Perfektní, perfektní, tak například, pojďme
říci, dal jsem you-- jsem napíšu sem.
Ne, nejsem.
Chystám se napsat sem.
Řekněme, že jsem ti dal 76, že jo?
Řekněme, že vám 76.
Je to řetězec začíná, OK?
>> Takže délka je co?
2, že jo?
Součet je 0.
Pak skočíme v našem cyklu for.
OK, první iterace to, co je to bude?
Je to bude částka je 0.
Aby součet krát 10 0.
To je nesmyslné.
Tak co to dělá?
STUDENT: [neslyšitelné].
>> DAVIN: to bude zase, že znak na celé číslo, ne?
Je to trochu jako s vaším Problém set-- této light--
je to něco jako s problém nastavit na Visioneer.
Máte co do činění s hodnotami ASCII.
Takže když dám vám, jako, sedm, ale je to postava,
a chcete vědět, OK, co číslice je to?
Jo, mohl, jo.
Takže to, co je číslice, že?
Dalo by se odečíst 0 z něj, ale musí odečíst 0, znak.
>> A tam, kde někteří lidé si zakopl, jsou
jako, OK, dobře, musím vědět, hodnoty ASCII pro tento kvíz?
Ne, určitě ne potřebujete vědět ASCII
hodnoty, jako, malá , velká písmena, nula.
>> ROB: Není žádný důvod, aby vůbec dát to na tahák.
>> DAVIN: Rozhodně ne ztrácet prostor s tím.
Můžete literally-- jen místo říkat 48, stejně jako až
tu, která je ekvivalentní říká jeden, jeden apostrof,
jako to, že přesně stejný.
>> ROB: Dalo by se skoro, že o tom, jak if-- Boha, potřebuji,
oops-- si skoro myslet na to, jako máme-li něco takového hash
definovat 0 jako 48.
To nebude fungovat.
Ale myslet na to, jak jednoduchou uvozovku 0 jednoduché uvozovky, a pro všechny znaky.
Ber to jako konstanta, která představuje tuto hodnotu ASCII.
>> DAVIN: Ano.
OK, tak poprvé po tak s 76-- tak poprvé po,
je to jen znak 7 minus znak 0,
a ty, které jsou sedm integers-- dobře, ti,
sedm prostory od sebe další na ASCII tabulky, nebo cokoliv jiného.
Tak, že to bude vrátit INT 7.
Takže teď, částka se rovná 7.
>> OK, dobře, pojďme skočit do této smyčky for znovu.
OK, teď je to částka krát 10.
Takže jsi skutečně přesunutí 7 doleva.
Dává to smysl?
Jste efektivně Pohybem doleva.
>> A pak se to add-- bude 6 minus 0.
To je 6.
Takže to bude 70 a 6.
76, to je vaše číslo.
Takže bez ohledu na to, co čísla Dal jsem vám, že je to pomalu jen
bude posunout větší hodnoty doleva, 1 faktor 10
Pokaždé, když v cyklu for, a pak přidat jako nutné.
>> V zadní?
STUDENT: Nemáme dělat jakákoli kontrola v programu?
>> ROB: Takže, pokud jde o kontrolu jde o program,
bychom vám říct dost hodně, co je třeba zkontrolovat.
Pokud se nám nepodaří říct něco, pak obecně
Předpokládám, že máte zkontrolovat většinu věcí.
Stejně jako můžete, jen pro jistotu, ty by pravděpodobně kontrolovat hej, je to null?
Pak jsem tušení, co se vrátíte.
Ale my vám řekne něco takového.
0, nevím.
>> DAVIN: A proč byste měli chtít překontrolovat, zda je rovná null?
STUDENT: [neslyšitelné].
DAVIN: Kvůli char hvězdy.
Je to ukazatel.
Takže naprosto přijatelné prohlášení, mohl bych říct, OK,
s rovno null, protože to může být ukazatel na hodnotu null.
Takže kdykoli budete mít ukazatele v cestě v takhle,
asi byste měli zkontrolovat.
Protože pokud nechcete zkontrolovat, zda, a pak byste pak jít do smyčky for,
a vy jste doing-- uhánět dolů.
Uhánět dolů.
>> ROB: Omlouváme se, ale to je vše.
>> DAVIN: A tak, stejně jako v případě je null, a pak vás
udělat to, co chybu se chceš dostat?
STUDENT: Budeš mít nastavenou poruchu.
DAVIN: Budeš nastavení chyba, že jo, protože jsi
snaží se index do null.
Takže se pokusím index do paměti, že nemáte vlastní.
Takže to, pokud je to null a tak učiníte, budete cyklus vám.
>> ROB: také si myslím, na zkoušku, ve které Zeptali jsme se na tuto otázku, můžeme vám říct,
které lze jen předpokládat, je kladné číslo.
Vzhledem k tomu se také očekává, že atoi zvládnout záporná čísla,
takže budete muset zvláštní případ.
Hej, je první znak pomlčka, v tomto případě, OK,
teď je záporné celé číslo.
Řekneme vám tyto druhy věcí.
My vám řeknu, co je potřeba zvládnout.
DAVIN: Ano.
Takže jsem si jistý, že někteří lidé mohou have-- pokud jste začali při pohledu na staré zkoušky,
Viděli jste sterln.
To je populární.
A myslím, že v sterln, museli jste tuto kontrolu na null, návrat
0 nebo něco takového.
Stejně jako byste měli zkontrolovat null.
A pokud tomu tak není, že mířil pryč na kvíz.
Tak jako tak, dělá všem pocit, OK s atoi?
Chce někdo projít částí znovu?
ROB: Jo, myslím, že vám také řekne,
Lze předpokládat, že všechno je-- že oni jsou vlastně zadání čísla,
že nemusíte mít obavy, jako, písmena jsou v řetězci, a tak.
DAVIN: Jo.
Ano?
STUDENT: Můžeš jít v průběhu ještě jednou, když
použít dvojité uvozovky a jednoduché uvozovky?
>> DAVIN: Jasně, takže dvojité uvozovky, velmi Jednoduše řečeno, je dvojité uvozovky jsou řetězce.
Takže pokud jste dvojité uvozovky nic, to je řetězec.
Tak, jako kdybych měl tento 0 sem, a já jsem to udělal, to je řetězec.
To už není znak.
Takže nemohu najít tuto hodnotu na mém ASCII graf, protože je to string, jo.
>> OK, nějaké další otázky?
Ano?
>> STUDENT: Takže jste již odpověděl tento,
ale jak, když jsme ve skutečnosti psaní na testu to,
chcete, abychom psát lomítka nuly [neslyšitelné]?
DAVIN: Ne
Otázkou bylo, měli byste dát lomítko přes nulami
aby uvedli, zda jsou nuly?
Ne, budeme na to přijít.
Jo, díky, že jsou dobré.
OK, něco jiného?
Chce někdo to-- tak si myslím, Udělali jsme trochu v čase.
Chceš vidět další, nebo?
STUDENT: RandomInt.
>> DAVIN: RandomInt, OK, přesně tak.
Takže pojďme dělat RandomInt.
Udělám to tady.
Takže RandomInt je ve skutečnosti mnohem jednodušší.
Myslím si, že atoi je asi nejtěžší jeden že jsme se ptal v minulých letech.
STUDENT: [neslyšitelné].
>> DAVIN: Co je?
ROB: Vidím, jestli je to druh z zobrazitelná sem.
DAVIN: Je to tak?
ROB: Nemyslím si, že je to going-- myslím, to bude běžet napravo.
DAVIN: OK, tak já to udělám tohle.
A pak stačí dát ji na obrazovce.
>> ROB: Dobře.
>> DAVIN: Chceš být můj písař?
>> ROB: Jo.
>> DAVIN: Nice.
OK, mohu vymazat to?
>> STUDENT: Jo.
>> DAVIN: To je tak těžké.
(Zpívá) Děláš co děláte.
A to, co nemáte.
Dobrá.
>> OK, pokud si dobře vzpomínám, na kvíz RandomInt byl rád,
OK, budu vám dva čísla, jako je A a b.
A já chci, abys mi RandomInt mezi těmito čísly.
Takže RandomInt se děje aby se dva numbers--
tak RandomInt-- a je to chystá vrátit int.
>> Takže to, co je návratová hodnota?
Jen jsem ti to řekl.
Int, že jo?
Stejně jako tento, a pak je to bude trvat dva celých čísel.
Takže to bude trvat int a int b, takhle.
Takže to, co je RandomInt chystá udělat, je, že to bude
vrátit nějakou náhodnou hodnotu mezi těmito dvěma hodnotami.
Takže to bude větší než, menší než b.
Takže myslím, že můžete pravděpodobně předpokládat, že je menší z těchto dvou hodnot.
Takže pokud máme co do činění s náhodnost, jakou funkci
jsme viděli, že nám dává náhodné věci?
STUDENT: Drand.
DAVIN: Drand, přesně tak.
Takže budete pravděpodobně chcete používat drand.
Takže můžete říct, int náhodný, a my jen říct, že se rovná 0, právě teď.
A oni budeme říkat, OK, náhodné rovni drand 48.
A co to vrátit?
Co tato funkce vám?
>> STUDENT: mezi 0 a 1.
>> DAVIN: Jo, mezi 0 a 1.
Takže to bude be--
>> ROB: A to je-- myslím, bychom ti toto.
Stejně jako můžete použít drand 48.
To si můžete ověřit na minulé zkoušce.
Ale nejspíš, že jste lze použít drand 48, který
vrátí plovák mezi 0 a 1.
>> DAVIN: Ano, ano, já jsem si jistý, že na zkoušku
to vám říká, že pravděpodobně chcete použít drand, jo.
Takže to bude návrat nějakou hodnotu mezi 0 a 1.
A co pak jste bude chtít dělat?
No, chcete násobit by-- počkej, já si myslím, že je to takhle, je mi líto.
Budu dělat.
Nevím.
>> Takže b minus.
Tak proč b minus?
Takže řekněme, že drand vám dává zpět int-- OK, budu prostě dělat zbytek,
tak plus.
Takže to, co does-- y je b minus.
Takže řekněme, že drand vám dává zpět Maximální hodnota by to mohlo
dát.
Co to bude?
STUDENT: 1.
>> DAVIN: 1, ne?
Takže pokud je to 1, a vy jste vynásobením b mínus,
No, to je právě Rozdíl mezi minus A.
A pokud si přidejte, že zpět na, to je co?
Je to v podstatě b.
Dává to smysl?
>> Student: Ano.
>> DAVIN: Takže pokud je to maximum cení by to mohlo být,
to bude jedno.
A pak je to jen Rozdíl mezi těmito dvěma.
Přidat na, takže to je chystá se vrátit náhodné.
A v případě, že rohové drand vám vrací 1,
náhodný bude jen účinně b.
Ale to je maximum to může být.
Takže pokud to bude méně než že, takže řekněme, že je to jako 0,9,
tak pak 0,9 násobek b minus bude méně
než rozdíl mezi b minus.
>> A pak, pokud jste dodat, že na, pak tato hodnota je
bude větší než, protože přidáváte něco na něj,
ale to bude menší než b.
Takže budete mít náhodné číslo, protože voláte drand.
A to rand, že náhodné číslo je bude někde mezi
a b.
Dává to smysl?
>> ROB: Stačí, aby ji v konkrétní čísla, takže
řekněme, že chceme vybrat náhodné číslo mezi 7 a 10.
Takže b minus je náš sortiment.
Takže tam je řada tří Čísla chceme vybrat.
A pak vynásobením že mezi 0 a 1 1,
li, že pak nám dává some-- řekněme, že nám dává 1.5.
>> Poté 1.5, chceme jít od 7 do 10.
Takže 1.5 a 7 nás přivádí zpět do naší 7 až 10 rozsah.
A pak jsme uložením uvnitř celé číslo, takže je zkrácen až na 8.
A pak jsme se prostě vrátit, že.
Takže b minus je náš sortiment.
posune ji do čísel že chceme v tomto rozsahu.
Tak mezi 7 a 10, a pak jsme můžete vrátit, co jsme skončili s.
>> DAVIN: Jo, pěkný.
>> ROB: Děkuji.
>> DAVIN: Jo, co se děje?
>> STUDENT: Měli bychom jej spustit na jakékoliv Chyby ASCII když we're-- pokud drand je
vrácení plovák [neslyšitelné].
>> ROB: Takže stejně jako řekl Rob, protože není náhodný int,
tak drand bude float.
Tak a pak násobí ven.
A můžete získat některé druh čísel float.
A pak, že to bude zkrátit.
>> STUDENT: OK.
DAVIN: Jo.
ROB: A v případě, že kompilátor měl varovat jste asi, jako, ztráta přesnosti,
jen hozený int v tam, a pak je to dobré.
DAVIN: Ano?
>> STUDENT: Měl by Stejná pravděpodobnost získání,
jako, b nebo [neslyšitelné]?
>> ROB: Takže je-- jsem vlastně wondering-- je RandomInt předpokládaný
být číslo od méně než b?
Stejně jako, když je to mezi 7 a 10, jaké jsou možnosti?
7, 8, a 9, nebo 7, 8, 9, 10?
DAVIN: Zapomněl jsem.
Na problém set--
>> ROB: Myslím, že je to 7, 8, 9.
>> DAVIN: Konkrétně říká One včetně a jeden je exkluzivní.
>> ROB: Jo.
>> DAVIN: Ale já ne-- jsem ne--
>> ROB: Takže myslím, že to je není v ceně, v takovém případě,
tam je rovno pravděpodobnost, 7, 8, a 9.
Neexistuje žádná pravděpodobnost 10.
DAVIN: Ano?
STUDENT: Mám dotaz.
Chceme definovat funkci vrátí ne jednu hodnotu, ale pole.
Poté, co by bylo syntax po návratu?
>> DAVIN: OK, tak pak would-- po návratu?
Takže řekněme, že jste prohlásil, pole někde tam nahoře.
Pak byste právě návrat název pole.
>> STUDENT: OK, děkuji.
Pak už stačí jen vrátit s je--
DAVIN: Ale počkejte, to tak líto.
Otázkou bylo, jak se vrátíte pole.
>> ROB: I když to nešlo být prohlášena pole
na zásobníku nebo něco podobného.
Muselo by to být něco, co malloced, protože malloc
je, jak se dostat kolem automatické přidělování paměti.
>> DAVIN: Ano.
ROB: Jak se dostat kolem místního rozsahu.
>> DAVIN: Ale ty by jen vrátit jeho name--
>> STUDENT: [neslyšitelné], že to není jeden hodnota, například, dvě čísla, tak
[Neslyšitelné].
>> DAVIN: Nemůžete se vrátit mnohonásobné telefonní číslo.
Nemůžeš, jako, return--
>> STUDENT: Mluvil jsem o návratu pole, nebo něco takového.
>> DAVIN: Jo, to je otázka mohu vrátit více hodnot.
Můžete se vrátit více hodnot.
Nemůžete něco jako návrat pak vrátit B nebo něco takového.
Vzhledem k tomu, po návratu, ty návrat z funkce.
A pak je tato funkce provedena, a jak řekl Rob, je na stacku.
>> Takže vše, co paměť prostě dostane se vrátil k počítači.
Vše, co dostane zapomenuta, v podstatě.
Takže pokud se chcete vrátit více hodnoty, budete muset vrátit pole,
A způsob, jak to udělat, je mallocing.
A pak se vrátí x takhle.
V podstatě stačí vrátit název.
A až se vrátíte něco takového, že jste
ve skutečnosti vrací hodnotu.
>> Takže řekněme, že jste uložili hodnoty v poli.
Nejsi ve skutečnosti návrat těchto hodnot.
Stejně jako, když jsem se vrátil int, jsem Opravdu vrácení kopie hodnot.
Ale kdybych si měl vrátit něco takového,
Vracím odkaz na tyto hodnoty.
Tak jsem se vracím, v podstatě, adresa paměti na hodnoty.
Dává to smysl?
Student: Ano.
DAVIN: Nice.
Ano?
>> STUDENT: Když jste pomocí drand sem,
máte dát srand před tím?
>> DAVIN: Ne, ne, já si to nemyslím.
>> ROB: Jo, tak to máte říci něco o srand?
Výchozí vás nikdy říkat srand vůbec je prostě srand null.
Takže drand na vlastní bude fungovat.
A to bude automaticky osivo aktuální čas, je to, co používá.
DAVIN: Ano?
STUDENT: Myslíte si, [neslyšitelné] s čísly?
DAVIN: Ano, můžete.
Žák: Takže byste mohli říkají, jako, 4x 2.
Jde o to, nemůžete předpokládat, potom int je čtyři bajty.
Only--
>> DAVIN: Myslím, že pro kvíz můžete.
[Smích]
>> ROB: Mm, no.
DAVIN: Ano, ano, můžete.
Pokud se zeptat, jak velký je int, nemůžete být, jako, čtyři nebo osm.
ROB: Aha, takže v případě, že Otázkou je zejména,
podobně, pokud se jedná o problém kódování, byste měli říci velikost int.
Pokud se jedná o stůl, nebo říká, kolik bajtů,
neměli byste vyplnit velikosti ints.
>> STUDENTI: [směje se]
>> DAVIN: Dobře, tak proč je velikost int zde důležitý?
Tak jako, pokud jedeme na 32-bit procesor nebo něco takového,
pak to bude čtyři bajty.
Ale na některé z novějších věci, by to mohlo být, co?
Mohlo by to být osm, ne?
Takže tohle-- pokud jste právě tvrdě kód čtyři, pak na některých počítačích, bude to fungovat.
Některé stroje, nebude to fungovat.
Ale pokud na kvíz kterém jsme jako jak velký je int?
Dejte čtyři.
ROB: Správně.
DAVIN: Jo?
Žák: Takže, protože jsme vyhlášení [Neslyšitelné] uvnitř funkce,
Měli bychom dát 3 v této funkci?
Nebo to můžeme používat venku?
DAVIN: Můžete ji použít mimo tuto funkci.
Takže on se ptá zdarma.
>> STUDENT: ztratit přehled kde [neslyšitelné].
>> ROB: Oh, volný není happen-- to je část kouzla malloc
je to, že nejste omezena na místní působnosti.
Máte plnou kontrolu nad jak dlouho proměnné žít.
Takže říkáme malloc tady, to by mohlo být zcela oddělené funkce.
To by mohlo být 10 hodin později že jsme se konečně volat zdarma.
>> DAVIN: Tak například, jako, pár týdnů od teď, když se konečně
dělat svou slovníku pravopisu psets, budete
mít nějakou funkci, která vytváří tun uzlů.
Takže mallocing tun uzlů v této funkci.
A později v samostatná funkce, ty jsi
bude chtít osvobodit všechny ty uzly.
Takže si můžete doslova předat uvolnit ukazatel, takže adresa paměti
na to, co malloced.
A to bude v pořádku.
Nemusíte se osvobodit, jako, ve stejné funkci.
Ano?
>> Žák: Takže malloc proměnná [neslyšitelné] venku?
Je to to, co říkáš?
DAVIN: Počkej, říkáš?
Promiňte.
>> STUDENT: Pokud malloc proměnná může být volný kdekoliv v kódu,
pak mohou být přístupné kdekoli v kódu?
Dokážete udržet je místní?
>> DAVIN: Oh, zeptala se: jako proměnná, like--
>> ROB: Takže je třeba ještě mít nějaký odkaz
na bloku malloc v paměti.
Tak tady, vracíme x.
STUDENT: Oh.
ROB: Pokud bychom se nevrátili x zde, a to bylo jen neplatné,
pak bychom nemají přístup k ukazatel, který byl malloced,
a to úniku paměti.
>> STUDENT: OK.
>> DAVIN: Tak jako, řekněme, že vám mají to, jako, tady.
ROB: Ne
DAVIN: V mé hlavní funkce, nemohu stačí zavolat tuto x a je, stejně jako, OK,
V této funkci jsem to udělal.
>> ROB: Správně.
>> DAVIN: Takže budu volat x v, jako, hlavní nebo něco takového.
Můžete to udělat.
Budeš něco vracet.
Ale to, co chceš vrátit?
Budeš vrátí adresu paměti.
A protože se vrátíte paměť adresy, které mohou být přístupné i jinde.
Nějaké další otázky?
Ano?
>> Student: Je funkce výše je šek na [neslyšitelné]?
>> DAVIN: Proč není třeba dělat, že?
STUDENT: [neslyšitelné].
DAVIN: Vzhledem k tomu, že jste ne mallocing nic.
Takže to ne-- jo, je to ne jako řetězec s.
Je to ukazatel někde.
To jsou jen hodnoty.
STUDENT: OK.
DAVIN: Jo.
Ještě něco?
ROB: Jo?
STUDENT: Ale když [neslyšitelné]?
>> ROB: Takže, aby se uvolnilo paměti, řekli bychom zde.
Takže x je náš ukazatel blok paměti.
Máme volné, že ukazatel.
A my bychom nutně učinit zde.
Můžeme to udělat kdekoliv.
Ale ty jsi jen volat zdarma na něco, co malloc vrátí.
Tak malloc, tady, se vrátil co se uloží do x.
Takže můžeme volat zdarma na x.
Nějaká poslední otázky?
>> DAVIN: Nějaká poslední otázky?
Jo?
>> STUDENT: Je nám líto, můžete znovu vysvětlit Proč byste osvobodit tam?
Proč [neslyšitelné]?
>> DAVIN: Pro tu?
>> STUDENT: Jo, jako hned po.
DAVIN: Pravděpodobně Nechceme zde zdarma.
ROB: Pravděpodobně ne.
DAVIN: Jo, to by to nic dělat.
To by se, stejně jako, vytvořit paměť, dělat věci na to,
a pak se okamžitě zapomenout na to, jo.
>> ROB: Ale my jsme mohli dělat, jako, z nějakého důvodu zde.
Mohli bychom říci, int hvězdu y se rovná zpáteční řadu.
Udělat nějaké věci s y, Možná vytisknout obsah.
A pak, konečně, jsme hotovi.
Můžeme osvobodit y.
STUDENT: [neslyšitelné].
DAVIN: Mám přejděte dolů?
Díky.
ROB: Nice.
>> DAVIN: OK, to je ono.
ROB: Dobře, dobře.
Hodně štěstí.
>> DAVIN: Máte-li dotazy, napište nám.
Hodně štěstí.