>> DAVID Malan: Dobrý den, a vítejte zpátky CS50.
Tak to je konec týdne čtyři.
Jen jeden oznámení jako první.
Takže tzv. páté pondělí přichází letos v pondělí.
To je příležitost pro změnu z SAT / UNSAT na dopis třídy, nebo
dopis grade SAT / UNSAT.
Vzteku, že tento proces vyžaduje podpis, protože je nutné vyplnit
z jednoho z těch růžových Přidat / pokles formy.
>> Vzhledem k tomu, technicky, SAT / UNSAT verze a dopis grade verze
mají odlišné katalogových čísel.
Ale žádný velký problém.
Pojď ke mně, nebo Rob nebo Lauren v každém bodě.
Nebo e-mailem nám, pokud nemáte druh papírování, co potřebujete dnes, a my
bude určitě pomůže vzít péče, že před pondělí.
>> Dobře, takže dnes -
Vlastně je tu trochu ozvěna.
Můžeme tón mě trochu dolů?
OK.
Takže dnes představíme téma známý jako ukazatele.
A musím přiznat, že je to jeden z složitější témata, která máme tendenci
zahrnuje v této třídě, nebo opravdu nějaký úvodní kurz, který používá C.
>> Ale věř mi to, a to zejména pokud vaše mysl se cítí trochu více se ohýbal
dnes av příštích týdnech.
Není to reprezentativní vám daří ještě horší, na to to prostě znamená, že
Je to obzvláště sofistikovaný téma že Slibuji, že za pár týdnů
proto se bude zdát až příliš nápadně jednoduché zpětně.
>> Stále si pamatuji dodnes.
Seděl jsem v jídelně Elliott, sedí vedle mého TF Nishat Mehta,
který byl rezidentem Elliott domu.
A z nějakého důvodu, to téma jen klikne.
Což znamená, že i já jsem se snažil s ní na nějakou dobu, ale já
bude v mých silách, aby nedocházelo každý takový Boj s tématem, které v konečném důsledku
je velmi silný.
>> Ve skutečnosti je jedním z témat, probereme V následujících týdnech je to, že
cenného papíru, a jak můžete skutečně využití stroje způsoby
, které nejsou určeny.
A ty vykořisťování jsou obvykle výsledkem chyb chyby, které se
lidé tím, že pochopení některých podkladového provádění
informace, které jsou prostřednictvím programů.
>> Teď aby to zdát více uživatelsky přátelský, jsem myslel, že hrát 10
Druhý náhled trochu claymation Obrázek s názvem Binky, který byl do
Život by náš přítel na Stanfordu, Profesor Nick Parlante.
Takže mi dovolte, abych vám dal tohle teaser na Binky zde.
>> [PŘEHRÁVÁNÍ]
>> -Hej, Binky.
Probuďte se.
Je čas na ukazatel zábavu.
>> -Co je to?
Informace o ukazateli?
Oh, cukrovinka.
>> [END PŘEHRÁVÁNÍ]
>> DAVID Malan: To je Stanford počítačová věda.
Takže více o tom přijít.
>> [APPLAUSE]
>> DAVID Malan: Je nám líto, Nicku.
>> Takže připomenout, že minule jsme skončili na je to opravdu vzrušující cliffhanger
přičemž tato funkce prostě nefungovalo.
Alespoň intuitivně, bylo to jako by to mělo fungovat.
Jednoduše prohození hodnot ze dvou celých čísel.
Ale vzpomínám, že když jsme si vytiskli původní hodnoty v hlavním jeden a
dva, oni byli ještě jednou a dva a ne dva a jeden.
>> Takže dovolte mi vlastně přepínat přes spotřebiče.
A napsal jsem se trochu kosterního kódu v předem tady, kde tvrdím, že x
bude 1, bude mít y 2.
Pak jsem vytisknout oba jejich hodnoty s potiskem f.
>> Pak jsem tady tvrdí, že budeme swap.
Nechal jsem prázdné místo tu pro nás vyplnit dnes za chvíli.
Pak budu tvrdit, že dvě proměnné byly zaměněny.
Pak jdu k tisku je ven.
A tak doufejme, že bych měl vidět 1, 2.
2, 1.
Je to super jednoduché Cílem právě teď.
>> Tak jak jsme se jít o výměně dvě proměnné?
No, pokud navrhuji zde, že tyto poháry může představovat v paměti počítače.
To je jen pár kousnutí, to Je ještě několik kousnutí.
Mohli bychom se dobrovolnické Pojď nahoru a mix nám něco k pití, když to povědomě?
Pojď nahoru.
Jak se jmenujete?
>> JESS: Jess.
>> DAVID Malan: Jess?
Pojď nahoru, Jess.
Pokud vám to nevadí, musíme dát Google Sklo na vás, takže můžeme
zvěčnit to.
OK, sklo.
Nahrávání videa.
A OK, jsou dobré jít s Jessem zde.
Dobrá.
Rád Vás vidím.
>> Takže to, co bych chtěl tady děláte - pokud byste mohl, poměrně rychle -
právě nalévá nám půl sklenice oranžové šťávy a půl sklenice mléka,
což účinně čísla 1 v jednom šálku a 2 v druhém šálku.
>> To bude dobré záběry.
>> JESS: Omlouvám se.
>> DAVID Malan: Ne, ne.
To je v pořádku.
Pěkný.
Dobře, takže máme čtyři byty stojí pomerančového džusu.
Budeme to nazval hodnotu 1.
Nyní další čtyři bajty v hodnotě mléka.
Bude říkat, že hodnota 2.
Takže x a y, resp.
>> Dobře, takže teď, pokud úkol po ruce - pro vás, Jess, před všemi
svých spolužáků -
je swap hodnoty x a y takové, že chceme pomerančové šťávy
další pohár a mléka v tomto poháru, jak Možná si - než je skutečně dělat
je - jít asi dělá?
>> OK, moudré rozhodnutí.
Takže budete potřebovat trochu více paměti.
Takže pojďme přidělit dočasný pohár, chcete-li.
A nyní přistoupit k výměně x a y.
>> Výborný.
Takže velmi dobře.
Děkuji moc, Jess.
Prosím.
Trochu suvenýr.
>> OK, tak samozřejmě, super jednoduchý nápad.
Zcela intuitivní, že potřebujeme trochu více úložného prostoru - v této podobě,
šálek - pokud se opravdu chcete výměna těchto dvou proměnných.
Takže pojďme dělat přesně to.
Až tady mezi tím, kde tvrdím, že jsem bude dělat nějaké vyměňovat, já
jděte do toho a prohlásit tepl.
A já nastavte ji rovno, řekněme, x.
>> Pak jdu změnit hodnotu x, stejně jako Jess jsem tady s
mléko a pomerančový džus být rovno y.
A já pro změnu y se rovná k ne x, protože teď budeme
uvízl v kruhu, ale spíše temp.
Tam, kde jsem dočasně - nebo tam, kde Jess dočasně dát pomerančový džus
před přepisování, že šálek s mlékem.
>> Tak mě nech jít dopředu a teď aby to.
Říká se noswap.c.
A teď mi dovolte běžet bez swapu.
A skutečně vidím, když jsem rozšířit Okno trochu, že
x je 1, y je 2..
A pak je x 2, y 1.
>> Ale připomínám, že v pondělí jsme udělali věci trochu jinak, kdy jsem
místo toho splnil pomocnou funkci, chcete-li, že byl vlastně neplatné.
Volal jsem ji vyměnit.
Dal jsem to dva parametry, a zavolal jsem jim a nazval jsem ho b.
>> Upřímně řečeno, bych mohl nazvat x a y.
Není nic zastavit mě v tom, že.
Ale já bych tvrdit, že je to pak trochu nejasné.
Vzhledem k tomu, připomínají na pondělí, že jsme uvedla, že tyto parametry byly
kopie hodnot prošel dovnitř
Tak to prostě zmatky s mysli, myslím, že pokud použijete
přesně stejné proměnné.
>> Tak jsem si místo toho jim říkat a b, jen pro přehlednost.
Ale mohli bychom jim říkat nejvíce něco chceme.
A já jdu zkopírovat a vložit účinně tento kód odtamtud
dolů do zde.
Protože jsem viděl, že to funguje.
Tak to je v dobrém stavu.
A já se změním x do x, mé na můj y b a můj y do bodu B.
>> Takže jinými slovy, přesně stejná logika.
Přesně to samé, že Jess udělal.
A pak jedna věc, kterou musíte udělat, až zde, samozřejmě, je nyní vyvolat toto
funkce nebo volání této funkce.
Tak jsem se volat tuto funkci se dvěma vstupy, x a y, a stiskněte Uložit.
>> Dobře, tak zásadně totéž.
Ve skutečnosti jsem asi udělal program zbytečně složité podle
psát nějakou funkci, která je jen zabírají asi šest řádků kódu zatímco já
předtím realizovány To jen tři.
>> Tak mě nech jít dopředu a hned předělat to, aby žádný swapu.
Dobře, já to zvoral zde.
To by mělo být chyba, kterou by mohly ve stále běžně jako vaše
Programy se složitější.
Ale je snadné opravit.
Dovolte mi, abych se posunout zpět sem.
>> A co je první chyba vidím?
Implicitní prohlášení.
Co to zpravidla označují?
Zapomněl jsem prototyp.
Zapomněl jsem učit kompilátoru, že výměna bude existovat, i když
neexistuje na samém počátku programu.
Tak jsem jen chtěl říct, void, swap, int, int b, středník.
>> Tak jsem se nebudu jej implementujeme.
Ale teď to odpovídá tomu, co tady dole.
A oznámení, absence středníkem zde, což není nutné, pokud
provádění.
>> Dovolte mi tedy předělat to, aby žádný swapu.
Mnohem lepší tvar.
Běh bez swapu.
A sakra.
Teď jsme tam, kde jsme byli v pondělí, kde to nebude zaměnit.
>> A co je intuitivní vysvětlení , proč je tomu tak?
Jo?
>> STUDENT: [neslyšitelné].
>> DAVID Malan: Přesně tak.
Tak a a b jsou kopie xa y.
A ve skutečnosti, pokaždé, když jsem byl volání funkce tak daleko, že se
prochází proměnných, jako je ints -
stejně jako odkládací čeká zde -
vy byly předáním kopií.
>> Teď to znamená, že to trvá trochu času, zlomek vteřiny, pro
počítače zkopírovat bitů z jednoho variabilní do bitů druhého.
Ale to není tak velký problém.
Ale oni přesto kopie.
>> A tak nyní, v souvislosti s swapu, Jsem ve skutečnosti úspěšně
měnící se a a b.
Ve skutečnosti, pojďme rychle zdravý rozum zkontrolovat.
Vytisknout f je% i, nový řádek.
A pojďme se zapojit.
Nyní se pojďme udělat to samé s b..
A pojďme udělat to samé tady.
>> A nyní mi dovolte, abych kopírovat ty stejné linky opět ve spodní části funkce
po mé tři řádky zajímavé mohl provádět, a
vytisknout a b ještě jednou.
Takže teď pojďme udělat to, aby žádný swapu.
Dovolte mi, abych okno terminálu trochu vyšší, takže můžeme vidět
víc najednou.
>> A spustit bez swapu.
x je 1, y je 2.. je 1, b je 2.
A pak, je 2, b je 1.
Tak to funguje, stejně jako Jess jsem tady uvnitř swapu.
Ale samozřejmě, že to nemá žádný vliv na proměnné v main.
>> Takže jsme viděli trik, kdy jsme mohl opravit, ne?
Když jste tváří v tvář této vymezení rozsahu problém, mohl by si vsadit a vydělat x
a y jaké proměnné místo?
>> Dalo by se, aby byly globální.
Dejte je na samém vrcholu tohoto souboru jako jsme to udělali, a to i ve hře 15.
Používáme globální proměnné.
Ale v rámci hry 15, to je rozumné mít globální
proměnná reprezentující desku, protože celistvost 15.c je vše
o provádění tohoto hru.
To je to, co existuje soubor dělat.
>> Ale v tomto případě tady, jsem volání funkce swapu.
Chci vyměnit dvě proměnné.
A to by se měl začít cítit nedbalý v případě, že řešení všech našich
problémy, když jsme se spustit do působnosti otázek je, aby to globální.
Protože se velmi rychle, je náš program stane docela zmatek.
A my jsme udělali jen velmi zřídka Výsledkem tohoto 15.c.
>> Ale ukazuje se, že je lepší způsob, jak úplně.
Dovolte mi, abych skutečně vrátit a odstranit vytisknout f je, jen proto, aby zjednodušení tohoto kódu.
A dovolte mi navrhnout, aby to je skutečně špatná.
Ale když jsem se namísto toho v některých hvězdičkami a hvězdy, mohu místo toho proměnit tuto
funkce do jednoho, který je skutečně funkční.
>> Tak nech mě jít zpátky a připustit, říká hvězdička je vždy obtížné,
tak řeknu hvězdy.
Budu Přiznáme do té jedné.
Dobrá.
A teď, co mám dělat místo toho?
>> Takže v první řadě, budu specifikovat že místo předávání int do
Swap funkce, jsem místo jít říct int hvězdu.
A teď, co se hvězda uvést?
Je to, že pojem ukazatel, který Binky, claymation postava, byl
s odkazem na chvíli zpátky.
>> Takže když říkáme pravý hvězdu, význam teď je to, že se nebude
prošel v její hodnotou.
To nebude kopírovat palců
Spíše adresa je bude předán palců
>> Takže připomenout, že uvnitř vašeho počítače je celá parta paměti, jinak
známý jako RAM.
A to je jen RAM celá parta bajtů.
Takže pokud váš Mac nebo PC má dva GB, budete mít 2
miliarda bajtů paměti.
>> Nyní jen předpokládat, že jen proto, aby udržet věci pěkné a uspořádaně jsme
přiřazení adresy -
číslo -
je ke každému byte paměti RAM v počítači.
Úplně první byte z těchto 2 miliard je o číslo nula.
Další je bajt číslo jedna, číslo dva, celou cestu nahoru, dot dot
tečka, na zhruba 2 miliardy.
>> Takže můžete počet bajtů paměti v počítači.
Takže předpokládejme, že to je to, co máme na mysli adresu.
Takže když vidím pravý hvězdu, co se děje které mají být předány do swapu je nyní
adresa.
Ne jeho hodnota, ale bez ohledu na jeho poštovní adresa, abych tak řekl -
jeho umístění v paměti RAM.
>> A podobně pro B, jdu říci totéž.
Int, hvězdu, b.
Jako stranou, technicky hvězdy mohl jít i na jiných místech.
Ale budeme standardizovat hvězdy bytí hned vedle datového typu.
>> Takže vyměnit podpis nyní znamená, dej mi adresa int a volání
že adresa.
A dej mi ještě jednu adresu int a volat, že Adresa B.
>> Ale teď můj kód zde se musí změnit.
Protože pokud Prohlašuji, int temp -
, který je stále ještě typu int -
ale uložit v něm, jaké hodnoty?
Aby bylo jasno, já jsem uvedení se kód, který je napsán právě teď?
>> Dávám umístění v.
Ale já se nestarám o místo, ne?
Temp existuje jen Jess třetí šálek existovala, za jakým účelem?
Pro uložení hodnoty.
Mléko nebo pomerančový džus.
Není skutečně uložit adresu jeden z těch věcí, které se cítí
trochu nesmyslné v tomto reálném světový kontext, tak jako tak.
>> Takže opravdu to, co chci, aby v temp není adresa, ale
obsah.
Takže, pokud je číslo jako 123, to je 123. byte paměti, že právě
stane se okupační, že hodnota v se stane být zabírá.
>> Pokud chci jít na tuto adresu, Musím říci, hvězdu.
Stejně tak, pokud bych měl změnit to, co je na adresu, změním
to spustit.
Pokud chci uložit v tom, co je na místo s tím, co je v místě,
na b, b hvězda hvězda.
>> Takže ve zkratce, i když to není zcela potopení dosud - a já bych nečekal
že by to tak rychle -
Uvědomujeme si, že všechno, co dělám je prefixu tyto hvězdy na mé proměnných,
rčení nechcete chytit hodnoty.
Neměňte hodnoty.
Ale spíše, přejděte na tyto adresy a získat hodnotu.
Přejděte na tuto adresu a změny hodnota tam.
>> Takže teď mi dovolte se posunout zpět na vrchol, jen opravit tento řádek zde,
změnit tak, aby odpovídal prototyp.
Ale já teď musíte udělat jednu věc.
Intuitivně, jestli jsem změnil typy argumentů, že prohodí očekává,
co ještě musím změna v mém kódu?
>> Když říkám swapu.
Protože právě teď, co jsem I kolem vyměnit ještě?
Hodnota x a hodnota y, nebo mléko a pomerančový džus.
Ale já nechci dělat.
Já místo toho chcete předat, co?
Umístění X a umístění y.
Jaké jsou jejich poštovní adresy, abych tak řekl.
>> Takže dělat, že tam je ampersand.
Ampersand trochu zní jako adresu.
tak n, ampersand, adresa z x a y adresu.
Takže je to úmyslné, které používáme ampersandy při volání funkce,
a hvězdy při ohlášení a kdy provádění funkce.
>> A jen si ampersand jako adresa provozovatele, a hvězdy jako
tam operátor -
, nebo, přesněji, dereference operátor.
Tak to je celá řada slov, jen aby říci, že nyní, doufejme, že výměna se děje
správné.
>> Nech mě jít dál a dělat -
pojďme vlastně soubor přejmenovat, jinak tento program i nadále dosažitelní žádný swap.
Tvrdím, že budeme říkat swap.c teď.
Takže si, swap.
Dot, lomítko, swap.
>> A nyní skutečně, x je 1, y je 2..
A pak, je x 2, y je jedna.
No uvidíme, jestli můžeme to udělat trochu jinak, pokud jde o to, co je
tady děje.
Nejprve mi dovolte přiblížit na našich kreslení obrazovku zde.
A dovolte mi navrhnout na chvíli - a když jsem kreslit zde se odrazí
tam nyní - dovolte mi navrhnout, aby tady je celá parta paměti nebo
RAM, uvnitř mého počítače.
>> A to bude sousto číslo, řekněme, 1.
To bude mít číslo 2 bajty.
A já budu dělat spoustu více, a pak banda dot dot tečky na
naznačují, že tam je 2 miliardy z těchto věcí.
4, 5, a tak dále.
>> Takže tam jsou prvními pěti bajtů mé paměti počítače.
V pořádku?
Velmi málo z 2 mld. Kč.
Ale teď jdu navrhnout následující.
Budu navrhovat, že x bude uložit číslo 1 a y se děje
uložit číslo 2.
A nech mě jít napřed a představuje nyní tyto hodnoty takto.
>> Pojďme na to takto.
Dej mi jednu sekundu.
Jedna sekunda.
OK.
Chci, aby to trochu -
jdeme na to znovu.
Jinak jdu a používání stejná čísla, neúmyslně,
vícekrát.
>> Takže jen tak máme různá čísla mluvit, nazvěme tento bajt
číslo 123, 124, 125, 126, a dot dot dot.
A dovolte mi tvrdí, že teď budu dát hodnotu 1 tady, a hodnotu 2
zde, jinak známý jako x a y.
Tak to jen tak se stane, že to je x, to je y.
>> A jen nějakou náhodou, počítače, operační systém,
stalo, aby X na místě číslo 123.
A y skončil na místě 124 -
sakra.
Měl jsem opravil toto.
Člověče, mám opravdu chcete udělat?
Ano, chci to napravit a b správné o tom dnes.
Omlouváme se, ale na této nové.
>> 127, 131, a nechtěl jsem, aby se to složité, ale proč jsem se změnil
Čísla tam?
Protože chci, aby se ints ve skutečnosti čtyři bajty.
Takže pojďme být super anal o tom.
Tak, že pokud se stane, 1 je třeba se zabývat 123, 2 bude na adrese
127, protože je to jen 4 byes pryč.
To je vše.
A budeme zapomenout na všechny Ostatní adresy na světě.
>> Takže x je v místě 123, y je v místě 127.
A teď, co mám vlastně chcete dělat?
Když říkám odkládací teď, co je vlastně děje?
No, když říkám swapu jsem předáním adresa x a y na adresu.
Tak například, pokud se tyto dva kusy z papíru nyní představují dvě
argumenty a a b vyměnit, co jsem já budu psát o první z nich,
který budu volat označují jako?
>> Přesně tak, 123.
Tak tohle tvrdím je.
Jedná se o parametr.
Dávám adresu x tam.
>> Co je to?
>> Ne, ne.
To je v pořádku.
Ještě dobře, stále dobrá.
Tak to je.
A teď na druhý kus papíru, to bude b, a to, co jsem
bude psát na tento kus papíru?
127.
>> Takže jediná věc, která se změnila od té doby naše předchozí vyprávění tohoto příběhu je,
spíše než doslovně 1 a 2, jsem projet na 123 a 127.
A já jsem teď dám těchto dovnitř této kolonky, v pořádku?
Tak, že černá skříňka se představuje swap funkce.
>> Mezitím, pojďme se teď někdo implementovat odkládací funkci.
Někdo by tady jako dobrovolník?
Pojď nahoru.
Jak se jmenujete?
Charlie.
Dobře, Charlie.
Pojď nahoru.
>> Takže Charlie bude hrát role naší černé skříňky.
A Charlie, co bych chtěl, abys Nyní je realizována swapu takovým způsobem,
že vzhledem k tomu, tyto dvě adresy, jste se vlastně děje
ke změně hodnot.
A já budu šeptat do ucha jak spustit TV zde.
>> Takže jděte do toho, a ty jsi černé skříňky.
Oslovte tam.
Jaké hodnoty vidíte na a jaké hodnoty vidíte na b?
>> CHARLIE: je 123 a b je 127.
>> DAVID Malan: OK, přesně tak.
Nyní pozastavit tam jen na chvíli.
První věc, kterou budete dělat teď, podle kódu - což
Budu se vytáhnout na obrazovce -
bude přidělit trochu bit paměti s názvem temp.
Takže budu pokračovat a vám, že paměť.
>> Takže to bude třetí proměnné že máte přístup k
voláš tepl.
A co budete psát na temp kus papíru?
>> CHARLIE: Ukazatele, že jo?
>> DAVID Malan: OK, dobře není nutně ukazatele.
Takže řádek kódu, který jsem zvýrazněna na pravé straně,
začněme tam.
To říká hvězda.
Takže se v současné době skladování číslo 123.
A jen intuitivně, co se hvězda 123 znamená?
>> Ale zejména, je-li je 123, hvězda znamená co?
Hodnota.
Nebo neformálně, jděte tam.
Takže mi dovolte navrhnout, že drží v tvá ruka, jděte do toho a léčbě, které
jako když je to mapa.
A chodit sami se k počítači je paměť, a najít to, co je nám
na místě 123.
Přesně tak.
>> Vidíme tedy, na místě 123 je to, samozřejmě?
OK, takže to, co hodnota teď jste dám do temp?
Přesně tak.
Takže jděte do toho a dělat, že.
A napište číslo 1 na kus papír, který je v současné době s názvem temp.
>> A nyní další krok, který budete realizovat
bude to.
No, na pravé straně Následující řádek kódu je hvězda b. b, o
Samozřejmě, ukládá adresu.
To se týká 127.
Hvězda b znamená to, mimochodem řečeno?
>> Přejít na tomto místě.
Takže jděte do toho a najít to, co je nám na místě 127.
OK.
Samozřejmě, že na místě 127, je stále hodnota 2.
Tak co jdeš skladujte při bez ohledu na to na místě v?
Takže hvězdy prostředkem přejděte do umístění na.
Co je umístění?
>> Přesně tak.
Takže teď, pokud chcete změnit co je na tomto místě -
Půjdu napřed a spusťte guma zde.
A teď ji zpět na štětec.
Jaké číslo se chystáte psát V tomto boxu prázdné teď?
>> Přesně tak.
Takže tento řádek kódu, aby bylo jasno - ať mi pauza, co dělá, a Charlieho
upozornit na to, co právě udělal, je psát do tohoto pole v místě 123
hodnota, která byla dříve v b..
A tak jsme nyní provádí opravdu Tento druhý řádek kódu.
>> Teď bohužel, je to ještě jeden řádek zbývající.
Teď, co je v teplotě, a to doslova?
Je to zřejmě číslo jedna.
To není adresa.
Je to jen číslo, druh proměnné z jednoho týdne.
>> A teď, když říkáte, hvězdičkový B, to znamená, že přejít na adresu B, který je na
kurz zde.
Takže jakmile se tam dostanete -
Půjdu napřed a vymazat to, co je ve skutečnosti tam - a to, co jste
budu psát nyní v poloze 127?
>> CHARLIE: Temp, který je jeden.
>> DAVID Malan: Temp, který je jeden.
A co se stane, aby teplota na konci?
No, opravdu nevím.
Nemáme opravdu záleží.
Kdykoliv jsme implementovali funkci tak daleko, nějaké lokální proměnné máte
jsou skutečně místní.
A jen tak zmizet.
Jsou převzaty z provozu systém se.
>> Tak, že teplota stále Hodnota 1 je jakýmsi zásadním způsobem
nezajímá nás.
Dobře, takže potlesk kdybychom mohli pro Charlieho.
Velmi dobře.
>> Dobře, takže co víc dělá to znamená, co můžeme udělat?
Takže se ukazuje, že jsme byli říká několik White Lies
pro docela nějaký čas.
Ve skutečnosti se ukazuje, že řetězec, všechny tohoto času, není opravdu
posloupnost znaků na sobě.
Je to druh, který je intuitivně.
>> Ale technicky vzato, je řetězec datový typ, který jsme deklarovali uvnitř
CS50 knihovna zjednodušit svět po dobu prvních několika týdnů třídy.
Co řetězec opravdu je adresa znaku někde v paměti RAM.
Řetězec je opravdu celá řada, stejně jako 123 nebo 127, který se stane vymezit
kde řetězec začíná v paměti počítače.
>> Ale to nepředstavuje řetězec, samo o sobě, sama o sobě.
A vidíme to takto.
Nech mě jít dopředu a otevřít nějaký kód, který je mezi
dnešní příklady zdrojového kódu.
A já jdu dopředu a otevřít do, řekněme, porovnejte-0.c.
Jedná se o kočárek program, který bude která mají být provedena následujícím způsobem.
>> První.
Chystám se něco říct.
Pak budu pokračovat a získat řetězec od uživatele
V tomto dalším řádku.
Pak budu to říkat znovu.
Pak budu mít další řetězec od uživatele.
>> A oznámení, ukážu jeden z řetězce v proměnné s názvem S a
další z těchto řetězců v proměnné s názvem t.
A teď budu tvrdit, velmi rozumně, že pokud je rovná rovná t,
řetězce jsou stejné.
Zde zadejte totéž.
Jinak jsou řetězce není totéž.
>> Koneckonců, pokud bychom vstup dva ints, dvě znaky, dva plováky, dva dvoulůžkové, některý z
datové typy jsme mluvili o tak daleko porovnat je -
Vzpomínám si, že jsme velmi jasně před chvílí že nebudete dělat to, protože
jedno znaménko rovná se je samozřejmě operátor přiřazení.
Tak to by bylo chybou.
>> Používáme stejné rovnítko, který opravdu porovnává
věci pro skutečné rovnosti.
Ale já prohlašují, že toto je chybné.
Když jdu do toho a dělat porovnat nulu, a pak se tečka lomítko porovnat nulu.
A já jsem psát v, řekněme, ahoj.
A pak řekněme, že ahoj znovu.
Doslova totéž, počítač tvrzení jsem napsal různé věci.
>> Teď možná jsem jen něco překlepu.
Budu psát moje jméno tentokrát.
Myslím, ahoj.
Dobrý den.
Je to jiné, každý čas.
>> No, proč to je?
Co se opravdu děje pod kapotou?
No, co se opravdu děje pod kapuce je řetězec, pak
Jsem napsal v tom prvním například je slovo ahoj, samozřejmě.
Ale pokud budeme představovat to pod kapuce, připomenout, že
Řetězec je v poli.
A my jsme řekl, jak v minulosti.
>> Takže pokud čerpám, že pole, jako to, že jsem bude reprezentovat něco zcela
podobné tomu, co jsme dělali před chvílí.
A je to vlastně něco, speciální tady taky.
Co jsme se zjistit, na Na konci každého řetězce?
Jo, to lomítko nula, což je jen způsob, jak reprezentovat,
doslovně, 00000000.
Osm bitů 0 v řadě.
>> Já nevím, upřímně řečeno, co je po tomto.
Je to jen banda více paměti RAM uvnitř mého počítače.
Ale to je pole.
Mluvili jsme o polích předtím.
A my typicky mluvit o pole jako místo nula,
pak jeden, pak dva.
Ale to je jen pro pohodlí.
A to je naprosto relativní.
>> Pokud jste skutečně dostat z paměti počítač, je to samozřejmě jakékoliv
2000000000 některé liché bajtů, potenciálně.
Takže opravdu pod kapotou Celou tu dobu, že ano.
To by mohlo velmi dobře být držák nula.
Ale pokud budete kopat ještě hlouběji pod kapuce, to je opravdu
zabývat číslo 123.
Toto je adresa 124.
Toto je adresa 125.
>> A já jsem nepodělal tentokrát.
Ty jsou nyní jeden bajtů rozdíl z jakého důvodu?
Jak velká je char?
Char je jen jeden bajt.
Int je obvykle čtyři bajty.
Takže to je důvod, proč jsem to 123, 127, 131 a tak dále.
Teď můžu mít matematický jednodušší a prostě plus 1.
A to je teď to, co se skutečně děje na pod pokličku.
>> Takže, když prohlásil něco takového, řetězec s, to je ve skutečnosti -
to dopadá -
char hvězda.
Hvězda, samozřejmě, znamená, že adresa, aka ukazatel.
Takže je to něco adresa.
Co je to adresa?
>> No -
Jsem jediný, kdo může vidět velmi Důležitým bodem dělám, nebo si myslíte,
Dělám.
Tak string -
Smutné je, že máte monitor právě tam, kde jsem
mohl vidět, že.
>> Dobře, takže to je to, co řetězec Jsem prohlásil dříve.
Ukazuje se však, díky malé kouzlo ve CS50 knihovny, to vše
Doba řetězec má doslova Byl char hvězda.
Hvězda opět znamená ukazatel nebo adresu.
Skutečnost, že je to doprovodné slovo znak znamená, že je
adresa charakteru.
>> Takže pokud se řetězec se nazývá, a píšu v H-E-L-L-O, navrhne teď, co se
string doslova vrácení všech tentokrát, i když máme dost
zjednodušený svět?
Co se vlastně řetězec vrátí jako svou návratovou hodnotu?
>> 123 V tomto případě, například.
Jsme již dříve řekl, že se řetězec jednoduše vrátí řetězec, posloupnost
znaků.
Ale to je trochu bílé lži.
Způsob, jakým se string opravdu funguje Pod kapotou je dostane
řetězec od uživatele.
To plops znaky, které on nebo ona typů v paměti.
Klade zpětné lomítko nula na konci z těch posloupnost znaků.
>> Ale co se řetězec doslova vrátit?
Je to doslova vrátí adresu Úplně první bajty RAM
používá se pro tu sílu.
A ukázalo se, že právě tím, že vrátí jediná adresa
První znak v řetězci, který je dostačující pro zjištění celistvost
řetězec.
>> Jinými slovy, dostanete řetězec nemá vrátit 123 a 124 a 125.
Nemusí se mi dlouho Seznam všech bytů, které
můj řetězec používá.
Vzhledem k tomu, jeden, všichni zády k sobě.
A za druhé na základě první adresu, jsem mohou zjistit, kde řetězec končí.
Jak na to?
>> Zvláštní znak null, zpětné lomítko nulu na konci.
Takže jinými slovy, je-li projít kolem -
v proměnných -
adresa char, a předpokládat, , že na konci každého řetězce, každý
posloupnost znaků jako my lidé si řetězců, pokud předpokládáme, že
Na konci takového řetězce je tu nulové zpětné lomítko, jsi zlatá.
Vzhledem k tomu, můžete vždy najít konec řetězce.
>> Teď, co se skutečně děje a pak na v tomto programu?
Proč je tento program, Porovnání 0.c, kočárek?
Co je skutečně v porovnání?
Jo?
>> STUDENT: [neslyšitelné].
>> DAVID Malan: Přesně tak.
Je to porovnání umístění z řetězců.
Takže pokud uživatel zadal v ahoj jednou, jako já, může paměť skončit
, vypadá takhle.
Pokud pak uživatel druhy uvedené v Ahoj, ale tím, že volá dostat řetězec znovu, c je
nijak zvlášť chytrý, pokud učíte že je chytrý psaní kódu.
>> C -
a počítače obecněji -
Zadáte-li ve slově ahoj znovu, víte, co budete mít.
Ty jen tak dostat druhou řadu paměti, že ano, stane se
skladování H-E-L-L-O, a tak dále.
>> Bude to vypadat stejně na nás, lidi, ale tato adresa
nemusí být 123.
Mohlo by to jen tak stát, že operační systém má některé dispozici
prostor například v místě -
řekněme něco libovolný, jako je to místo 200.
A to je místo 201.
A to je místo 202.
Nemáme ponětí, kde to je bude v paměti.
>> Ale co to znamená, že to, co je bude uložen v konečném důsledku s?
Číslo 123.
Co bude uložen v t, V tomto příkladu libovolné?
Číslo 200.
A to vše znamená, že je pak zřejmé, 123 se nerovná 200.
A tak to, pokud podmínka nikdy vyhodnocen jako true.
Vzhledem k tomu, get string používá jiný kusy paměti pokaždé.
>> Nyní můžeme vidět znovu v dalším příkladu.
Nech mě jít dopředu a otevřít copy-0.c.
Tvrdím, že tento příklad bude vyzkoušet - ale nedaří - kopírovat dva řetězce
následovně.
>> Chystám se něco říct pro uživatele.
Já pak dostanu řetězec a nazývat to je.
A teď, dělám tuto kontrolu zde.
Zmínili jsme se o to chvíli zpět.
Ale když mohl dostat řetězec vrátit hodnotu NULL, jiný speciální znak nebo zvláštní
symbol řekněme.
Pokud je nedostatek paměti.
>> Například, v případě, že uživatel je skutečně je obtížné a typy otřesné
počet znaků na klávesnice a hity Enter.
Pokud to počet znaků prostě nemůžu vejde do paměti RAM, co blázen
Důvodem, dobře se řetězec by mohl velmi dobře vrátit hodnotu null.
>> Nebo pokud váš program sám o sobě dělá hodně dalších věcí, a tam je jen
není dostatek paměti pro get string na úspěch, mohlo by to skončit
se vrací null.
Ale buďme přesnější pokud jde o to, co je to.
Co je S typ dat opravdu?
Char hvězda.
>> Tak to dopadá nyní můžeme oloupat zpět vrstvu null.
Ukázalo se, že je null - ano, samozřejmě speciální symbol.
Ale co je to doopravdy?
Opravdu, null je jen symbol, který jsme lidé používají k reprezentaci na nulové úrovni.
>> Takže autorů C a počítačů obecněji, rozhodl lety
to, že víte, co.
Proč bychom zajistit, aby žádný uživatel údaje nikdy, nikdy, nikdy
uložené na bye nula?
Ve skutečnosti, dokonce i ve svém libovolném příkladu předtím jsem nezačal číslování
byty na nulu.
Začal jsem v jednom.
Protože jsem věděl, že lidé ve světě se rozhodli vyhradit nula
byte v něčí paměti jako něco zvláštního.
>> Důvodem je, kdykoliv chcete signál, že není něco v pořádku
s ohledem na adresy, je vrácena null - jinak známý jako nula -
a protože víte, že není důvěryhodně dat na adrese nula, jasně
Znamená to, že došlo k chybě.
A to je důvod, proč jsme se podle konvence, zkontrolujte, zda pro nulové a zpětné něco
jako jeden v těchto případech.
>> Takže když přejděte dolů teď, je to jen pak některé kontrola chyb, jen v případě,
něco, co se stalo s [? kauci?]
dohromady a ukončit program o předčasném návratu.
Tato řada nyní může být přepsána , protože to, což znamená, že to, co?
Na levé straně, dej mi další ukazatel na znak, a nazývat to t.
Co mám skladování uvnitř t, na základě na tomto jednom řádku kódu?
>> Jsem uložení umístění.
Konkrétně umístění která byla v sekundách.
Takže pokud uživatel zadal v ahoj a že první ahoj stane, že skončí
zde, pak číslo 123 je že se vrátí z dostat
řetězce a uložit -
Jak jsme již řekli dříve -
v sekundách.
>> Když jsem teď prohlásit další ukazatele char a nazývat to t, což je číslo
doslova skončí v t podle příběhu?
Tak 123.
>> Takže technicky nyní i s a t ukazují na přesný
Stejné kousky paměti.
Tak zjistíte, co budu dělat teď, aby dokazují, že tento program je chybné.
>> Nejprve budu tvrdit, s print f, vydělávat
kopii řetězce.
Pak budu dělat něco Kontrola chyb.
Jdu se ujistit.
Pojďme se ujistěte, že řetězec je t alespoň větší než nula na délku,
takže tam je nějaký znak, že skutečně využít.
>> A pak si možná pamatujete tento z předchozích příkladů.
2 horní -, který je v ctype.h soubor.
T držák nula mi dává nulu znak řetězce t.
A 2 horní téže hodnoty, o Samozřejmě, převádí je na velká písmena.
>> Takže intuitivně, to zvýrazněnou linií kódu je vydělávat první
dopis vt.
Ale to není vydělávat, intuitivně, první písmeno v sekundách.
Ale pokud přemýšlíte nad tím, co jsem asi vidět, když jsem spustit tento program
a vytisknout jak původní, s, a tzv. copy, t?
>> Jsou to vlastně bude stejný.
A proč se to bude stejné?
Oba jsou poukazem na přesně totéž.
Tak pojďme na to.
>> Proveďte kopírování nulu.
Shrnuje OK.
Dovolte mi spustit kopírování nulu.
Nech mě psát něco jako ahoj v vše malými písmeny a stiskněte Enter.
A tvrdí, že jak původní s a kopie jsou opravdu totožné.
>> Takže to, co se opravdu stalo tady?
Dovolte mi, abych tento obrázek překreslit jen vyprávět příběh
mírně odlišným způsobem.
Co se opravdu děje pod kapuce, když jsem prohlásil něco jako
char začátek s, nebo řetězec s, Jsem stále ukazatel -
který se stane, že je čtyři byty v CS50 spotřebiče
av mnoha počítačů.
A budu volat toto s..
A to má v současné době nějaká neznámá hodnota.
>> Když deklarujete proměnnou, pokud sami vložit hodnotu tam, kdo
ví, co tam je.
Mohlo by to být nějaký náhodný sled bitů z předchozího provedení.
Takže když jsem v mém kódu do dostat řetězec, a pak uložit návrat
hodnota v sekundách se řetězec nějak -
A budeme nakonec oloupejte, jak dostat string práce, nějak přiděluje
Pole, které pravděpodobně vypadá něco jako tohle.
H-E-L-L-O, zpětné lomítko nula.
>> Dejme tomu, že to je adresa 123 jen první konzistence.
Tak se vrátí řetězec, v zvýrazněná linka tam, vrátí
číslo jsme si řekli, 123.
Takže to, co se opravdu děje uvnitř je tady?
>> No, co se opravdu děje uvnitř s 123..
Ale upřímně řečeno, já jsem už trochu zmateni z těchto adres,
všechny tyto libovolných čísel.
123, 124, 127.
Takže pojďme se vlastně zjednodušení svět trochu.
>> Když mluvíme o ukazatele, upřímně řečeno, na nás, lidi, kteří se sakra zajímá, kde
věci jsou v paměti?
To je zcela libovolné.
Bude to záviset na tom, paměti RAM má uživatel.
To bude záviset na tom, kdy v průběhu dne spuštění programu, snad, a
co vstup uživatel vám dává.
Jsme obydlí na nedůležitých detailů.
>> Takže pojďme abstraktní pryč a říkají, že, Při spuštění řádek kódu takhle,
char hvězda je dostane návrat hodnota get řetězce.
Proč se místo toho jen kreslit to, co jsme držet volat ukazatel, jako by to
ukazuje na něco?
Tak jsem teď tvrdí, že je až je ukazatel -
pod kapotou je to adresa.
Ale je to jen ukazuje na první bajt
Řetězec, který byl vrácen.
>> Pokud bych se vrátit do kódu zde co se děje na této lince?
No, v tomto zvýrazněnou linií teď, Já jsem prohlásil prý další
proměnná s názvem t.
Ale je to také ukazatel, takže budu k tomu, jak to, teoreticky, přesné
stejné velikosti krabice.
A budu to nazývat t.
>> A teď, pokud se vrátíme do kódu znovu, když uložím je uvnitř t,
co jsem technicky uvedení uvnitř t?
No technicky, to bylo číslo 123.
Takže opravdu bych měla psát číslo 123 tam.
Ale pojďme to vyšší úroveň.
t, pokud je to jen ukazatel, intuitivně, je právě to.
To je vše, co je jsou v nich uloženy.
>> Takže teď v posledních zajímavé linky kódu, když jsem vlastně jít o
vydělávání nulový znak v tunách, co se děje?
No, t držák nula je nyní ukazuje s tím, co postava, pravděpodobně?
>> Je to ukázal na hodiny.
Vzhledem k tomu, t držák nula -
vzpomínám, je to stará syntaxe. t držák nula prostě znamená, že pokud t je řetězec, t
Držák nula znamená dostat nulu Znak v této síle.
Takže, co to ve skutečnosti znamená je jít do tohoto pole -
a ano, může to být 123, to může být 124.
Ale je to všechno relativní, pamatovat.
Kdykoli mluvíme o matici, máme tu výhodu, že mluví o
relativní indexy.
>> A tak se nyní můžeme jen předpokládat, že t držák h je nula.
Takže když zavolám 2 horní na to, co to je opravdu dělá, je vydělávat
malá h na velká písmena H. Ale samozřejmě, co je to?
Je to ukazuje na stejný zatracený řetězce.
>> Tak to je vše, co se děje v tomto kódu tak daleko.
Takže to, co je, pak implikace?
Jak opravit tyto dva problémy?
Jak můžeme porovnat se skutečnými řetězce?
>> No intuitivně, jak by jdete o porovnávání dvou
struny pro skutečné rovnosti?
>> Co to znamená, když dva řetězce jsou stejné?
Samozřejmě, že ne, že jejich adresy rovnat v paměti, protože to je nízká
úrovni implementační detail.
Všechny znaky jsou stejné.
Takže mi dovolte navrhnout, a dovolte mi představit ve verzi jednoho z compare.c
tady, tak porovnat, 1.c.
>> Dovolte mi navrhnout, že jsme ještě dostat ukazatel nazvaný s, a uložit v něm
vrátí hodnotu get řetězce.
Pojďme udělat to samé s t..
Žádná z kódu se liší.
Chystám se přidat trochu více kontrolu chyb teď.
Takže teď, že jsme něco peeling zpět této vrstvy v CS50, co řetězec
vlastně je, musíme být anální o tom, zda se nezneužívají
neplatné hodnoty, jako je null.
>> Tak jsem jen tak pro kontrolu.
Pokud to není stejné nulu a t není rovna null, to znamená, že jsi v pořádku.
Získejte řetězec neměl zkazit dostat jeden z těchto řetězců.
A můžete si snad, že teď, co nemá STR CMP pravděpodobně dělat?
String porovnání.
>> Takže pokud jste program v Javě dříve, Je to jako rovná metodě
Třída String.
Ale pro ty z vás, kteří nemají naprogramováno,
je to jen funkce c.
Stává se to přijít soubor s názvem string.h.
To je místo, kde je deklarována.
>> A řetězec porovnat -
Vlastně jsem zapomněl jeho použití, ale to nevadí.
Připomeňme si, že můžeme udělat muž, zamíchat porovnání.
A to se děje, aby se Linux programátoři manuální.
A to je, upřímně řečeno, trochu záhadný.
Ale vidím tady, že jo.
Musím zahrnout string.h.
>> A tady se píše v popisu " string Funkce compare porovná
dva řetězce S1 a S2. "a S1 a S2 jsou zřejmě dva
argumenty předávány palců
Nemám opravdu vzpomenout, co const je, ale teď všimnout -
a jste mohli vidět to již při jste používat manuálové stránky, pokud se
to všechno -
že znak hvězda je jen synonymem provázkem.
>> Tak to porovnává dva řetězce S1 a S2, a vrátí celé číslo menší
než nebo rovnající se nebo větší než nula pokud S1 se nachází, respektive, aby se
menší než, nebo odpovídají, nebo být větší než S2.
To je jen velmi komplexní způsob, jak říkat tento řetězec porovnat výnosy
nula, pokud jsou dva řetězce intuitivně identické znak pro
znak pro znak.
>> Vrací záporné číslo, pokud s, abecedně, má
přijít před t..
Nebo vrací kladné číslo, pokud s má přijít po t
abecedně.
Takže s tímto jednoduchým funkci, může dojít můžete například seřadit
celá parta slova?
>> Takže v této nové verzi, budu jít dál a dělat compare1.
Dot lomítko porovnat jeden.
Budu psát v ahoj ve všech malými písmeny.
Budu psát v ahoj ve všech malými písmeny znovu.
A naštěstí teď si uvědomuje, Napsal jsem to samé.
>> Mezitím, když jsem zadat ahoj v nižší HELLO případ a velkými písmeny a
porovnat je, jsem napsal různé věci.
Vzhledem k tomu, jsou nejen adresy odlišné, ale my jsme porovnání
odlišné charaktery znovu a znovu.
>> Tak pojďme na to a opravit jednu jiný problém teď.
Dovolte mi otevřít verzi jeden z kopírování, které nyní řeší
tento problém takto.
A tohle bude vypadat trochu složitější.
Ale pokud si myslíte, že o tom, co problém, který jsme Potřebujete vyřešit, doufejme, že to bude
jasné, za chvíli teď.
>> Tak to první řádek, char začátek t, v roce Laicky řečeno někdo mohl navrhnout
Co tato linka zde znamená?
Char hvězda t, co to dělá?
>> Dobře.
Vytvořte ukazatel na některé místo v paměti.
A dovolte mi upřesnit to trochu.
Deklarujete proměnnou, která bude ukládat Adresa některých char v paměti, stejně
být trochu vhodnější.
>> OK, takže teď na pravé straně, jsem nikdy neviděl jednu z těchto funkcí
před, malloc.
Ale co by to mohlo znamenat?
Přidělení paměti.
>> Tak to dopadá, až do teď, máme se opravdu měli účinný způsob, jak
žádá operační systém, dej mi nějaké paměti.
Spíše máme nyní nazývá funkce malloc, že ​​dělá přesně to.
I když je to trochu rozptýlení teď, všimněte si, že v
mezi těmito dvěma závorkách jen bude číslo.
Kde jsem napsal v otázce značky mohou být číslo.
>> A toto číslo znamená, Dej mi 10 bajtů.
Dejte mi 20 bajtů.
Dejte mi 100 bajtů.
A malloc udělá vše pro to, aby požádat operační systém -
Linux, v tomto případě -
hej, jsou jejich 100 bajtů na dostupné paměti RAM?
Pokud ano, vrátit tyto bajty mi vrácení adresu, která z
ty bajtů, možná?
Úplně první.
>> Takže i zde - a to je převládající v C, kdykoliv budete
jednání s adresami?
Ty téměř vždy řešení První taková adresa, bez ohledu na to, jak velký
kus paměti, kterou je předán zpět, abych tak řekl.
>> Takže pojďme se ponořit zde.
Snažím se přidělit jak mnoho bajtů, přesně?
No.
Délka řetězce s - pojďme to konkrétní příklad.
Pokud je s ahoj, H-E-L-L-O, co je délka řetězce s, samozřejmě?
Takže je to pět.
Ale dělám plus 1 na to, proč?
Proč chci šest bajtů místo pěti?
Znak null.
>> Nechci odejít z tohodle speciální znak null.
Protože když udělám kopii Dobrý večer a jen to H-E-L-L-O, ale nemyslím si, dát
že zvláštní charakter, počítač nemusí mít, náhodou, zpětné lomítko
nulu tam na mě.
A tak když se snažím přijít na to, Délka kopie, může si myslím, že
je to 20 znaků, nebo milion znaků kdybych se nikdy nestane
zasáhnout zpětné lomítko nula.
>> Takže musíme šest bajtů pro uložení H-E-L-L-O, zpětné lomítko nula.
A pak je to jen být super anální.
Dejme tomu, že jsem zapomněl, co velikost char je.
Jsme pořád říkáš, že je to jeden bajt.
A to obvykle je.
Teoreticky by to mohlo být něco jinak, v jiném Mac nebo
jiný PC.
>> Tak to dopadá, že je tento operátor volal sizeof, že pokud omdlíte to na
Název datového typu - jako char nebo int, float nebo -
to vám řekne, dynamicky, kolik bajtů char zabírá na toto téma
konkrétní počítač.
>> Tak to je v podstatě jen jako říkat krát 1 nebo
Časy vůbec nic.
Ale já to dělám jen být super anál, jen v případě, že se liší char
počítače proti dolu, tímto způsobem matematika je vždycky vyzkoušet.
>> Konečně, tady jsem zkontrolovat null, což je vždy dobré praxe - opět
Kdykoliv máme co do činění s ukazateli.
Pokud malloc nebyl schopen dát mě, že šest byes - což je
nepravděpodobné, ale jen v případě, že -
vrátit jednu okamžitě.
A teď, jděte do toho a kopírování řetězec následovně.
A to je známá syntaxe, i když v jiné roli.
>> Chystám se jít dopředu a dostat řetězec Délka s a uložte jej na n.
Já pak bude přecházet ze i rovná nulu až do a včetně N,
větší než nebo rovno.
Takže při každém opakování, dal jsem i-tý znak s-té
charakter t..
>> Takže to, co se opravdu děje pod kapuce tady?
No, pokud to, například, je s -
a já jsem napsal ve slově H-E-L-L-O a tam je zpětné lomítko nula.
A opět, to je s polohovací zde.
A tady je t.
>> A to se ukazuje nyní kopie paměti, že jo?
Malloc mi dala celý kus paměti.
Nevím, co je zpočátku v každém z těchto umístění.
Takže budu myslet na to, jak celá parta otazníky.
>> Ale jakmile začnu opakování od nuly na nahoru přes délku S, T
držák nuly a t držák 1 -
a já dám teď na stropě -
t držák nuly a držák s nulovou střední že budu se kopírování
opakované h tady, E-L-L-O. Navíc, protože jsem dělal plus
1, zpětné lomítko nula.
>> Takže teď v případě Porovnání 1.C, Nakonec, když jsem vytisknout
kapitalizace t, měli bychom vidět, že to se nemění.
Nech mě jít dopředu a hned na to.
Tak, aby COPY1.
Dot lomítko Copy1.
Budu psát v ahoj, Enter.
A teď nevšiml, pouze kopie bylo aktivováno.
Protože jsem opravdu mají dva kusy paměti.
>> Bohužel, můžete to udělat pěkně špatné a docela nebezpečné věci zde.
Dovolte mi vytáhnout příklad tady, že nám dává příklad několika
odřádkováním.
Takže jen intuitivně tady, první řádek kódu, int x hvězda, prohlašuje,
proměnnou s názvem x.
A co je to datový typ této proměnné?
Co je to datový typ této proměnné?
To nebylo cliffhanger.
>> Datový typ int je hvězda.
Takže co to znamená? x bude uložit adresu int.
Jednoduché, jak to.
Y se bude ukládat adresa int.
Co je na třetím řádku kódu tam dělá?
Je to rozdělení, kolik bytů, s největší pravděpodobností?
Čtyři.
Vzhledem k velikosti int je zpravidla čtyři, malloc čtyři dává
mi adresu na kus paměť, jehož první bajtů
uložené nyní v x.
>> Teď jdeme trochu rychle.
Hvězdné x znamená co?
To znamená přejít na tuto adresu a dal to číslo tam?
Dal číslo 42 tam.
Hvězda y znamená jít do toho, co je v y a dal číslo 13 tam.
>> Ale počkejte chvilku.
To, co je v současné době v y?
Co je adresa y skladování?
Nevíme, že jo?
Nikdy jsme jednou použít přiřazení Provozovatel zahrnující y.
Tak y, jak je deklarováno na druhém řádku Kód je jen nějaký odpad hodnota, velký
otazník, abych tak řekl.
Mohlo by se ukazovat náhodně na něco v paměti, což
je obecně špatné.
>> Takže jakmile se dostaneme tento řádek tam, hvězda y se rovná 13, něco špatného,
něco velmi špatného se chystá stát, aby Binky.
Takže pojďme se podívat, co se chystá skončit Binky děje tady v této minutě
nebo tak vypadají.
>> [PŘEHRÁVÁNÍ]
>> -Hej, Binky.
Probuďte se.
Je čas na ukazatel zábavu.
>> -Co je to?
Informace o ukazateli?
Oh, cukrovinka.
>> No, jak začít, myslím, že jsme bude potřebovat pár rad.
>> -OK.
Tento kód přiděluje dva ukazatele , které mohou ukazovat na celá čísla.
>> -OK, dobře, vidím dva ukazatele.
Ale nezdá se, že se ukázal na cokoliv.
>> -Přesně tak.
Zpočátku, ukazatele nejsou poukazují na cokoliv.
Věci, které poukazují na to, se nazývají pointees a jejich nastavení je
samostatný krok.
>> -Oh, dobře, dobře.
Věděl jsem, že.
V pointees jsou oddělené.
Tak jak se vám přidělit pointee?
>> -OK.
No, tento kód přiděluje nové celých čísel pointee, a tato část nastaví x
poukázat na to.
>> -Hej, to vypadá lépe.
Tak, aby to něco udělat.
>> -OK.
Budu dereference ukazatel x ukládat číslo 42 na jeho pointee.
Pro tento trik, budu potřebovat svou magii hůlka dereferencing.
>> -Vaše kouzelná hůlka z dereferencing?
No, to je skvělé.
>> -To je to, co kód vypadá.
Budu stačí nastavit číslo a -
>> -Hele, podívej.
Tam to jde.
Takže dělá dereferencování na x takto šipka přístup k jeho pointee.
V tomto případě, pro uložení 42 tam.
Hele, zkuste ji uložíte číslo 13 přes druhý ukazatel, y.
>> -OK.
Půjdu sem pro y a se číslo 13 nastavit.
A pak se hůlku dereferencing a jen -
whoa!
>> -Oh, hej.
To nefungovalo.
Řekněme, Binky, já si nemyslím, že dereferencing y je to dobrý nápad,
protože nastavení pointee je v samostatném kroku.
A nemyslím si, že jsme kdy udělali.
>> -Hmm.
Dobrý postřeh.
>> -Jo, přiděleno ukazatel y.
Ale my jsme nikdy nastavit tak, aby poukazují na pointee.
>> -Hmm.
Velmi pozorný.
>> -Hej, vy hledáte tam dobře, Binky.
Můžete opravit tak, že y body na stejné pointee jako X?
>> -Jasně.
Budu používat svou kouzelnou hůlku ukazatel úkol.
>> , Je, že bude problém jako dřív?
>> -No.
Tento nedotýkala pointees.
Je to jen jeden ukazatel změní na bod na totéž jako další.
>> -Oh, chápu.
Nyní y poukazuje na stejném místě jako x.
Tak počkat.
Nyní y je pevná.
Má pointee.
Takže si můžete vyzkoušet hůlku z dereferencing znovu
poslat přes 13.
>> -OK.
Tady to je.
>> -Hej, koukni na to.
Nyní dereferencing práce na y.
A protože ukazatele jsou sdílení že jeden pointee, že
jak vidět 13.
>> -Jo.
Sdílení.
To je fuk.
Takže jdeme vymění teď?
>> -Oh, podívej.
Jsme mimo čas.
>> -Ale -
>> -Jen si vzpomeňte na tři ukazatel pravidla.
Za prvé, základní struktura je, že máte ukazatel.
A poukazuje na na pointee.
Ale ukazatel a pointee jsou oddělené.
A Častou chybou je, aby nastavit ukazatel, ale
zapomněl daný pointee.
>> Číslo dvě, ukazatel dereferencing začíná u ukazatele a následuje jeho
Šipka nad přístup k jeho pointee.
Jak všichni víme, to funguje pouze v případě, že je pointee, která se dostane zpět do
Pravidlo číslo jedna.
>> Číslo tři, ukazatel postoupením jeden ukazatel a změny, upozornit na
stejně jako další ukazatel pointee.
Takže po zadání, dva ukazatele budou
o tentýž pointee.
Někdy se říká, že sdílení.
A to je všechno, tam je to, opravdu.
Bye bye teď.
>> [END PŘEHRÁVÁNÍ]
>> DAVID Malan: Takže více na ukazateli, více na Binky příští týden.
Uvidíme se v pondělí.