>> DAVID Malan: Dobrý deň, a vitajte naspäť CS50.
Tak to je koniec týždňa štyri.
Len jeden oznámenie ako prvý.
Takže tzv piatej pondelok prichádza tento rok v pondelok.
To je príležitosť pre zmenu z SAT / UNSAT na list triedy, alebo
list grade SAT / UNSAT.
Hnevu, že tento proces si vyžaduje podpis, pretože je nutné vyplniť
z jedného z tých ružových Pridať / pokles formy.
>> Vzhľadom k tomu, technicky, SAT / UNSAT verzie a list grade verzia
majú odlišné katalógových čísiel.
Ale žiadny veľký problém.
Poď ku mne, alebo Rob alebo Lauren v každom bode.
Alebo e-mailom nám, ak nemáte druh papierovanie, čo potrebujete dnes, a my
bude určite pomôže vziať starostlivosti, že pred pondelok.
>> Dobre, takže dnes -
Vlastne je tu trochu ozvena.
Môžeme tón ma trochu dole?
OK.
Takže dnes predstavíme tému známy ako ukazovatele.
A musím priznať, že je to jeden z zložitejšie témy, ktoré máme tendenciu
zahŕňa v tejto triede, alebo naozaj nejaký úvodný kurz, ktorý používa C.
>> Ale ver mi to, a to najmä ak vaša myseľ sa cíti trochu viac sa ohýbal
dnes av najbližších týždňoch.
Nie je to reprezentatívne vám darí ešte horšie, na to to jednoducho znamená, že
Je to obzvlášť sofistikovaný téma že Sľubujem, že za pár týždňov
preto sa bude zdať až príliš nápadne jednoduché spätne.
>> Stále si pamätám dodnes.
Sedel som v jedálni Elliott, sedí vedľa môjho TF Nishat Mehta,
ktorý bol rezidentom Elliott domu.
A z nejakého dôvodu, to téma len klikne.
Čo znamená, že aj ja som sa snažil s ňou na nejakú dobu, ale ja
bude v mojich silách, aby nedochádzalo každý takýto Boj s témou, ktoré v konečnom dôsledku
je veľmi silný.
>> V skutočnosti je jedným z tém, preberieme V nasledujúcich týždňoch je to, že
cenného papiera, a ako môžete skutočne využitie stroja spôsoby
, Ktoré nie sú určené.
A tie vykorisťovania sú zvyčajne výsledkom chýb chyby, ktoré sa
ľudia tým, že pochopenie niektorých podkladového vykonávanie
informácie, ktoré sú prostredníctvom programov.
>> Teraz aby to zdať viac užívateľsky priateľský, som myslel, že hrať 10
Druhý náhľad trochu claymation Obrázok s názvom Binky, ktorý bol do
Život by náš priateľ na Stanforde, Profesor Nick Parlante.
Takže mi dovoľte, aby som vám dal toto teaser na Binky tu.
>> [PLAYBACK]
>> -Hej, Binky.
Prebuďte sa.
Je čas na ukazovateľ zábavu.
>> -Čo je to?
Informácie o ukazovateli?
Oh, cukrovinka.
>> [END PLAYBACK]
>> DAVID Malan: To je Stanford počítačová veda.
Takže viac o tom prísť.
>> [APPLAUSE]
>> DAVID Malan: Je nám ľúto, Nick.
>> Takže pripomenúť, že minule sme skončili na je to naozaj vzrušujúce Cliffhanger
pričom táto funkcia jednoducho nefungovalo.
Aspoň intuitívne, bolo to ako by to malo fungovať.
Jednoducho prehodenie hodnôt z dvoch celých čísel.
Ale spomínam, že keď sme si vytlačili pôvodnej hodnoty v hlavnom jeden a
dvaja, oni boli ešte raz a dva a nie dva a jeden.
>> Takže dovoľte mi vlastne prepínať cez spotrebiča.
A napísal som sa trochu kostrového kódu v predom tu, kde tvrdím, že x
bude 1, bude mať y 2.
Potom som vytlačiť obaja ich hodnoty s potlačou f
>> Potom som tu tvrdia, že budeme swap.
Nechal som prázdne miesto tu pre nás vyplniť dnes za chvíľu.
Potom budem tvrdiť, že dve premenné boli zamenené.
Potom idem k tlači je von.
A tak dúfajme, že by som mal vidieť 1, 2.
2, 1.
Je to super jednoduché Cieľom práve teraz.
>> Tak ako sme sa ísť o výmene dve premenné?
No, ak navrhujem tu, že tieto poháre môže predstavovať v pamäti počítača.
To je len pár uhryznutie, to Je ešte niekoľko uhryznutí.
Mohli by sme sa dobrovoľníckej Poď hore a mix nám niečo na pitie, keď to povedome?
Poď hore.
Ako sa voláte?
>> JESS: Jess.
>> DAVID Malan: Jess?
Poď hore, Jess.
Ak vám to nevadí, musíme dať Google Sklo na vás, takže môžeme
zvečniť to.
OK, sklo.
Nahrávanie videa.
A OK, sú dobré ísť s Jessem tu.
Dobrá.
Rád Vás vidím.
>> Takže to, čo by som chcel tu robíte - ak by ste mohol, pomerne rýchlo -
práve nalieva nám pol pohára oranžové šťavy a pol pohára mlieka,
čo účinne čísla 1 v jednej šálke a 2 v druhom šálke.
>> To bude dobré zábery.
>> JESS: Ospravedlňujem sa.
>> DAVID Malan: Nie, nie.
To je v poriadku.
Pekný.
Dobre, takže máme štyri byty stojí pomarančového džúsu.
Budeme to nazval hodnotu 1.
Teraz ďalšie štyri bajty v hodnote mlieka.
Bude hovoriť, že hodnota 2.
Takže x a y, resp.
>> Dobre, takže teraz, ak úlohu po ruke - pre vás, Jess, pred všetkými
svojich spolužiakov -
je swap hodnoty x a y také, že chceme pomarančovej šťavy
ďalší pohár a mlieka v tomto pohári, ako Možno si - ako je skutočne robiť
je - ísť asi robí?
>> OK, múdre rozhodnutie.
Takže budete potrebovať trochu viac pamäte.
Takže poďme prideliť dočasný pohár, ak chcete.
A teraz pristúpiť k výmene x a y.
>> Výborný.
Takže veľmi dobre.
Ďakujem moc, Jess.
Prosím.
Trochu suvenír.
>> OK, tak samozrejme, super jednoduchý nápad.
Úplne intuitívne, že potrebujeme trochu viac úložného priestoru - v tejto podobe,
šálka - ak sa naozaj chcete výmena týchto dvoch premenných.
Takže poďme robiť presne to.
Až tu medzi tým, kde tvrdím, že som bude robiť nejaké vymieňať, ja
choďte do toho a vyhlásiť tepl.
A ja nastavte ju presne, povedzme, x.
>> Potom idem zmeniť hodnotu x, rovnako ako Jess som tu s
mlieko a pomarančový džús bzř y.
A ja pre zmenu y sa rovná k nie x, pretože teraz budeme
uviazol v kruhu, ale skôr temp.
Tam, kde som dočasne - alebo tam, kde Jess dočasne dať pomarančový džús
pred prepisovanie, že šálka s mliekom.
>> Tak ma nechaj ísť dopredu a teraz aby to.
Hovorí sa noswap.c.
A teraz mi dovoľte bežať bez swapu.
A skutočne vidím, keď som rozšíriť Okno trochu, že
x je 1, y je 2..
A potom je x 2, y 1.
>> Ale pripomínam, že v pondelok sme urobili veci trochu inak, keď som
namiesto toho splnil pomocnú funkciu, ak chcete, že bol vlastne neplatné.
Volal som ju vymeniť.
Dal som to dva parametre, a zavolal som im a nazval som ho b
>> Úprimne povedané, by som mohol nazvať x a y.
Nie je nič zastaviť ma v tom, že.
Ale ja by som tvrdiť, že je to potom trochu nejasné.
Vzhľadom k tomu, pripomínajú na pondelok, že sme uviedla, že tieto parametre boli
kópia hodnôt prešiel dovnútra
Tak to proste zmätky s mysli, myslím, že pokiaľ použijete
presne rovnakej premennej.
>> Tak som si namiesto toho im hovoriť a b, len pre prehľadnosť.
Ale mohli by sme im hovoriť najviac niečo chceme.
A ja idem skopírovať a vložiť účinne tento kód odtiaľ
dole do tu.
Pretože som videl, že to funguje.
Tak to je v dobrom stave.
A ja sa zmením x do x, mojej na môj y b a môj y do bodu B.
>> Takže inými slovami, presne rovnaká logika.
Presne to isté, že Jess urobil.
A potom jedna vec, ktorú musíte urobiť, až tu, samozrejme, je teraz vyvolať toto
funkcie alebo volanie tejto funkcie.
Tak som sa volať túto funkciu s dvoma vstupy, x a y, a stlačte Uložiť.
>> Dobre, tak zásadne to isté.
V skutočnosti som asi urobil program zbytočne zložité podľa
písať nejakú funkciu, ktorá je len zaberajú asi šesť riadkov kódu kým ja
predtým realizované To len tri.
>> Tak ma nechaj ísť dopredu a hneď prerobiť to, aby žiadny swapu.
Dobre, ja to posral tu.
To by malo byť chyba, ktorú by mohli v stále bežne ako vaše
Programy sa zložitejšie.
Ale je ľahké opraviť.
Dovoľte mi, aby som sa posunúť späť sem.
>> A čo je prvá chyba vidím?
Implicitné vyhlásenia.
Čo to spravidla označujú?
Zabudol som prototyp.
Zabudol som učiť kompilátora, že výmena bude existovať, aj keď
neexistuje na samom začiatku programu.
Tak som len chcel povedať, void, swap, int, int b, bodkočiarku.
>> Tak som sa nebudem ho implementujeme.
Ale teraz to zodpovedá tomu, čo tu dole.
A oznámenia, absencia bodkočiarkou tu, čo nie je potrebné, ak
vykonávanie.
>> Dovoľte mi teda prerobiť to, aby žiadny swapu.
Oveľa lepší tvar.
Beh bez swapu.
A sakra.
Teraz sme tam, kde sme boli v pondelok, kde to nebude zameniť.
>> A čo je intuitívne vysvetlenie , Prečo je tomu tak?
Jo?
>> STUDENT: [nepočuteľné].
>> DAVID Malan: Presne tak.
Tak a a b sú kópie xa y.
A v skutočnosti, zakaždým, keď som bol volanie funkcie tak ďaleko, že sa
prechádza premenných, ako je ints -
rovnako ako odkladací čaká tu -
vy boli odovzdaním kópií.
>> Teraz to znamená, že to trvá trochu času, zlomok sekundy, pre
počítača skopírovať bitov z jedného variabilná do bitov druhého.
Ale to nie je tak veľký problém.
Ale oni napriek tomu kópie.
>> A tak teraz, v súvislosti s swapu, Som v skutočnosti úspešne
meniace sa a a b
V skutočnosti, poďme rýchlo zdravý rozum skontrolovať.
Vytlačiť f je% i, nový riadok.
A poďme sa zapojiť.
Teraz sa poďme urobiť to isté s b.
A poďme urobiť to isté tu.
>> A teraz mi dovoľte, aby som kopírovať tie isté linky opäť v spodnej časti funkcie
po mojej tri riadky zaujímavé mohol vykonávať, a
vytlačiť a b ešte raz.
Takže teraz poďme urobiť to, aby žiadny swapu.
Dovoľte mi, aby som okno terminálu trochu vyššie, takže môžeme vidieť
viac naraz.
>> A spustiť bez swapu.
x je 1, y je 2.. je 1, b je 2.
A potom, je 2, b je 1.
Tak to funguje, rovnako ako Jess som tu vnútri swapu.
Ale samozrejme, že to nemá žiadny vplyv na premenné v main.
>> Takže sme videli trik, kedy sme mohol opraviť, nie?
Keď ste tvárou v tvár tejto vymedzenie rozsahu problém, mohol by si staviť a zarobiť x
a y aké premenné miesto?
>> Dalo by sa, aby boli globálne.
Dajte je na samom vrchole tohto súboru ako sme to urobili, a to aj v hre 15.
Používame globálne premenné.
Ale v rámci hry 15, to je rozumné mať globálny
premenná reprezentujúci dosku, pretože celistvosť 15.c je všetko
o vykonávaní tohto hru.
To je to, čo existuje súbor robiť.
>> Ale v tomto prípade tu, som volanie funkcie swapu.
Chcem vymeniť dve premenné.
A to by sa mal začať cítiť nedbanlivý v prípade, že riešenie všetkých našich
problémy, keď sme sa spustiť do pôsobnosti otázok je, aby to globálne.
Pretože sa veľmi rýchlo, je náš program stane docela zmätok.
A my sme urobili len veľmi zriedka Výsledkom tohto 15.c.
>> Ale ukazuje sa, že je lepší spôsob, ako úplne.
Dovoľte mi, aby som skutočne vrátiť a odstrániť vytlačiť f je, len preto, aby zjednodušenie tohto kódu.
A dovoľte mi navrhnúť, aby to je skutočne zlá.
Ale keď som sa namiesto toho v niektorých hviezdičkami a hviezdy, môžem namiesto toho premeniť túto
funkcie do jedného, ​​ktorý je skutočne funkčný.
>> Tak nechaj ma ísť späť a pripustiť, hovorí hviezdička je vždy ťažké,
tak poviem hviezdy.
Budem Priznáme do tej jednej.
Dobrá.
A teraz, čo mám robiť namiesto toho?
>> Takže v prvom rade, budem špecifikovať že miesto odovzdávanie int do
Swap funkcie, som miesto ísť povedať int hviezdu.
A teraz, čo sa hviezda uviesť?
Je to, že pojem ukazovateľ, ktorý Binky, claymation postava, bol
s odkazom na chvíľu späť.
>> Takže keď hovoríme pravý hviezdu, význam teraz je to, že sa nebude
prešiel v jej hodnotou.
To nebude kopírovať palcov
Skôr adresa je bude odovzdaný palcov
>> Takže pripomenúť, že vo vnútri vášho počítača je celá partia pamäti, inak
známy ako RAM.
A to je len RAM celá partia bajtov.
Takže ak váš Mac alebo PC má dva GB, budete mať 2
miliarda bajtov pamäte.
>> Teraz len predpokladať, že len preto, aby udržať veci pekné a usporiadane sme
priradenie adresy -
číslo -
je ku každému byte pamäte RAM v počítači.
Úplne prvý bajt z týchto 2 miliárd je o číslo nula.
Ďalšia je bajt číslo jedna, číslo dva, celú cestu hore, dot dot
bodka, na zhruba 2 miliardy.
>> Takže môžete počet bajtov pamäte v počítači.
Takže predpokladajme, že to je to, čo máme na mysli adresu.
Takže keď vidím pravý hviezdu, čo sa deje ktoré majú byť odovzdané do swapu je teraz
adresa.
Nie jeho hodnota, ale bez ohľadu na jeho poštovej adresa, aby som tak povedal -
jeho umiestnenia v pamäti RAM.
>> A podobne pre B, idem povedať to isté.
Int, hviezdu, b
Ako stranou, technicky hviezdy mohol ísť aj na iných miestach.
Ale budeme štandardizovať hviezdy bytia hneď vedľa dátového typu.
>> Takže vymeniť podpis teraz znamená, daj mi adresa int a volanie
že adresa.
A daj mi ešte jednu adresu int a volať, že Adresa B.
>> Ale teraz môj kód tu sa musí zmeniť.
Pretože ak Prehlasujem, int temp -
, Ktorý je stále ešte typu int -
ale uložiť v ňom, aké hodnoty?
Aby bolo jasno, ja som uvedenie sa kód, ktorý je napísaný práve teraz?
>> Dávam umiestnenie v.
Ale ja sa nestarám o miesto, nie?
Temp existuje len Jess tretiu šálku existovala, za akým účelom?
Pre uloženie hodnoty.
Mlieko alebo pomarančový džús.
Nie je skutočne uložiť adresu jeden z tých vecí, ktoré sa cítia
trochu nezmyselné v tomto reálnom svetový kontext, tak ako tak.
>> Takže naozaj to, čo chcem, aby v temp nie je adresa, ale
obsah.
Takže, ak je číslo ako 123, to je 123. byte pamäti, že práve
stane sa okupačné, že hodnota v sa stane byť zaberá.
>> Ak chcem ísť na túto adresu, Musím povedať, hviezdu.
Rovnako tak, ak by som mal zmeniť to, čo je na adresu, zmením
to spustiť.
Ak chcem uložiť v tom, čo je na miesto s tým, čo je v mieste,
na b, b hviezda hviezda.
>> Takže v skratke, aj keď to nie je úplne potopenie doteraz - a ja by som nečakal
že by to tak rýchlo -
Uvedomujeme si, že všetko, čo robím je prefixu tieto hviezdy na mojej premenných,
porekadlá nechcete chytiť hodnoty.
Nemeňte hodnoty.
Ale skôr, prejdite na tieto adresy a získať hodnotu.
Prejdite na túto adresu a zmeny hodnota tam.
>> Takže teraz mi dovoľte sa posunúť späť na vrchol, len opraviť tento riadok tu,
zmeniť tak, aby zodpovedal prototyp.
Ale ja teraz musíte urobiť jednu vec.
Intuitívne, či som zmenil typy argumentov, že prehodí očakáva,
čo ešte musím zmena v mojom kóde?
>> Keď hovorím swapu.
Pretože práve teraz, čo som Aj okolo vymeniť ešte?
Hodnota x a hodnota y, alebo mlieko a pomarančový džús.
Ale ja nechcem robiť.
Ja namiesto toho chcete odovzdať, čo?
Umiestnenie X a umiestnenia y.
Aké sú ich poštovej adresy, aby som tak povedal.
>> Takže robiť, že tam je ampersand.
Ampersand trochu znie ako adresu.
tak n, ampersand, adresa z x a y adresu.
Takže je to úmyselné, ktoré používame ampersand pri volaní funkcie,
a hviezdy pri ohlásení a kedy vykonávanie funkcie.
>> A len si ampersand ako adresa prevádzkovateľa, a hviezdy ako
tam operátor -
, Alebo, presnejšie, dereferencia operátor.
Tak to je celý rad slov, len aby povedať, že teraz, dúfajme, že výmena sa deje
správne.
>> Nechaj ma ísť ďalej a robiť -
poďme vlastne súbor premenovať, inak tento program naďalej prístupní žiadny swap.
Tvrdím, že budeme hovoriť swap.c teraz.
Takže si, swap.
Dot, lomítko, swap.
>> A teraz skutočne, x je 1, y je 2..
A potom, je x 2, y je jedna.
No uvidíme, či môžeme to urobiť trochu inak, pokiaľ ide o to, čo je
tu deje.
Najprv mi dovoľte priblížiť na našich kreslenie obrazovku tu.
A dovoľte mi navrhnúť na chvíľu - a keď som kresliť tu sa odrazí
tam teraz - dovoľte mi navrhnúť, aby tu je celá partia pamäte alebo
RAM, vnútri môjho počítača.
>> A to bude sústo číslo, povedzme, 1.
To bude mať číslo 2 bajty.
A ja budem robiť veľa viac, a potom banda dot dot bodky na
naznačujú, že tam je 2 miliardy z týchto vecí.
4, 5, a tak ďalej.
>> Takže tam sú prvými piatimi bajtov mojej pamäti počítača.
V poriadku?
Veľmi málo z 2 mld Sk.
Ale teraz idem navrhnúť nasledujúce.
Budem navrhovať, že x bude uložiť číslo 1 a y sa deje
uložiť číslo 2.
A nechaj ma ísť napred a predstavuje teraz tieto hodnoty takto.
>> Poďme na to takto.
Daj mi jednu sekundu.
Jedna sekunda.
OK.
Chcem, aby to trochu -
ideme na to znova.
Inak idem a používanie rovnaké čísla, neúmyselne,
viackrát.
>> Takže len tak máme rôzne čísla hovoriť, nazvime tento bajt
číslo 123, 124, 125, 126, a dot dot dot.
A dovoľte mi tvrdí, že teraz budem dať hodnotu 1 tu, a hodnotu 2
tu, inak známy ako x a y.
Tak to len tak sa stane, že to je x, to je y.
>> A len nejakou náhodou, počítače, operačný systém,
stalo, aby X na mieste číslo 123.
A y skončil na mieste 124 -
sakra.
Mal som opravil toto.
Človeče, mám naozaj chcete urobiť?
Áno, chcem to napraviť a b správne o tom dnes.
Ospravedlňujeme sa, ale na tejto novej.
>> 127, 131, a nechcel som, aby sa to zložité, ale prečo som sa zmenil
Čísla tam?
Pretože chcem, aby sa ints v skutočnosti štyri bajty.
Takže poďme byť super anal o tom.
Tak, že ak sa stane, 1 je potrebné sa zaoberať 123, 2 bude na adrese
127, pretože je to len 4 byes preč.
To je všetko.
A budeme zabudnúť na všetky Ostatné adresy na svete.
>> Takže x je v mieste 123, y je v mieste 127.
A teraz, čo mám vlastne chcete robiť?
Keď hovorím odkladacia teraz, čo je vlastne deje?
No, keď hovorím swapu som odovzdaním adresa x a y na adresu.
Tak napríklad, ak sa tieto dva kusy z papiera teraz predstavujú dve
argumenty a a b vymeniť, čo som ja budem písať o prvej z nich,
ktorý budem volať označujú ako?
>> Presne tak, 123.
Tak toto tvrdím je.
Jedná sa o parameter.
Dávam adresu x tam.
>> Čo je to?
>> Nie, nie.
To je v poriadku.
Ešte dobre, stále dobrá.
Tak to je.
A teraz na druhý kus papiera, to bude b, a to, čo som
bude písať na tento kus papiera?
127.
>> Takže jediná vec, ktorá sa zmenila od tej doby naše predchádzajúce rozprávania tohto príbehu je,
skôr než doslovne 1 a 2, som prejsť na 123 a 127.
A ja som teraz dám takýchto dovnútra tejto kolónky, v poriadku?
Tak, že čierna skrinka sa predstavuje swap funkcie.
>> Medzitým, poďme sa teraz niekto implementovať odkladacie funkciu.
Niekto by tu ako dobrovoľník?
Poď hore.
Ako sa voláte?
Charlie.
Dobre, Charlie.
Poď hore.
>> Takže Charlie bude hrať role našej čiernej skrinky.
A Charlie, čo by som chcel, aby si Teraz je realizovaná swapu takým spôsobom,
že vzhľadom na to, tieto dve adresy, ste sa vlastne deje
k zmene hodnôt.
A ja budem šepkať do ucha ako spustiť TV tu.
>> Takže choďte do toho, a ty si čiernej skrinky.
Oslovte tam.
Aké hodnoty vidíte na a aké hodnoty vidíte na b?
>> CHARLIE: je 123 a b je 127.
>> DAVID Malan: OK, presne tak.
Teraz pozastaviť tam len na chvíľu.
Prvá vec, ktorú budete robiť teraz, podľa kódu - čo
Budem sa vytiahnuť na obrazovke -
bude prideliť trochu bit pamäte s názvom temp.
Takže budem pokračovať a vám, že pamäť.
>> Takže to bude tretia premenné že máte prístup k
voláš tepl.
A čo budete písať na temp kus papiera?
>> CHARLIE: Ukazovatele, že jo?
>> DAVID Malan: OK, dobre nie je nutne ukazovatele.
Takže riadok kódu, ktorý som zvýraznená na pravej strane,
začnime tam.
To hovorí hviezda.
Takže sa v súčasnej dobe skladovania číslo 123.
A len intuitívne, čo sa hviezda 123 znamená?
>> Ale najmä, ak je 123, hviezda znamená čo?
Hodnota.
Alebo neformálne, choďte tam.
Takže mi dovoľte navrhnúť, že drží v tvoja ruka, choďte do toho a liečbe, ktoré
ako keď je to mapa.
A chodiť sami sa k počítaču je pamäť, a nájsť to, čo je nám
na mieste 123.
Presne tak.
>> Vidíme teda, na mieste 123 je to, samozrejme?
OK, takže to, čo hodnota teraz ste dám do temp?
Presne tak.
Takže choďte do toho a robiť, že.
A napíšte číslo 1 na kus papier, ktorý je v súčasnej dobe s názvom temp.
>> A teraz ďalší krok, ktorý budete realizovať
bude to.
No, na pravej strane Nasledujúci riadok kódu je hviezda b b, o
Samozrejme, ukladá adresu.
To sa týka 127.
Hviezda b znamená to, mimochodom povedané?
>> Prejsť na tomto mieste.
Takže choďte do toho a nájsť to, čo je nám na mieste 127.
OK.
Samozrejme, že na mieste 127, je stále hodnota 2.
Tak čo ideš skladujte pri bez ohľadu na to na mieste v?
Takže hviezdy prostriedkom prejdite do umiestnenia na.
Čo je umiestnenie?
>> Presne tak.
Takže teraz, ak chcete zmeniť čo je na tomto mieste -
Pôjdem napred a spustite guma tu.
A teraz ju späť na štetec.
Aké číslo sa chystáte písať V tomto boxe prázdne teraz?
>> Presne tak.
Takže tento riadok kódu, aby bolo jasno - či mi pauza, čo robí, a Charlieho
upozorniť na to, čo práve urobil, je písať do tohto poľa v mieste 123
hodnota, ktorá bola predtým v b.
A tak sme teraz vykonáva naozaj Tento druhý riadok kódu.
>> Teraz bohužiaľ, je to ešte jeden riadok zostávajúce.
Teraz, čo je v teplote, a to doslova?
Je to zrejme číslo jedna.
To nie je adresa.
Je to len číslo, druh premenné z jedného týždňa.
>> A teraz, keď hovoríte, hviezdičkový B, to znamená, že prejsť na adresu B, ktorý je na
kurz tu.
Takže akonáhle sa tam dostanete -
Pôjdem napred a vymazať to, čo je v skutočnosti tam - a to, čo ste
budem písať teraz v polohe 127?
>> CHARLIE: Temp, ktorý je jeden.
>> DAVID Malan: Temp, ktorý je jeden.
A čo sa stane, aby teplota na konci?
No, naozaj neviem.
Nemáme naozaj záleží.
Kedykoľvek sme implementovali funkciu tak ďaleko, nejaké lokálne premenné máte
sú skutočne miestni.
A len tak zmiznúť.
Sú prevzaté z prevádzky systém sa.
>> Tak, že teplota stále Hodnota 1 je akýmsi zásadným spôsobom
nezaujíma nás.
Dobre, takže potlesk keby sme mohli pre Charlieho.
Veľmi dobre.
>> Dobre, takže čo viac robí to znamená, čo môžeme urobiť?
Takže sa ukazuje, že sme boli hovorí niekoľko White Lies
pre docela nejaký čas.
V skutočnosti sa ukazuje, že reťazec, všetky tohto času, nie je naozaj
postupnosť znakov na sebe.
Je to druh, ktorý je intuitívne.
>> Ale technicky vzaté, je reťazec dátový typ, ktorý sme deklarovali vo vnútri
CS50 knižnica zjednodušiť svet počas prvých niekoľkých týždňov triedy.
Čo reťazec naozaj je adresa znaku niekde v pamäti RAM.
Reťazec je naozaj celá rada, rovnako ako 123 alebo 127, ktorý sa stane vymedziť
kde reťazec začína v pamäte počítača.
>> Ale to nepredstavuje reťazec, samo o sebe, sama o sebe.
A vidíme to takto.
Nechaj ma ísť dopredu a otvoriť nejaký kód, ktorý je medzi
dnešné príklady zdrojového kódu.
A ja idem dopredu a otvoriť do, povedzme, porovnajte-0.c.
Jedná sa o kočík program, ktorý bude ktoré sa majú vykonať nasledujúcim spôsobom.
>> Prvý.
Chystám sa niečo povedať.
Potom budem pokračovať a získať reťazec od užívateľa
V tomto ďalšom riadku.
Potom budem to hovoriť znova.
Potom budem mať ďalšie reťazec od užívateľa.
>> A oznámenia, ukážem jeden z reťazca v premennej s názvom S a
ďalší z týchto reťazcov v premennej s názvom t
A teraz budem tvrdiť, veľmi rozumne, že pokiaľ je rovná rovná t,
reťazce sú rovnaké.
Tu zadajte to isté.
Inak sú reťazce nie je to isté.
>> Koniec koncov, ak by sme vstup dva ints, dve znaky, dva plaváky, dva dvojlôžkové, niektorý z
dátové typy sme hovorili o tak ďaleko porovnať ich -
Spomínam si, že sme veľmi jasne pred chvíľou že nebudete robiť to, pretože
jedno znamienko rovná sa je samozrejme operátor priradenia.
Tak to by bolo chybou.
>> Používame rovnaké znamienko rovnosti, ktorý naozaj porovnáva
veci pre skutočnej rovnosti.
Ale ja vyhlasujú, že toto je chybné.
Keď idem do toho a robiť porovnať nulu, a potom sa bodka lomítko porovnať nulu.
A ja som písať v, povedzme, ahoj.
A potom povedzme, že ahoj znova.
Doslova to isté, počítač tvrdenie som napísal rôzne veci.
>> Teraz možno som len niečo preklepu.
Budem písať moje meno tentoraz.
Myslím, ahoj.
Dobrý deň.
Je to iné, každý čas.
>> No, prečo to je?
Čo sa naozaj deje pod kapotou?
No, čo sa naozaj deje pod kapucňa je reťazec, potom
Som napísal v tom prvom napríklad je slovo ahoj, samozrejme.
Ale ak budeme predstavovať to pod kapucňa, pripomenúť, že
Reťazec je v poli.
A my sme povedal, ako v minulosti.
>> Takže ak čerpám, že pole, ako to, že som bude reprezentovať niečo úplne
podobné tomu, čo sme robili pred chvíľou.
A je to vlastne niečo, špeciálny tady taky.
Čo sme sa zistiť, na Na konci každého reťazca?
Jo, to lomítko nula, čo je len spôsob, ako reprezentovať,
doslovne, 00000000.
Osem bitov 0 v rade.
>> Ja neviem, úprimne povedané, čo je po tomto.
Je to len banda viac pamäte RAM vnútri môjho počítača.
Ale to je pole.
Hovorili sme o poliach predtým.
A my typicky hovoriť o pole ako miesto nula,
potom jeden, potom dva.
Ale to je len pre pohodlie.
A to je absolútne relatívna.
>> Ak ste skutočne dostať z pamäti počítač, je to samozrejme akékoľvek
2000000000 niektoré nepárne bajtov, potenciálne.
Takže naozaj pod kapotou Celú tú dobu, že áno.
To by mohlo veľmi dobre byť držiak nula.
Ale ak budete kopať ešte hlbšie pod kapucňa, to je naozaj
zaoberať číslo 123.
Toto je adresa 124.
Toto je adresa 125.
>> A ja som nepodělal tentoraz.
Tie sú teraz jeden bajtov rozdiel z akého dôvodu?
Ako veľká je char?
Char je len jeden bajt.
Int je zvyčajne štyri bajty.
Takže to je dôvod, prečo som to 123, 127, 131 a tak ďalej.
Teraz môžem mať matematický jednoduchšie a proste plus 1.
A to je teraz to, čo sa skutočne deje na pod pokrievku.
>> Takže, keď vyhlásil niečo také, reťazec s, to je v skutočnosti -
to dopadá -
char hviezda.
Hviezda, samozrejme, znamená, že adresa, aka ukazovateľ.
Takže je to niečo adresa.
Čo je to adresa?
>> No -
Som jediný, kto môže vidieť veľmi Dôležitým bodom robím, alebo si myslíte,
Robím.
Tak string -
Smutné je, že máte monitor práve tam, kde som
mohol vidieť, že.
>> Dobre, takže to je to, čo reťazec Som vyhlásil predtým.
Ukazuje sa však, vďaka malej kúzlo vo CS50 knižnice, to všetko
Doba reťazec má doslova Bol char hviezda.
Hviezda opäť znamená ukazovateľ alebo adresu.
Skutočnosť, že je to sprievodné slovo znak znamená, že je
adresa charakteru.
>> Takže ak sa reťazec sa nazýva, a píšem v H-E-L-L-O, navrhne teraz, čo sa
string doslova vrátenie všetkých tentoraz, aj keď máme dosť
zjednodušený svet?
Čo sa vlastne reťazec vráti ako svoju návratovú hodnotu?
>> 123 V tomto prípade, napríklad.
Sme už skôr povedal, že sa reťazec jednoducho vráti reťazec, postupnosť
znakov.
Ale to je trochu biele lži.
Spôsob, akým sa string naozaj funguje Pod kapotou je dostane
reťazec od užívateľa.
To plops znaky, ktoré on alebo ona typov v pamäti.
Kladie spätné lomítko nula na konci z tých postupnosť znakov.
>> Ale čo sa reťazec doslova vrátiť?
Je to doslova vráti adresu Úplne prvé bajty RAM
používa sa pre tú silu.
A ukázalo sa, že práve tým, že vráti jediná adresa
Prvý znak v reťazci, ktorý je dostačujúci pre zistenie celistvosť
reťazec.
>> Inými slovami, dostanete reťazec nemá vrátiť 123 a 124 a 125.
Nemusí sa mi dlho Zoznam všetkých bytov, ktoré
môj reťazec používa.
Vzhľadom k tomu, jeden, všetci chrbtom k sebe.
A za druhé na základe prvej adresu, som môžu zistiť, kde reťazec končí.
Ako na to?
>> Zvláštne znak null, spätné lomítko nulu na konci.
Takže inými slovami, ak je prejsť okolo -
v premenných -
adresa char, a predpokladať, , Že na konci každého reťazca, každý
postupnosť znakov ako my ľudia si reťazcov, ak predpokladáme, že
Na konci takéhoto reťazca je tu nulovej spätné lomítko, si zlatá.
Vzhľadom k tomu, môžete vždy nájsť koniec reťazca.
>> Teraz, čo sa skutočne deje a potom na v tomto programe?
Prečo je tento program, Porovnanie 0.c, kočík?
Čo je skutočne v porovnaní?
Jo?
>> STUDENT: [nepočuteľné].
>> DAVID Malan: Presne tak.
Je to porovnanie umiestnenie z reťazcov.
Takže ak užívateľ zadal v ahoj raz, ako ja, môže pamäť skončiť
, Vyzerá takto.
Ak potom používateľ druhy uvedené v Ahoj, ale tým, že volá dostať reťazec znova, c je
nijako zvlášť chytrý, ak učíte že je šikovný písanie kódu.
>> C -
a počítače všeobecnejšie -
Ak napíšete v slove ahoj znova, viete, čo budete mať.
Tie len tak dostať druhú sériu pamäti, že áno, stane sa
skladovanie H-E-L-L-O, a tak ďalej.
>> Bude to vyzerať rovnako na nás, ľudí, ale táto adresa
nemusí byť 123.
Mohlo by to len tak stať, že operačný systém má niektoré dispozícii
priestor napríklad v mieste -
povedzme niečo ľubovoľný, ako je to miesto 200.
A to je miesto 201.
A to je miesto 202.
Nemáme potuchy, kde to je bude v pamäti.
>> Ale čo to znamená, že to, čo je bude uložený v konečnom dôsledku s?
Číslo 123.
Čo bude uložený v t, V tomto príklade ľubovoľnej?
Číslo 200.
A to všetko znamená, že je potom zrejmé, 123 sa nerovná 200.
A tak to, ak podmienka nikdy vyhodnotený ako true.
Vzhľadom k tomu, get string používa iný kusy pamäti zakaždým.
>> Teraz môžeme vidieť znova v ďalšom príklade.
Nechaj ma ísť dopredu a otvoriť copy-0.c.
Tvrdím, že tento príklad bude vyskúšať - ale nedarí - kopírovať dva reťazce
nasledovne.
>> Chystám sa niečo povedať pre užívateľa.
Ja potom dostanem reťazec a nazývať to je.
A teraz, robím túto kontrolu tu.
Zmienili sme sa o to chvíľu späť.
Ale keď mohol dostať reťazec vrátiť hodnotu NULL, iný špeciálny znak alebo zvláštne
symbol povedzme.
Ak je nedostatok pamäte.
>> Napríklad, v prípade, že používateľ je skutočne je ťažké a typy otrasné
počet znakov na klávesnice a hity Enter.
Ak to počet znakov jednoducho nemôžem vojde do pamäte RAM, čo blázon
Dôvodom, dobre sa reťazec by mohol veľmi dobre vrátiť hodnotu null.
>> Alebo ak váš program sám o sebe robí veľa ďalších vecí, a tam je len
nie je dostatok pamäte pre get string na úspech, mohlo by to skončiť
sa vracia null.
Ale buďme presnejší pokiaľ ide o to, čo je to.
Čo je S typ dát naozaj?
Char hviezda.
>> Tak to dopadá teraz môžeme ošúpať späť vrstvu null.
Ukázalo sa, že je null - áno, samozrejme špeciálny symbol.
Ale čo je to naozaj?
Naozaj, null je len symbol, ktorý sme ľudia používajú k reprezentácii na nulovej úrovni.
>> Takže autorov C a počítačov všeobecnejšie, rozhodol rokmi
to, že viete, čo.
Prečo by sme zabezpečiť, aby žiadny užívateľ údaje nikdy, nikdy, nikdy
uložené na bye nula?
V skutočnosti, dokonca aj vo svojom ľubovoľnom príklade predtým som nezačal číslovanie
byty na nulu.
Začal som v jednom.
Pretože som vedel, že ľudia vo svete sa rozhodli vyhradiť nula
byte v niečí pamäti ako niečo zvláštne.
>> Dôvodom je, kedykoľvek chcete signál, že nie je niečo v poriadku
s ohľadom na adresy, je vrátená null - inak známy ako nula -
a pretože viete, že nie je dôveryhodne dát na adrese nula, jasne
Znamená to, že došlo k chybe.
A to je dôvod, prečo sme sa podľa konvencie, skontrolujte, či pre nulové a spätné niečo
ako jeden v týchto prípadoch.
>> Takže keď prejdite nadol teraz, je to len potom niektoré kontrola chýb, len v prípade,
niečo, čo sa stalo s [? kauciu?]
dohromady a ukončiť program o predčasnom návrate.
Táto rada teraz môže byť prepísaná , Pretože to, čo znamená, že to, čo?
Na ľavej strane, daj mi ďalší ukazovateľ na znak, a nazývať to t
Čo mám skladovanie vnútri t, na základe na tomto jednom riadku kódu?
>> Som uloženie umiestnenia.
Konkrétne umiestnenie ktorá bola v sekundách.
Takže ak užívateľ zadal v ahoj a že prvý ahoj stane, že skončí
tu, potom číslo 123 je že sa vráti z dostať
reťazca a uložiť -
Ako sme už povedali skôr -
v sekundách.
>> Keď som teraz vyhlásiť ďalšie ukazovatele char a nazývať to t, čo je číslo
doslova skončí v t podľa príbehu?
Tak 123.
>> Takže technicky teraz aj s a t ukazujú na presný
Rovnaké kúsky pamäti.
Tak zistíte, čo budem robiť teraz, aby dokazujú, že tento program je chybné.
>> Najprv budem tvrdiť, s print f, zarábať
kópiu reťazca.
Potom budem robiť niečo Kontrola chýb.
Idem sa uistiť.
Poďme sa uistite, že reťazec je t aspoň väčšia ako nula na dĺžku,
takže tam je nejaký znak, že skutočne využiť.
>> A potom si možno pamätáte tento z predchádzajúcich príkladov.
2 horné -, ktorý je v ctype.h súbor.
T držiak nula mi dáva nulu znak reťazca t
A 2 horné tej istej hodnoty, o Samozrejme, konvertuje ich na veľké písmená.
>> Takže intuitívne, to zvýraznenou líniou kódu je zarábať prvý
list vt.
Ale to nie je zarábať, intuitívne, prvé písmeno v sekundách.
Ale ak premýšľate nad tým, čo som asi vidieť, keď som spustiť tento program
a vytlačiť ako pôvodné, s, a tzv copy, t?
>> Sú to vlastne bude rovnaký.
A prečo sa to bude rovnaké?
Obaja sú poukazom na presne to isté.
Tak poďme na to.
>> Vykonajte kopírovanie nulu.
Zhŕňa OK.
Dovoľte mi spustiť kopírovanie nulu.
Nechaj ma písať niečo ako ahoj v všetko malými písmenami a stlačte Enter.
A tvrdí, že tak pôvodná s a kópie sú naozaj totožné.
>> Takže to, čo sa naozaj stalo tu?
Dovoľte mi, aby som tento obrázok prekresliť len rozprávať príbeh
mierne odlišným spôsobom.
Čo sa naozaj deje pod kapucňa, keď som vyhlásil niečo ako
char začiatok s, alebo reťazec s, Som stále ukazovateľ -
ktorý sa stane, že je štyri byty v CS50 spotrebiče
av mnohých počítačov.
A budem volať toto s.
A to má v súčasnej dobe nejaká neznáma hodnota.
>> Keď deklarujete premennú, ak sami vložiť hodnotu tam, kto
vie, čo tam je.
Mohlo by to byť nejaký náhodný sled bitov z predchádzajúceho prevedenia.
Takže keď som v mojom kóde do dostať reťazec, a potom uložiť návrat
hodnota v sekundách sa reťazec nejako -
A budeme nakoniec olúpte, ako dostať string práce, nejako prideľuje
Pole, ktoré pravdepodobne vyzerá niečo ako toto.
H-E-L-L-O, spätné lomítko nula.
>> Dajme tomu, že to je adresa 123 len prvý konzistencie.
Tak sa vráti reťazec, v zvýraznená linka tam, vráti
číslo sme si povedali, 123.
Takže to, čo sa naozaj deje vo vnútri je tu?
>> No, čo sa naozaj deje vnútri s 123..
Ale úprimne povedané, ja som už trochu zmätení z týchto adries,
všetky tieto ľubovoľných čísel.
123, 124, 127.
Takže poďme sa vlastne zjednodušenie svet trochu.
>> Keď hovoríme o ukazovatele, úprimne povedané, na nás, ľudí, ktorí sa sakra zaujíma, kde
veci sú v pamäti?
To je úplne ľubovoľné.
Bude to závisieť od toho, pamäte RAM má užívateľ.
To bude závisieť od toho, kedy v priebehu dňa spustenie programu, snáď, a
čo vstup používateľ vám dáva.
Sme obydlia na nedôležitých detailov.
>> Takže poďme abstraktné preč a hovoria, že, Pri spustení riadok kódu takhle,
char hviezda je dostane návrat hodnota get reťazca.
Prečo sa namiesto toho len kresliť to, čo sme držať volať ukazovateľ, ako by to
ukazuje na niečo?
Tak som teraz tvrdí, že je až je ukazovateľ -
pod kapotou je to adresa.
Ale je to len ukazuje na prvý bajt
Reťazec, ktorý bol vrátený.
>> Ak by som sa vrátiť do kódu tu čo sa deje na tejto linke?
No, v tomto zvýraznenou líniou teraz, Ja som vyhlásil vraj ďalší
premenná s názvom t
Ale je to tiež ukazovateľ, takže budem k tomu, ako to, teoreticky, presné
rovnakej veľkosti škatule.
A budem to nazývať t
>> A teraz, ak sa vrátime do kódu znova, keď uložím je vnútri t,
čo som technicky uvedenie vnútri t?
No technicky, to bolo číslo 123.
Takže naozaj by som mala písať číslo 123 tam.
Ale poďme to vyššiu úroveň.
t, ak je to len ukazovateľ, intuitívne, je práve to.
To je všetko, čo je sú v nich uložené.
>> Takže teraz v posledných zaujímavé linky kódu, keď som vlastne ísť o
zarábanie nulový znak v tonách, čo sa deje?
No, t držiak nula je teraz ukazuje s tým, čo postava, pravdepodobne?
>> Je to ukázal na hodiny.
Vzhľadom k tomu, t držiak nula -
spomínam, je to stará syntaxe. t držiak nula jednoducho znamená, že ak t je reťazec, t
Držiak nula znamená dostať nulu Znak v tejto sile.
Takže, čo to v skutočnosti znamená je ísť do tohto poľa -
a áno, môže to byť 123, to môže byť 124.
Ale je to všetko relatívne, pamätať.
Kedykoľvek hovoríme o maticu, máme tú výhodu, že hovorí o
relatívna indexy.
>> A tak sa teraz môžeme len predpokladať, že t držiak h je nula.
Takže keď zavolám 2 horné na to, čo to je naozaj robí, je zarábať
malá h na veľké písmená H. Ale samozrejme, čo je to?
Je to ukazuje na rovnaký zatratený reťazca.
>> Tak to je všetko, čo sa deje v tomto kóde tak ďaleko.
Takže to, čo je, potom implikácia?
Ako opraviť tieto dva problémy?
Ako môžeme porovnať so skutočnými reťazca?
>> No intuitívne, ako by idete o porovnávanie dvoch
struny pre skutočnej rovnosti?
>> Čo to znamená, keď dva reťazce sú rovnaké?
Samozrejme, že nie, že ich adresy rovnať v pamäti, pretože to je nízka
úrovni implementačnej detail.
Všetky znaky sú rovnaké.
Takže mi dovoľte navrhnúť, a dovoľte mi predstaviť vo verzii jedného z compare.c
tu, tak porovnať, 1.c.
>> Dovoľte mi navrhnúť, že sme ešte dostať ukazovateľ nazvaný s, a uložiť v ňom
vráti hodnotu get reťazca.
Poďme urobiť to isté s t.
Žiadna z kódu sa líši.
Chystám sa pridať trochu viac kontrolu chýb teraz.
Takže teraz, že sme niečo peeling späť tejto vrstvy v CS50, čo reťazec
vlastne je, musíme byť análny o tom, či sa nezneužívajú
neplatné hodnoty, ako je null.
>> Tak som len tak pre kontrolu.
Ak to nie je rovnaké nulu a t nie je rovná null, to znamená, že si v poriadku.
Získajte reťazec nemal pokaziť dostať jeden z týchto reťazcov.
A môžete si snáď, že teraz, čo nemá STR CMP pravdepodobne robiť?
String porovnanie.
>> Takže ak ste program v Jave skôr, Je to ako rovná metóde
Trieda String.
Ale pre tých z vás, ktorí nemajú naprogramované,
je to len funkcia c
Stáva sa to prísť súbor s názvom string.h.
To je miesto, kde je deklarovaná.
>> A reťazec porovnať -
Vlastne som zabudol jeho použitia, ale to nevadí.
Pripomeňme si, že môžeme urobiť muž, zamiešať porovnanie.
A to sa deje, aby sa Linux programátori manuálny.
A to je, úprimne povedané, trochu záhadný.
Ale vidím tu, že jo.
Musím zahrnúť string.h.
>> A tu sa píše v popise " string Funkcia compare porovná
dva reťazce S1 a S2. "a S1 a S2 sú zrejme dva
argumenty odovzdávané palcov
Nemám naozaj spomenúť, čo const je, ale teraz všimnúť -
a ste mohli vidieť to už pri ste používať manuálové stránky, ak sa
to všetko -
že znak hviezda je len synonymom povrázkom.
>> Tak to porovnáva dva reťazce S1 a S2, a vráti celé číslo menšie
ako alebo rovnajúcu sa alebo väčšia ako nula ak S1 sa nachádza, respektíve, aby sa
menšie ako, alebo zodpovedajú, alebo byť väčšia než S2.
To je len veľmi komplexný spôsob, ako hovoriť tento reťazec porovnať výnosy
nula, ak sú dva reťazce intuitívne identické znak pre
znak pre znak.
>> Vracia záporné číslo, ak s, abecedne, má
prísť pred t.
Alebo vracia kladné číslo, ak s má prísť po t
abecedne.
Takže s týmto jednoduchým funkciu, môže dôjsť môžete napríklad zoradiť
celá partia slová?
>> Takže v tejto novej verzii, budem ísť ďalej a robiť compare1.
Dot lomítko porovnať jeden.
Budem písať v ahoj vo všetkých malými písmenami.
Budem písať v ahoj vo všetkých malými písmenami znova.
A našťastie teraz si uvedomuje, Napísal som to isté.
>> Medzitým, keď som zadať ahoj v nižšej HELLO prípad a veľkými písmenami a
porovnať ich, som napísal rôzne veci.
Vzhľadom k tomu, sú nielen adresy odlišné, ale my sme nákupný
odlišné charaktery znova a znova.
>> Tak poďme na to a opraviť jednu iný problém teraz.
Dovoľte mi otvoriť verziu jeden z kopírovanie, ktoré teraz rieši
tento problém takto.
A toto bude vyzerať trochu zložitejšie.
Ale ak si myslíte, že o tom, čo problém, ktorý sme Potrebujete vyriešiť, dúfajme, že to bude
jasné, za chvíľu teraz.
>> Tak to prvý riadok, char začiatok t, v roku Laicky povedané niekto mohol navrhnúť
Čo táto linka tu znamená?
Char hviezda t, čo to robí?
>> Dobre.
Vytvorte ukazovateľ na niektoré miesto v pamäti.
A dovoľte mi upresniť to trochu.
Deklarujete premennú, ktorá bude ukladať Adresa niektorých char v pamäti, rovnako
byť trochu vhodnejšie.
>> OK, takže teraz na pravej strane, som nikdy nevidel jednu z týchto funkcií
pred, malloc.
Ale čo by to mohlo znamenať?
Pridelenie pamäte.
>> Tak to dopadá, až do teraz, máme sa naozaj mali účinný spôsob, ako
žiada operačný systém, daj mi nejaké pamäte.
Skôr máme teraz nazýva funkcia malloc, že ​​robí presne to.
Aj keď je to trochu rozptýlenie teraz, všimnite si, že v
medzi týmito dvoma zátvorkách len bude číslo.
Kde som napísal v otázke značky môžu byť číslo.
>> A toto číslo znamená, Daj mi 10 bajtov.
Dajte mi 20 bajtov.
Dajte mi 100 bajtov.
A malloc urobí všetko pre to, aby požiadať operačný systém -
Linux, v tomto prípade -
hej, sú ich 100 bajtov na dostupnej pamäte RAM?
Ak áno, vrátiť tieto bajty mi vrátenie adresu, ktorá z
tie bajtov, možná?
Úplne prvý.
>> Takže aj tu - a to je prevládajúcou v C, kedykoľvek budete
rokovania s adresami?
Tie takmer vždy riešenie Prvá taká adresa, bez ohľadu na to, aký veľký
kus pamäte, ktorú je odovzdaný späť, aby som tak povedal.
>> Takže poďme sa ponoriť tu.
Snažím sa prideliť ako veľa bajtov, presne?
No.
Dĺžka reťazca s - poďme to konkrétny príklad.
Ak je s ahoj, H-E-L-L-O, čo je dĺžka reťazca s, samozrejme?
Takže je to päť.
Ale robím plus 1 na to, prečo?
Prečo chcem šesť bajtov miesto piatich?
Znak null.
>> Nechcem odísť z tohoto špeciálny znak null.
Pretože keď urobím kópiu Dobrý večer a len to H-E-L-L-O, ale nemyslím si, dať
že osobitný charakter, počítač nemusí mať, náhodou, spätné lomítko
nulu tam na mňa.
A tak keď sa snažím prísť na to, Dĺžka kópie, môže si myslím, že
je to 20 znakov, alebo milión znakov keby som sa nikdy nestane
zasiahnuť spätné lomítko nula.
>> Takže musíme šesť bajtov pre uloženie H-E-L-L-O, spätné lomítko nula.
A potom je to len byť super análny.
Dajme tomu, že som zabudol, čo veľkosť char je.
Sme stále hovoríš, že je to jeden bajt.
A to zvyčajne je.
Teoreticky by to mohlo byť niečo inak, v inom Mac alebo
iný PC.
>> Tak to dopadá, že je tento operátor volal sizeof, že ak omdliete to na
Názov dátového typu - ako char alebo int, float alebo -
to vám povie, dynamicky, koľko bajtov char zaberá na túto tému
konkrétny počítač.
>> Tak to je v podstate len ako hovoriť krát 1 alebo
Časy vôbec nič.
Ale ja to robím len byť super anál, len v prípade, že sa líši char
počítača proti bane, týmto spôsobom matematika je vždy vyskúšať.
>> Konečne, tu som skontrolovať null, čo je vždy dobré praxe - opäť
Kedykoľvek máme čo do činenia s ukazovateľmi.
Ak malloc nebol schopný dať ma, že šesť byes - čo je
nepravdepodobné, ale len v prípade, že -
vrátiť jednu okamžite.
A teraz, choďte do toho a kopírovanie reťazec nasledovne.
A to je známa syntaxe, aj keď v inej úlohe.
>> Chystám sa ísť dopredu a dostať reťazec Dĺžka s a uložte ho na n
Ja potom bude prechádzať zo i rovná nulu až do a vrátane N,
väčší alebo rovné.
Takže pri každom opakovaní, dal som i-tý znak s-tej
charakter t.
>> Takže to, čo sa naozaj deje pod kapucňa tu?
No, ak to, napríklad, je s -
a ja som napísal v slove H-E-L-L-O a tam je spätné lomítko nula.
A opäť, to je s polohovacie tu.
A tu je t
>> A to sa ukazuje teraz kópie pamäti, že jo?
Malloc mi dala celý kus pamäte.
Neviem, čo je spočiatku v každom z týchto umiestnení.
Takže budem myslieť na to, ako celá partia otázniky.
>> Ale akonáhle začnem opakovanie od nuly na hore cez dĺžku S, T
držiak nuly a t držiak 1 -
a ja dám teraz na strope -
t držiak nuly a držiak s nulovou strednou že budem sa kopírovanie
opakované h tu, E-L-L-O. Navyše, pretože som robil plus
1, spätné lomítko nula.
>> Takže teraz v prípade Porovnanie 1.C, Nakoniec, keď som vytlačiť
kapitalizácie t, mali by sme vidieť, že to sa nemení.
Nechaj ma ísť dopredu a hneď na to.
Tak, aby Copy1.
Dot lomítko Copy1.
Budem písať v ahoj, Enter.
A teraz nevšimol, iba kópie bolo aktivované.
Pretože som naozaj majú dva kusy pamäti.
>> Bohužiaľ, môžete to urobiť pekne zlé a celkom nebezpečné veci tu.
Dovoľte mi vytiahnuť príklad tu, že nám dáva príklad niekoľkých
odriadkovaním.
Takže len intuitívne tu, prvý riadok kódu, int x hviezda, prehlasuje,
premennú s názvom x.
A čo je to dátový typ tejto premennej?
Čo je to dátový typ tejto premennej?
To nebolo Cliffhanger.
>> Dátový typ int je hviezda.
Takže čo to znamená? x bude uložiť adresu int.
Jednoduché, ako to.
Y sa bude ukladať adresa int.
Čo je na treťom riadku kódu tam robí?
Je to rozdelenie, koľko bytov, s najväčšou pravdepodobnosťou?
Štyri.
Vzhľadom k veľkosti int je spravidla štyri, malloc štyri dáva
mi adresu na kus pamäť, ktorého prvé bajtov
uložené teraz v x.
>> Teraz ideme trochu rýchlo.
Hviezdne x znamená čo?
To znamená prejsť na túto adresu a dal to číslo tam?
Dal číslo 42 tam.
Hviezda y znamená ísť do toho, čo je v y a dal číslo 13 tam.
>> Ale počkajte chvíľku.
To, čo je v súčasnej dobe v y?
Čo je adresa y skladovanie?
Nevieme, že jo?
Nikdy sme raz použiť priradenie Prevádzkovateľ zahŕňajúce y.
Tak y, ako je deklarované na druhom riadku Kód je len nejaký odpad hodnota, veľký
otáznik, aby som tak povedal.
Mohlo by sa ukazovať náhodne na niečo v pamäti, čo
je všeobecne zlé.
>> Takže akonáhle sa dostaneme tento riadok tam, hviezda y sa rovná 13, niečo zlé,
niečo veľmi zlé sa chystá stáť, aby Binky.
Takže poďme sa pozrieť, čo sa chystá skončiť Binky deje tu v tejto minúte
alebo tak vyzerajú.
>> [PLAYBACK]
>> -Hej, Binky.
Prebuďte sa.
Je čas na ukazovateľ zábavu.
>> -Čo je to?
Informácie o ukazovateli?
Oh, cukrovinka.
>> No, ako začať, myslím, že sme bude potrebovať pár rád.
>> -OK.
Kód prideľuje dva ukazovatele , Ktoré môžu ukazovať na celé čísla.
>> -OK, dobre, vidím dva ukazovatele.
Ale nezdá sa, že sa ukázal na čokoľvek.
>> -Presne tak.
Spočiatku, ukazovatele nie sú poukazujú na čokoľvek.
Veci, ktoré poukazujú na to, sa nazývajú pointees a ich nastavenie je
samostatný krok.
>> -Oh, dobre, dobre.
Vedel som, že.
V pointees sú oddelené.
Tak ako sa vám prideliť pointee?
>> -OK.
No, tento kód prideľuje nové celých čísel pointee, a táto časť nastaví x
poukázať na to.
>> -Hej, to vyzerá lepšie.
Tak, aby to niečo urobiť.
>> -OK.
Budem dereferencia ukazovateľ x ukladať číslo 42 na jeho pointee.
Pre tento trik, budem potrebovať svoju mágiu palička dereferencing.
>> -Vaša kúzelná palička z dereferencing?
No, to je skvelé.
>> -To je to, čo kód vyzerá.
Budem stačí nastaviť číslo a -
>> -Hej, pozri.
Tam to ide.
Takže robí dereferencování na x takto šípka prístup k jeho pointee.
V tomto prípade, pre uloženie 42 tam.
Hele, skúste ho uložíte číslo 13 cez druhý ukazovateľ, y.
>> -OK.
Pôjdem sem pre y a sa číslo 13 nastaviť.
A potom sa prútik dereferencing a len -
whoa!
>> -Oh, hej.
To nefungovalo.
Povedzme, Binky, ja si nemyslím, že dereferencing y je to dobrý nápad,
pretože nastavenia pointee je v samostatnom kroku.
A nemyslím si, že sme kedy urobili.
>> -Hmm.
Dobrý postreh.
>> -Jo, pridelené ukazovateľ y.
Ale my sme nikdy nastaviť tak, aby poukazujú na pointee.
>> -Hmm.
Veľmi pozorný.
>> -Hej, vy hľadáte tam dobre, Binky.
Môžete opraviť tak, že y body na rovnakej pointee ako X?
>> -Jasne.
Budem používať svoju kúzelnú paličku ukazovateľ úloha.
>> , Je, že bude problém ako predtým?
>> -No.
Tento nedotýkala pointees.
Je to len jeden ukazovateľ zmení na bod na to isté ako ďalší.
>> -Oh, chápem.
Teraz y poukazuje na rovnakom mieste ako x.
Tak počkať.
Teraz y je pevná.
Má pointee.
Takže si môžete vyskúšať prútik z dereferencing znova
poslať cez 13.
>> -OK.
Tu to je.
>> -Hej, pozri na to.
Teraz dereferencing práce na y.
A pretože ukazovatele sú zdieľanie že jeden pointee, že
ako vidieť 13.
>> -Jo.
Zdieľanie.
To je fuk.
Takže ideme vymení teraz?
>> -Oh, pozri.
Sme mimo čas.
>> -Ale -
>> -Len si spomeňte na tri ukazovateľ pravidlá.
Po prvé, základná štruktúra je, že máte ukazovateľ.
A poukazuje na na pointee.
Ale ukazovateľ a pointee sú oddelené.
A Častou chybou je, aby nastaviť ukazovateľ, ale
zabudol daný pointee.
>> Číslo dva, ukazovateľ dereferencing začína u ukazovateľa a nasleduje jeho
Šípka nad prístup k jeho pointee.
Ako všetci vieme, to funguje iba v prípade, že je pointee, ktorá sa dostane späť do
Pravidlo číslo jedna.
>> Číslo tri, ukazovateľ postúpením jeden ukazovateľ a zmeny, upozorniť na
rovnako ako ďalšie ukazovateľ pointee.
Takže po zadaní, dva ukazovatele budú
o ten istý pointee.
Niekedy sa hovorí, že zdieľanie.
A to je všetko, tam je to, naozaj.
Bye bye teraz.
>> [END PLAYBACK]
>> DAVID Malan: Takže viac na ukazovateli, viac na Binky budúci týždeň.
Uvidíme sa v pondelok.