>> [Muusika mängib]
>> [Video taasesitus]
>> -Ta Valetab.
>> -Millest?
>> Ma ei tea.
>> -Nii, Mida me teame?
>> -See 9.15 järele, Ray Santoya oli ATM.
Jah.
Seega on küsimus selles, mida oli ta teinud on 9:16?
>> -Shooting 9 millimeetri midagi.
Võib-olla ta nägi snaiper.
>> -or Töötas koos temaga.
>> Oota.
Mine tagasi ühe.
>> -Mida sa näed?
>> -Bring Tema nägu üles täisekraanil.
>> -Tema Prille.
>> -On See peegeldus.
>> -See On Nuevitas pesapalli meeskond.
See on nende logo.
>> -Ja Ta räägib Kes kannab selle jope.
>> [Taasesituse lõpetamiseks]
>> DAVID Humala: Okei.
See on CS50 ja see on natuke rohkem on [kuuldamatu], millega sa oled
espalla probleem seatud neli.
Täna hakkame vaatama natuke rohkem sügavalt neid asju nimetatakse suunanäitajaks,
mis, kuigi see on päris kauge teema,
Selgub, et see läheb olema vahendid, mille me
võib alustada hoone ja kokkupanek palju keerukam programme.
Aga me tegime seda eelmisel kolmapäeval teel mõned claymation esimene.
Nii et see, meenutavad, on Binky ja me kasutasime teda
võtta pilk programm, mis tegelikult ei tee midagi huvitavat,
kuid ta tegi paljastada mõningaid probleeme.
Nii algab täna, miks me ei kõnni kiiresti läbi mõned neist sammudest,
proovida ajama inimese mõttes täpselt, mis toimub siin
ja miks see on halb, ja seejärel liikuda ja tegelikult alustada hoone midagi
seda tehnikat?
Nii et need olid esimesed kaks rida selles programmis
ja üldarusaadavat mõttes, mida on need kaks rida läheb?
Keegi, kes on piisavalt mugav mida on deklareeritud ekraanil?
Mis on need kaks rida läheb?
See pole veel kõik, mis erineb nädal üks,
kuid seal on mõned uued eriline sümbol.
Jah?
Tagasi olemas.
>> Sihtrühm: deklareerimine viiteid?
DAVID Humala: Ütle uuesti?
Sihtrühm: deklareerimine viiteid?
DAVID Humala: deklareerimine viiteid ja olgem viimistleda natuke rohkem.
Sihtrühm: [kuuldamatu] aadress x ja siis y.
DAVID Humala: Ja siis tegeleda.
Nii konkreetselt, mida me teeme on meie kuulutatakse kahe muutuja.
Need muutujad, aga ei kavatse tüübiks int täht, mis
täpsemalt tähendab nad ei kavatse hoida
aadressi int, vastavalt x ja y.
Nüüd on olemas väärtused?
Kas on olemas tegelik aadressid nendes Kahe muutuja on sel hetkel?
Ei.
See on lihtsalt nn prügi väärtusi.
Kui sul ei ole tegelikult määrata muutuja, mis iganes oli RAM
Varem läheb täita nullidega ja need mõlemad need muutujad.
Aga me ei tea veel mida nad on ja mis on
saab olema võti, miks Binky kaotas pea eelmisel nädalal.
>> Nii et see oli claymation kehastus selles
millega sa pead lihtsalt kahe muutuja, väike ümmargune tükki savi,
mida saab salvestada muutujad, kuid kuna Pakitud ülesnoolega näitavad,
nad tegelikult ei juhtides kõikjal tuntud.
Siis pidime selle rea, ja seda oli uus eelmisel nädalal, malloc mälu
jaotamist, mis on lihtsalt fancy viis ütlen operatsioonisüsteem, Linux
või Mac OS või Windows, hei, anna mulle mällu,
ja kõik mida sa pead ütlema operatsioonisüsteemi
mida küsides seda mälu.
Ta ei kavatse huvita, mida sa lähed teha seda,
aga sa ei pea ütlema operatsioonisüsteemi süsteem, mida teel malloc.
Jah?
>> Sihtrühm: Kui palju?
DAVID Humala: Kui palju?
Kui palju baite ja nii see jällegi kunstlik Näiteks on lihtsalt öeldes,
mulle suurust int.
Nüüd suurust int on nelja baiti ehk 32 bitti.
Nii et see on lihtsalt viis öeldes, hei, operatsioonisüsteemi,
mulle neli baiti mälu et ma saan kasutada minu käsutuses,
ja konkreetselt, mida ei malloc tagastamise osas
Selle tüki neli baiti?
Sihtrühm: Aadress?
DAVID Humala: aadress.
Aadress, et patakas neli baiti.
Täpselt.
Ja nii see on, mida on salvestatud lõpuks x ja see on põhjus, miks me tegelikult ei
huvita, mida arv, mis aadress on, kas see on ox1 või OX2
või mõne segasena kuueteistkümnendsüsteemis aadress.
Me lihtsalt hoolitseda piltlikult et selle muutuja x on nüüd
osutades, et patakas mälu.
Nii nool näitab osuti või täpsemalt mälu aadress.
Aga jälle, me tavaliselt ei huvita millised need tegelikud aadressid.
Nüüd, see rida ütleb Mis üldarusaadavat mõttes?
Star x saab 42 semikooloniga.
Mida see tähendab?
Tahad minna?
Ärge kraapige oma kaela.
>> Sihtrühm: aadress x on kell 42.
>> DAVID Humala: aadress x on 42.
Mitte päris.
Nii lähedal, kuid mitte päris, sest seal on täht, mis on prefixing see x.
Seega on meil vaja kohendada natuke.
Jah?
>> Sihtrühm: väärtus, et pointer x osutades on 42.
DAVID Humala: OK.
Väärtus, et osuti x on osutades, oletame, peab olema 42,
või teisisõnu täht x ütleb, minna ükskõik aadress
on x, kas see on 1 Oxford Street või 33 Oxford Street
või ox1 või ox33, olenemata et numbriline aadress on
star x on dereferencing x.
Nii et minge sellele aadressile ja siis pane number 42 sinna.
Nii et oleks samaväärne viis öelda, et.
Nii et kõik on hästi ja siis me kujutaks pilt
järgmiselt kus oleme lisanud 42 selle tüki neli
baiti paremas servas, kuid Selle liini kus asjad läksid viltu
ja Binky pea lõhki lüüa ära sel hetkel,
sest halvad asjad juhtuvad, kui sa apparent prügi väärtused
või sa apparent kehtetuks suunanäitajaks, ja ma ütlen kehtetuks
sest sel hetkel Lugu, mis on seestpoolt y?
Mis väärtus y põhineb mineviku mõne sammu?
Jah?
Mis see on?
>> Sihtrühm: aadressi.
DAVID Humala: aadressi.
Peaks olema aadress aga ma olen tuleb kõigepealt?
Nii et ma ei ole veel.
Mis on teadaolevalt seal?
See on lihtsalt mõned prügi väärtus.
See võib olla ka muu aadress nullist 2 miljardit, kui teil on kaks kontserti RAM,
või null 4 miljardi, kui olete sai neli gigabaiti muutmälu.
See on mõned prügi väärtus, kuid probleem on
et operatsioonisüsteem, kui ta ei ole andnud teile
et patakas mälu spetsiaalselt et sa üritad minna,
see on tavaliselt läheb põhjustada, mida oleme näinud ka killustatust süü.
Nii et tegelikult keegi teist, kes on võitlesid probleeme tööaega
või probleeme, mis on rohkem üldiselt püüdnud aru saada,
laevastikuosi süü, mis tähendab üldiselt
Sa puudutad segment mälu, et sa ei peaks olema.
Sa puudutad mälu operatsioonisüsteem ei ole
Lubatud sa puudutada, kas see on minnes liiga kaugele oma valikut
või algavad nüüd, kas sellepärast sa puudutades
mälu, et lihtsalt on mõned prügi väärtus.
>> Seejuures star x siin omamoodi määratlemata käitumine.
Te ei tohiks kunagi teha, sest koefitsiendid on programm lihtsalt läheb krahhi,
sest sa räägid, minge sellele aadressile
ja sa ei tea, kus sellele aadressile tegelikult on.
Nii operatsioonisüsteem on tõenäoliselt läheb krahhi programmi
tulemusena ja tõepoolest, see on Mis seal juhtus, et Binky.
Nii lõpuks Binky fikseeritud Selle probleemi sellega.
Nii et programm ise oli ekslik.
Aga kui sa mingi pürgida ja täidab selle joone asemel,
y võrdub x tähendab lihtsalt iganes aadress on x, samuti pane see y.
>> Ja nii piltlikult oleme esindatud see kahe noolega
alates x ja y juhtides samas kohas.
Nii semantiliselt, x on võrdne y, sest need mõlemad
ladustamiseks sama aadress, ergo osutades 42,
ja nüüd, kui sa ütled täht y, minge aadressile y,
Selle on huvitav kõrvaltoime.
Nii aadress y on sama asi nagu aadress x.
Nii et kui sa ütled minna aadressile y ja väärtust muuta kuni 13,
kes veel mõjutab?
X on punkti D, nii et rääkida, peaks samuti olla mõjutatud.
>> Ja tõepoolest, kuidas Nick juhtis seda pilti in claymation oli just nii.
Kuigi me järgime pointer y, oleme jõudnud samasse kohta,
ja nii kui me printida välja x või y pointee,
siis me näeksime väärtus 13.
Nüüd, ma ütlen pointee olla kooskõlas video.
Programmeerijad, et minu teadmised, tegelikult kunagi
öelda sõna pointee, seda, mis on terava
kell, kuid järjepidevuse videoga, mõistad
see on kõik, mis oli tähendas, et olukord.
Nii lisaküsimusi claymation või viiteid või malloc lihtsalt veel?
No?
Hästi.
>> Nii edasise jututa, võtame pilk
kell, kus see on tegelikult on mõnda aega kasutatud.
Nii et me oleme olnud selles CS50 raamatukogu et ju kõik need funktsioonid.
Oleme kasutanud GetInt palju, getString, ilmselt GetLongLong varem
minu pset ühe või nii, kuid mis tegelikult kestnud?
Noh, olgem võtta Kiire pilk all kapuuts on programm, mis
inspireerib miks me anname teile CS50 raamatukogu ja tõepoolest, nagu eelmisel nädalal,
meil hakkasid need abirattad maha.
Nii et see on nüüd järjestatud ja Surmajärgne mida
on kestnud sees CS50 raamatukogu
kuigi nüüd hakkab liikuma eemale enamiku programmide.
>> Nii et see on programm nimega scanf 0.
See on super lühike.
See lihtsalt on need read, kuid see tutvustab funktsioon nimega scanf
et me tegelikult näeme in hetkel sees CS50 raamatukogu
ent veidi teistsuguses vormis.
Nii et see programm on line 16 deklareerib muutuja x.
Nii et anna mulle neli baiti int.
See on rääkinud kasutaja, number palun, ja seejärel
see on huvitav joon, mis tegelikult seob kokku eelmisel nädalal
ja see.
Scanf ja siis märkate kulub stringi, nagu printf,
% i tähendab int ja seejärel kulub Teine argument, mis tundub veidi
funky.
See on ampersand x, ja meenutada, me ainult nägin seda, kui eelmisel nädalal.
Mida ampersand x esindavad?
Mida ampersand teha C?
Jah?
>> Sihtrühm: aadress.
DAVID Humala: aadress.
Nii et see on vastupidine Tähe operaator,
samas tähe operaator ütleb, minna Selle aadressi, ampersand operaator
ütleb, nuputada aadress muutuja,
ja nii on see võti, sest scanf on elu mõte
on skaneerida kasutaja sisend klaviatuurilt,
sõltuvalt iganes ta tüüpi, ja siis lugesin, et kasutaja sisend
muutujaks, kuid me nägin viimase kahe nädala jooksul
et see swap funktsiooni, et me Üritasin vaevata rakendada
oli lihtsalt katki.
Tuletame meelde, et swap funktsiooni, kui me lihtsalt deklareeritud A- ja B-ints,
Me ei edukalt vahetada Kahe muutuja sees swap
Just nagu piim ja talitus, kuid niipea, kui swap tagasi,
milline oli tulemus seoses to x ja y, esialgseid väärtusi?
Mitte midagi.
Jah.
Midagi ei juhtunud, et aeg, sest vahetustehingute muuta ainult oma kohalikku koopiat,
mis tähendab, kes kõik Sel ajal, kui me olen
on liikuvate argumendid funktsioonidele, me oleme
sõidame koopiad neile argumentidele.
Võite teha, et mida iganes sa tahad nendega,
aga nad ei kavatse ei ole mõju algväärtused.
Nii et see on problemaatiline, kui teil tahad olla funktsioon nagu scanf
elus, mille eesmärk on otsida kasutaja sisend klaviatuurilt
ja siis täitke lüngad, nii et räägivad, et on, anda muutuva nagu x
väärtus, sest kui ma oleksin lihtsalt mööda x scanf,
kui teie arvates loogika viimase nädalas, scanf saab teha mida iganes ta tahab
koopia x, kuid see ei suutnud jäädavalt muuta x, kui me ei anna
scanf aare kaart, nii et rääkida, kus x tähistab kohapeal, kusjuures
võtame in aadress x nii, et scanf saa sinna minna ja tegelikult muutus
väärtuse x.
Ja nii tõepoolest kõik et see programm ei
kui ma teen scanf 0, minu allikas 5m kataloog, teha scanf 0,
dot kaldkriips scanf, number palun 50, aitäh 50.
>> Nii see ei ole kõik, et huvitav, Aga mis on tegelikult toimub
on see, et niipea, kui ma nimetan scanf siin, väärtus x
on jäädavalt muutunud.
Nüüd tundub, et see kena ja hea, ja tegelikult see
Tundub, nagu me tegelikult ei vaja CS50 raamatukogu üldse enam.
Näiteks oletame, joosta see veel kord siin.
Lubage mul uuesti avada teist.
Proovime mitmeid palun ja selle asemel, et öelda 50 nagu enne,
Ütleme ole.
OK, see on natuke imelik.
OKEI.
Ja just mõned jama siin.
Seega ei tundu hakkama ekslik olukordades.
Seega peame minimaalselt algus lisades mõned Tõrkekontroll
veenduda, et kasutaja on sisestatud tegelik number nagu 50,
sest ilmselt kirjutades sõnad ei avastatud problemaatiline,
kuid ilmselt peaks olema.
>> Vaatame seda versiooni nüüd, et minu katse implementeerid getString.
Kui scanf on see kõik funktsionaalsust ehitatud,
miks on meil olnud espalla nende Apupyörät nagu getString?
Noh, siin on ehk oma Lihtne versioon getString
kusjuures nädal tagasi, ma oleks võinud öelda, mulle string ja nimetavad seda puhverdada.
Täna ma hakkan lihtsalt öeldes char täht, mis meenutavad,
see on lihtsalt sünonüüm.
Tundub scarier kuid see on täpselt sama asi.
Nii et anna mulle muutuja nimega puhver et läheb salvestada string,
rääkige kasutaja string palun, ja siis, nagu enne,
Proovime seda laenata õppetund scanf % s sel ajal ja siis edasi puhvris.
Nüüd, kiire meelerahu kontrolli.
Miks ma ei ütle, ampersand puhver seekord?
Järeldada eelmises näites.
Sihtrühm: Char täht on osuti.
DAVID Humala: Täpselt, sest seekord paalia
star on juba osuti, aadressi, määratluse kohta, et täht on seal.
Ja kui scanf ootab aadress, piisab lihtsalt läbida puhvris.
Ma ei pea ütlema ampersand puhvri.
Sest uudishimulik, siis võiks midagi sellist.
See oleks erinev tähendus.
See annaks sulle pointer kuni osuti, mis on tegelikult
kehtiv asi C, kuid Nüüd saab hoida lihtsa
ja hoida lugu järjekindel.
Ma lihtsalt läbida puhver ja see on õige.
Probleem aga on selles.
Lubage mul minna ja teha selle programmi pärast kompileerimisel.
Tee scanf 1.
Kurat, minu koostaja püüdmine minu viga.
Anna mulle üks sekund.
Rõkkama.
Oletame scanf-1.c.
OKEI.
Seal me läheme.
Ma vajan seda.
CS50 ID on erinevad seadistusi
et sind kaitsta ennast.
Mul oli vaja keelata neid poolt töötab rõkkama käsitsi seekord.
Nii string palun.
Ma lähen edasi minna ja kirjutada minu lemmik hello world.
OK, null.
See ei ole see, mida ma kirjutada.
Nii et see on soovituslik midagi on valesti.
Lubage mul minna ja kirjuta on tõesti pikk jada.
Täname null ja ma ei tea, kui ma lähen, et oleks võimalik murdma.
Proovime veidi koopia pasta ja vaata, kas see aitab.
Just kleebi palju seda.
See on kindlasti suurem string kui tavaliselt.
Lihtsalt tõesti kirjutada.
Ei.
Pagan võtaks.
Käsi ei leitud.
Nii et see ei ole seotud.
Seda sellepärast, et ma kleebitud halbu tähemärki
kuid see osutub ei hakka tööle.
>> Proovime veelkord, sest see on lõbusam kui me tegelikult murdma.
Olgem tüüp seda ja nüüd, ma olen läheb kopeerida tõesti pikk string
ja nüüd vaatame, kas me võib krahhi see asi.
Pange tähele, ma jätta ruumid ja uued liinid ja semikoolonid
ja kõik funky tähemärki.
Sisesta.
Ja nüüd võrgu lihtsalt on aeglane.
Ma hoitakse Command-V liiga pikk, selgelt.
Pagan võtaks!
Käsi ei leitud.
>> OKEI.
Noh, asi on siiski järgmist.
Mis siis tegelikult toimub kohta käesoleva avaldusega
Söe star puhver real 16?
Mida ma saan kui ma kuulutada osuti?
Kõik Saan on neli baiti väärtus nimetatakse puhver, kuid mis on sees see
hetkel?
See on lihtsalt mõned prügi väärtus.
Sest iga kord, kui kuulutada muutuja C, see on lihtsalt mõned prügi väärtus,
ja me hakanud komistada see reaalsus.
Nüüd, kui ma ütlen scanf, minge sellele aadressile
ja pane olenemata kasutaja liigid.
Kui kasutaja liigid hello maailma, noh, kus ma pane see?
Puhver on prügi väärtus.
>> Nii et see on selline nagu nool mis on suunatud kes teab kus.
Võib-olla see osutavad siinsamas minu mälu.
Ja nii, kui kasutaja liigid hello world,
programm püüab panna string hello world kurakriips 0
et patakas mälu.
Aga suure tõenäosusega, kuid ilmselgelt ei ole 100% tõenäosusega,
arvuti läheb siis krahhi Programmi kuna tegemist ei ole
mälu ma peaks tohi puudutada.
Lühidalt öeldes on see programm vigane täpselt sel põhjusel.
Ma põhimõtteliselt ei tee seda, mida?
Milliseid samme on mul jätta, nagu me jätta koos Binky esimene näide?
Jah?
>> Sihtrühm: Memory eraldamise?
>> DAVID Humala: Memory jaotamine.
Ma ei ole tegelikult eraldatud mis tahes mälu, et string.
Nii saame parandada seda paar võimalust.
Üks, suudame hoida seda lihtne ja tegelikult, nüüd sa oled
hakkan nägema ähmastumine read vahel, mida
massiivi on, mida string on, mida char täht, mida array tähemärki
on.
Siin on üks näide kaasates stringid ja teate
ma olen teinud on line 16 on, selle asemel, et öelda
et puhver saab olema char star, kursor patakas mälu
Ma väga ennetavalt anda mina puhver 16 märki,
ja tegelikult, kui te olete juba tuttav mõistega puhverdusvõime,
arvatavasti maailma videos, Kui video on puhverdusvõime, puhverdamine,
puhverdusvõime.
Noh, mis on seotud siin?
Noh, Inside of YouTube ja seest video mängijad
üldiselt on massiiv see on suurem kui 16.
See võib olla hulgaliselt suurus ühe megabaidi, võibolla 10 megabaiti,
ja sellesse massiivi teeb oma brauseri lae alla terve hunnik baiti,
terve hunnik MB video ja video mängija,
YouTube'i või kes on, hakkab Lugedes baitide et massiiv,
ja iga kord, kui näete Sõna puhverdusvõime, puhverdamine,
see tähendab, et mängija peab saanud lõpuks, et massiivi.
Võrk on nii aeglane, et see ei ole uuesti täita massiivi rohkem baiti
ja et sa oled out of bits kuvada kasutajale.
>> Nii puhver on apt terminit siin, et see on lihtsalt massiivi, patakas mälu.
Ja see parandada sest selgub,
mis saab ravida massiivid, nagu oleks nad on aadressid, kuigi puhvris
on lihtsalt sümbol, see on märgijada, puhver,
see on kasulik mulle, programmeerija, sa ei liigu oma nime ümber
nagu ta oli pointer, nagu ta
olid aadressi patakas mälu 16 tähemärki.
Nii et öelda, ma ei liigu scanf täpselt, et sõna
ja nii nüüd, kui ma teen seda programmi, teha scanf 2 dot kaldkriipsuga scanf 2,
ja kirjuta hello world, Sisesta, et AEG_
>> Hmm, mis juhtus?
String palun.
Mida ma valesti tegin?
Tere maailm, puhvri.
Tere, Maailm.
Ah, ma tean, mida ta teeb.
OKEI.
Seega loeb üles kuni esimese ruumi.
Nii saab petta hetkeks ja öelda tahtsin kirjutada midagi
tõesti kaua nagu see on pikk lause see on üks, kaks, kolm, neli, viis,
kuus, seitse, kaheksa, üheksa, 10, 11, 12, 13, 14, 15, 16.
OKEI.
See on tõesti pikk lause.
Nii et see lause on enam kui 16 tähemärki
ja nii kui ma Enter, Mis juhtub?
Noh, sel juhul on lugu, mul oli deklareeritud puhver
tegelikult on hulgaliselt 16 tähemärki valmis minema.
Nii üks, kaks, kolm, neli, viis, kuus, seitsme, kaheksa, üheksa, 10, 11, 12, 13, 14,
15, 16.
Nii 16 märki, ja nüüd, kui ma lugeda midagi sellist on pikk
lause, mida juhtub on et ma lähen lugema see on pikk
S-E-N-T-E-N-C-E, lause.
>> Nii et see on sihilikult halb asi, mis ma
hoida kirjalikult kaugemale piirid minu rida,
piiridest minu puhvri.
Ma võiks saada õnnelik ja programm hoiab töötab ja ei hooli,
kuid üldiselt, selle tõepoolest krahhi minu programm,
ja see on viga minu kood praegu astun
piiridest Selle massiivi, sest ma
ei tea, kas see on tingimata kukku
või kui ma lihtsalt hakka õnnelik.
Nii et see on problemaatiline, sest Sel juhul ei tundu töö
ja olgem kiusate saatus siin, kuigi IDE tundub talu üsna vähe
of--
>> Seal me läheme.
Lõpuks.
Nii et ma olen ainus, kes seda näeb.
Nii et ma lihtsalt pidin lõbus kirjutades välja tõesti pikk tegelik fraasi
et see kindlasti ületanud 16 baiti, sest ma
trükitud selles hull pikk mitmeliiniline lause ja siis pane tähele, mis juhtus.
Programm proovinud printimine ja siis sain killustatust süü
ja killustatust vead on kui midagi sellist juhtub
ja operatsioonisüsteemi ütleb Ei, ei puuduta see mälestus.
Me läheme tappa programmi kokku.
>> Nii et see tundub problemaatiline.
Olen parandanud programm, mille vähemalt mõned mälu
aga see tundub piirata funktsiooni getString saada
stringe mõned piiratud pikkusega 16.
Nii et kui sa tahad, et toetada enam lauseid kui 16 tähemärki,
mida sa teed?
Noh, saate suurendada mõõtmed selles puhvris kuni 32
või mis tundub selline lühike.
Miks me lihtsalt ei tee see 1000, kuid tagurdamise.
Mis on vastuseks intuitiivselt kohta lihtsalt seda probleemi vältida, muutes
minu puhver suurem, nagu 1000 tähemärki?
Rakendades getString sel viisil.
Mis on hea või halb siin?
Jah?
Sihtrühm: Kui te kel palju ruumi ja te ei kasuta seda,
siis ei saa ümber, et ruumi.
DAVID Humala: Absoluutselt.
See on mõttetu, sest kui sa seda ei tee tegelikult vaja 900 neist baiti
ja veel sa küsida 1000 kokku niikuinii,
sa oled lihtsalt tarbivad rohkem mälu kasutaja arvutisse kui teil on vaja,
ja lõppude lõpuks mõned oled juba kokku puutunud
elus, et kui sa oled töötab palju programme
ja nad söövad palju mälu, see võib tegelikult mõjutada tulemuslikkust
ja kasutaja kogemus arvuti.
Nii et selline laisk lahendus, kindlasti, ja vastupidi,
see ei ole ainult mõttetu, mida probleemi endiselt, isegi siis, kui ma oma puhver
1000?
Jah?
>> Sihtrühm: String pikkusega 1001.
DAVID Humala: Täpselt.
Kui teie string on pikkus 1001, sul on täpselt sama probleem,
ja minu argument, oleksin just siis oleks 2000
kuid sa ei tea edasi, kui suur see peaks olema,
ja veel, ma ei pea koostama oma programmi enne rendile inimesed kasutavad ja alla
seda.
Nii et see on täpselt selline värk, et CS50 raamatukogu üritab
aidata meil ja me ainult lühidalt mõningaid aluseks rakendamine
siin, kuid see on CS50 dot C. See on fail, mis on olnud CS50 IDE
kõik need nädalat, et olete kasutanud.
See on eelnevalt kompileeritud ja olete kasutanud seda automaatselt
olemuse põhjal, mille kriips L CS50 lipp rõkkama,
aga kui ma kerige läbi kõik neid funktsioone, siin on getString,
ja lihtsalt teile maitse, mis toimub,
Võtame pilgu suhteline keerukus.
See ei ole super pikk funktsiooni, kuid me ei
on mõelda kõik kõvasti kuidas minna saan stringid.
>> Nii et siin on minu puhver ja ma ilmselt initsialiseerida see tühjaks.
See muidugi on sama asi nagu char star,
aga ma otsustanud rakendamise CS50 raamatukogu
et kui me läheme täiesti dünaamiline,
Ma ei tea ette, kui suurt string kasutajad ei kavatse taha.
Nii et ma hakkan lihtsalt tühi string
ja ma lähen üles ehitada nii palju mälu nagu mul on vaja sobitada kasutaja string
ja kui mul ei ole piisavalt, ma küsin
Operatsioonisüsteem rohkem mälu.
Ma lähen liikuda oma string suuremasse patakas mälu
ja ma lähen vabastada või vabastada piisavalt suure tüki mälu
ja me lihtsalt läheb seda teha korduvalt.
>> Nii kiire pilgu, siin on lihtsalt muutuja
kellega ma lähen jälgida võimsuse minu puhvri.
Mitu baiti mahub?
Siin on muutuja n koos mis ma lähen hoida
jälgida, kui palju baite on tegelikult puhver või et kasutaja on trükitud.
Kui oled ei näinud seda enne, siis on võimalik määrata, et muutuv nagu int
on allkirjastamata, mis nagu nimigi ütleb, tähendab see mitte negatiivne, ja miks
Ma taha kunagi viitsinud täpsustatakse et int pole lihtsalt int,
aga see on allkirjastamata int?
See on mitte-negatiivne int.
Mida teeb [kuuldamatu] tähendab?
>> Sihtrühm: See kirjeldab summa mälu, mis võib olla [kuuldamatu].
>> DAVID Humala: Jah.
Nii et kui ma ütlen allkirjastamata, see on tegelikult annab teile üks natuke extra mälu
ja tundub selline rumal, kuid kui te üks natuke lisamälu, et
tähendab, et pead kaks korda rohkem väärtused saab esindada,
sest see võib olla 0 või 1.
Nii vaikimisi int võib laias laastus negatiivne 2 miljardit kogu tee
kuni positiivsete 2 miljardit.
Need on suured vahemikud, kuid see on ikka mingi mõttetu
kui te ainult hoolid suurused, mis lihtsalt intuitiivselt
peaks olema mitte-negatiivne või positiivne või 0, ka siis,
miks sa raiskad 2 miljardit võimalikud väärtused negatiivsed arvud
kui sa kunagi neid kasutada?
Nii öeldes allkirjastamata, nüüd on mu Int võib olla vahemikus 0 kuni umbes 4 miljardit.
>> Nii et siin on lihtsalt int C põhjustel me ei hakka just nagu
miks see int asemel on char, kuid siin on
põhisisu, mis toimub kohta, ning mõned teist
võivad olla kasutades, näiteks kui fgetc funktsiooni isegi pset neli
või pärast seda, siis me näeme seda jälle probleem määrata viis,
fgetc on tore, sest nagu nimigi selline, justkui arcanely ütleb,
see on funktsioon, mis saab iseloomu ja nii,
Mis põhimõtteliselt erinev mida me teeme getString
on meil parajasti ei kasuta scanf samamoodi.
Me lihtsalt hiiliva mööda samm-sammult üle olenemata kasutaja sisestatud,
sest meil on alati võimalik eraldada ühe char, ja nii saame alati turvaliselt
vaadata ühe char korraga, ja magic hakkab juhtuma siin.
Ma lähen keri Keset seda funktsiooni
lihtsalt tutvustada lühidalt selle funktsiooni.
Palju nagu seal on malloc funktsioon, seal on
RealLOC funktsioon, kus RealLOC võimaldab teil suunata patakas mälu
ja teha see suuremaks või väiksemaks.
Nii pikk lugu lühike ja laine mu käest täna,
tean, et see, mida getString teeb on see omamoodi
of võluväel kasvab või kahanemine puhvri kui kasutaja
tüüpi tema string.
>> Nii et kui kasutaja sisestab lühike string see kood
Ainult eraldab piisavalt mälu sobib stringi.
Kui kasutaja hoiab kirjutades nagu ma tegin seda jälle ja jälle
ja jälle hästi, kui puhver on esialgu see suur
ja programmi mõistab, et oota üks hetk, ma olen läbi ruumi,
see saab kahekordistada suurust puhvrit
ja seejärel kahekordistada puhver ja kood, mis kahekordistumine,
Kui me vaatame seda siin, see on lihtsalt see tark Sutkaus.
Sa ei pruugi näinud seda süntaksit Enne, aga kui sa ütled star võrdne,
see on sama asi nagu öeldes võimet korda 2.
Nii see lihtsalt hoiab kahekordistada suutlikkust puhvris
ja siis ütlen RealLOC anda ise, et palju mälu.
>> Nüüd, kui kõrvale, seal on ka teisi funktsioone siin
et me ei vaata ühtegi detail peale näidata GetInt,
Me kasutame getString in GetInt.
Me kontrollime, et see ei ole null, mis meenutavad,
on eriline väärtus, mis tähendab midagi läks valesti.
Oleme mälu.
Parem vaadake selle eest.
Ja me tagasi valvur väärtus.
Aga ma edasi lükata kuni kommentaaridega miks ja siis me kasutame seda nõbu scanf
nimetatakse sscanf ja selgub, et sscanf või string scanf,
võimaldab teil võtta pilk line, et kasutaja on sisestanud ja teile
analüüsida sisuliselt ja mida ma olen teeme siin räägin ma sscanf,
analüüsida olenemata kasutaja trükitud ja veenduge% i,
seal on täisarv, ja me ei sattuda täna täpselt, miks seal on ka
A% c siin, kuid lühikokkuvõte võimaldab meil avastada, kui kasutaja on sisestanud
midagi võltsi pärast arvu.
Nii seetõttu, et GetInt ja getString ütlen sulle uuesti proovida, uuesti, uuesti
Sellepärast, et kõik Selle koodiga oleme kirjutatud,
See on selline vaadates kasutaja sisend hoolitsedes see on täiesti numbriline
või see on tegelik ujuv Punkti väärtus vms,
sõltuvalt sellest, milline väärtus toimida te kasutate.
>> Whew.
OKEI.
See oli suutäie kuid siinkohal on
et põhjus oli meil need abirattad
on seetõttu madalaimal tasemel, seal on lihtsalt nii palju asju,
võib valesti minna, et me tahtsime ennetavalt tegelema
need asjad kindlasti ka esimesel nädalal klassi,
kuid nüüd pset neli ja pset viis ja kaugemale sa näed, et see on rohkem juurde
sa ka oled võimekam lahendada neid erinevaid probleeme
ise.
Iga küsimustele getString või GetInt?
Jah?
>> Sihtrühm: Miks sa kahekordistada suutlikkust puhvris
mitte ainult suureneb see täpne summa?
>> DAVID Humala: Hea küsimus.
Miks me kahekordistada võimsust puhvri vastandina
lihtsalt suureneb see Mõned püsiv väärtus?
See oli disaini otsuse.
Me lihtsalt otsustas, et kuna see kipub olla natuke kallim aja mõistlik küsida
operatsioonisüsteemi mälu, me ei
taha lõpuks sattumist Olukorras suur stringid
et Palusime OS uuesti ja uuesti
ja ikka ja jälle üksteise järel mälu.
Nii et me lihtsalt otsustas, mõnevõrra meelevaldselt kuid loodame, mõistlikult,
et sa tead, mida, olgem proovida saada enne ise
ja lihtsalt duubeldada seda nii, et meil minimiseerida korda
meil helistada malloc või RealLOC, kuid kokku kohtuotsus
helistada ilma teades mida kasutajad võiksid sisestada.
Mõlemad viisid võivad olla vaieldav.
Väidetavalt hea.
>> Võtame pilk mõned muud kõrvaltoimed mälu,
asju, mida saab valesti minna ja vahendid, mida saab
kasuta püüda selliseid vigu.
Selgub, te kõik, kuigi check50 ei öelnud sulle nii palju,
on kirjalikult lollakas koodi kuna nädalal üks,
isegi kui kõik check50 testid möödas, ja isegi siis, kui teie ja teie TF
on super kindel, et Sinu kood töötab nagu ette nähtud.
Sinu kood on vigane või ekslik, et te kõik,
kasutamisel CS50 raamatukogu on lekib mälu.
Sa oled palunud operatsioonisüsteemi mälu enamikus programmide
olete kirjutanud, kuid sa oled tegelikult ei antud tagasi.
Olete kutsutud getString ja GetInt ja GetFloat,
kuid getString, olete ei helistanud unGetString või Anna
String Tagasi vms, kuid me oleme näinud et getString ei mälu eraldada
teel malloc või selle funktsiooni RealLOC, mis on lihtsalt
väga sarnase sisuga, ja veel, me oleme olnud
küsib operatsioonisüsteemi mälu ja uuesti ja uuesti
kuid mitte kunagi anna seda tagasi.
>> Nüüd, kui kõrvale, selgub, et kui programm sulgub, kes kõik mälu
automaatselt vabastatud.
Nii see ei ole suur asi.
Ta ei kavatse murda IDE või aeglane asju ette,
aga kui programmid ei üldiselt lekkida mälu
ja nad töötavad juba pikka aega.
Kui sa oled kunagi näinud loll väike rannas palli Mac OS või liivakell
Windows kus see on selline aeglustub või mõelnud või mõtlemine
või lihtsalt tõesti hakkab aeglane indekseerimine,
on väga võimalik, et võiks olla tulemus Mälulekke.
Programmeerijad, kes kirjutas tarkvara te kasutate
küsida operatsioonisüsteemi mälu iga paari minuti, iga tund.
Aga kui sa oled töötab tarkvara, isegi kui see on
minimaalne arvuti mitu tundi või päeva lõpus,
võite küsida rohkem ja rohkem mälu ja tegelikult ei kasuta seda
ja nii oma kood võiks olla, või programmid võivad olla lekkivad mälu
ja kui hakkad lekkida mälu seal on vähem mälu teisi programme,
ja tagajärjeks on aeglane kõike ette.
>> Nüüd on see siiani üks kõige metsik programmid
siis on võimalused joosta CS50 niivõrd
kui selle väljund on isegi rohkem esoteeriline kui rõkkama on või teha või mõne käsu
line programme oleme kulgema enne, kuid õnneks põimitud oma toodangut
on mõned super kasulikke näpunäiteid, et on kasulik kas pset nelja
või kindlasti pset viis.
Nii valgrind on vahend mida saab kasutada otsima
mälu lekked oma programmi.
See on suhteliselt lihtne sõita.
Sa jooksed valgrind ja seejärel ka kuigi see on natuke paljusõnaline,
kriips kriips lekke kontrolli võrdub täis ja siis dot
kaldkriips ja oma programmi nime.
Nii valgrind siis käivitada oma programmi ja päris lõpus oma programmi
töötab, enne kui see sulgub ja annab teile teise kiire,
see saab analüüsida oma programmi, kui see on kestnud
ja öelda, sa lekkima mis tahes mälu ja veel parem,
sa puudutage mälu ei kuulu sulle?
See ei saagi kõike, kuid see on päris hea püüdmine enamik asju.
>> Nii et siin on näide minu jooksis Selles programmis, mille run valgrind,
kohta programmi nimega mälu, ja ma lähen
rõhutada read, mis on lõppkokkuvõttes meid huvitab.
Nii et isegi rohkem distractions et ma olen kustutatakse slide.
Aga olgem lihtsalt näha, mida see Programm on võimeline meile.
See on võimeline meile asju nagu vigane kirjutada suuruse 4.
Teisisõnu, kui te puudutage mälu spetsiaalselt 4 baiti mälu
et sa ei tohiks olla, valgrind võin öelda, et.
Vale kirjutada suuruse 4.
Sa puudutasid nelja baiti et sa ei tohiks olla.
Kus sa seda tegid?
See on ilu.
Mälu dot c line 21 on koht, kus sa silmamunad ja sellepärast on kasulik.
Sarnaselt GDB, see aitab juhtida teid tegelik viga.
>> Nüüd on see üks on natuke rohkem lobise, kui ei ole segane.
40 baiti 1 plokid on kindlasti kadunud kaotus rekord 1 1.
Mida see tähendab?
Noh, see lihtsalt tähendab, et sa palusid 40 baiti ja sa ei ole kunagi andnud selle tagasi.
Sa kutsusid malloc või siis nn GetString ja operatsioonisüsteemi
saatis sulle 40 baiti, kuid kunagi vabanenud või vabaneb selle mälu,
ja kui aus olla, siis pole kunagi näidata kuidas anda tagasi mälu.
Selgub, seal on super lihtne funktsioon nimega tasuta.
Võtab üks argument, asi tahad tasuta või tagasi anda,
kuid 40 baiti ilmselt Selles programmis
on kadunud real 20 mälu dot c.
>> Vaatame seda programmi.
See on super kasutu.
See ainult näitab, see konkreetne viga.
Võtame pilk.
Siin on peamine ja peamine, teate, kõned Funktsiooni nimetatakse f ja siis tagasi.
Nii ei ole sugugi nii huvitav.
Mida f teha?
Pange tähele, et ma ei viitsinud prototüüp.
Ma tahtsin hoida kood võimalikult väike.
Nii panin f eespool põhi- ja see on hea, kindlasti,
lühikese programmid nagu see.
Nii f ei tagasta midagi ja ei ei võta midagi, kuid see ei tee seda.
See kinnitab, meelega on Binky näiteks
osuti nimetatakse x, et läheb salvestada aadress int.
Nii et vasakul pool.
Inglise keeles, mis on parempoolne teed?
Igaüks?
Mis on selle teinud meie jaoks?
Jah?
>> Sihtrühm: [kuuldamatu] korda suurem int
mis on 10 korda suurem [kuuldamatu]
DAVID Humala: Hea ja andke mulle kokku.
Nii eraldada piisavalt ruumi 10 täisarvud või 10, mis on suurus int,
see on neli baiti, seega 10 korda 4 on 40, nii et paremal küljel, et ma olen
Märgitud on mulle 40 baiti ja Hoida aadressi esimene bait
arvesse x.
Ja nüüd viimaks, ja siin on, kus see programm on vigane, mis on
valesti line 21 põhineb loogika?
Mis sul viga on line 21?
Jah?
Sihtrühm: Sa ei saa indeksi x [kuuldamatu].
DAVID Humala: Jah.
Ma ei peaks indeksi x niimoodi.
Nii süntaktiliselt, see on OK.
Mis on tore on, palju nagu sina ravib nimi massiivi
nagu ta on osuti, sarnaselt saab ravida osuti, nagu oleks see
massiivi, ja nii ma ei süntaktiliselt öelda x sulg midagi, x sulg i,
kuid 10 on problemaatiline.
Miks?
>> Sihtrühm: Sest see ei ole sees.
>> DAVID Humala: See ei ole sees, et patakas mälu.
Mis on suurim väärtus ma peaks võimalik saavutada nendes nurksulgudes?
9, 0 kuni 9.
Kuna null indekseerimine.
Nii 0 kuni 9 oleks trahvi.
Bracket 10 ei ole hea ja aga meenutada küll, iga kord
Mulle tundub, et proovida teha CS50 IDE crash kirjutades fiktiivseid väärtusi,
see ei ole alati koostööd, ja tõesti, siis sageli
saada õnnelik lihtsalt sellepärast, operatsioonisüsteem ei
märgata, et sa kunagi nii veidi edasi mõned patakas mälu
sest sa jäid jooksul tehniliselt Sinu segment, kuid rohkem, et
ühes operatsioonisüsteemid klassi, ja nii midagi sellist
võib väga kergesti märkamata jääda.
Teie programm pole kunagi kukku järjekindlalt, kuid äkki kord aega.
>> Ja nii proovime valgrind Sellel, ja siin on
kus me saada ülekoormatud poolt väljund korraks.
Nii et mälu valgrind lekke kontrolli võrdub täispunktmaatriks kaldkriipsuga mälu.
Ja siin on põhjus, miks ma luban see uputama.
Siin on, mida valgrind, siin on, mida programmeerija, mõned aastad ago-
otsustasin, et see oleks hea mõte toodangu nägema.
Nii saab sellest aru.
Nii et kõik viis kohta vasakul pool mingit põhjust
on protsess ID programmi me lihtsalt joosta, kordumatu tunnus
programmi me lihtsalt jooksis.
Me kustutatakse et alates slaidi, kuid
on mõned kasulikku teavet siin.
>> Olgem kerida kuni ülaservas.
Siin, kus hakkasime.
Nii see ei ole kõik, et palju toodangut.
Siin on, et vigane kirjutada suurus 4 real 21.
Noh, mis oli line 21?
Line 21 oli täpselt seda ja see on mõistlik
et ma olen kehtivalt kirjalikult 4 baiti, sest ma olen
üritab panna see täisarv, mis võiks olla midagi,
see lihtsalt juhtub olema null, kuid ma üritan
pane see kohas mis ei kuulu mulle.
Lisaks siia, 40 baiti ühes klotsid on kindlasti kaotanud rekordiliselt 1.
Seda sellepärast, et kui ma kutsun malloc siin, ma ei ole kunagi tegelikult vaba mälu.
>> Niisiis, kuidas me saame parandada?
Lubage mul minna ja olla veidi turvalisem ja teha 9 sinna ja laske mul siin vabalt x.
See on uus funktsioon täna.
Kui ma nüüd uuesti, et mälu dot kaldkriipsuga Laseme valgrind seda uuesti,
maksimeerida oma aken ja vajuta Enter.
Nüüd, see on hea.
Nad matta hea uudis kõik selle toodangut.
Kõik hunnik plokid olid vabad.
Me tuleme tagasi, mida hunnik on, kuid lekked on võimalikud.
Nii et see on lihtsalt üks vahend oma tööriistakomplekt
millega saab hakkama leida nüüd viga niimoodi.
>> Aga vaatame, mis rohkem võib siin olla.
Olgem üleminek nüüd tegelikult probleemi lahendamisel.
Selle kõrvale, kui see leevendada natuke segadust või pinge,
see on nüüd naljakas.
Jah.
See on päris hea.
Kuna suunanäitajaks on aadressid ja aadressid
on üldiselt kombeks kirjutatud kuueteistkümnendsüsteemis.
Ha, ha, see on naljakas nüüd.
Igatahes, nii et vaatame nüüd tegelikult lahendada probleemi.
See on super, super madala seni,
ja me saame tegelikult teha kasulikke asju nende madala üksikasjad.
>> Nii me tutvustas paar nädalat tagasi mõiste massiivi.
Hulgaliselt oli tore, sest see on raske puhastada meie koodi
sest kui me tahtsime kirjutada Programm mitme õpilased
või mitu nime ja maja ja üliõpilaselamu ja kolledžid ja kõik see,
me võiks salvestada kõike rohkem puhtalt sees massiivi.
Aga ettepanek ühe negatiivsed massiivi siiani.
Isegi kui sa oled ei kannatanud seda ise programmis, vaid instinktiivselt,
Mis on halb umbes massiivi, ehk?
Kuulen murmurs.
Sihtrühm: See on raske suurust muuta.
DAVID Humala: See on raske suurust muuta.
Sa ei saa muuta suurust massiivi tegelikult iseenesest
C. Võite eraldab massiiv, liikuda kõike vana
uude ja nüüd on mõned ekstra ruumi,
kuid see ei meeldi keelt nagu Java või Python
või mõnel teisel keeles, mille mõned teist
Võib olla kursis, kus te lihtsalt hoida lisades asju
tüütuseni lõpuni massiivi.
Kui teil on hulgaliselt suurus 6, mis on selle suurus,
ja nii palju nagu idee varem võttes puhvrit teatav suurus,
sa pead vist väravast läbi millise suurusega sa tahad seda?
Kui sa vist liiga suur, sa raiskad ruumi.
Kui sa vist liiga väike, siis ei saa salvestada, et andmete puhul vähemalt
ilma palju rohkem tööd.
>> Nii et täna, tänu suunanäitajaks, saame alustada õmblemisega koos oma custom
andmestruktuurid ja Tegelikult siin on midagi
mis näeb natuke rohkem segasena esimesel pilgul,
aga see on see, mida me nimetame seotud nimekirja ja selle nimi selline esitatakse kokkuvõtlikult
seda.
See on nimekiri numbrid, või Sel juhul numbrite loendi,
kuid see võiks olla nimekirja midagi, aga see on omavahel ühendatud nii, nooled,
ja lihtsalt võtta vist mida tehnika
me läheme, et oleks võimalik õmblema kokku
omamoodi nagu popcorn niit, lingitud nimekirjad ristkülikud siin?
Selle arvu?
Mis on aluseks keele funktsioon?
>> Sihtrühm: Pointer.
>> DAVID Humala: Pointer.
Nii kõik need nooled näitab siin osuti või lihtsalt aadressi.
Nii teisisõnu, kui ma tahan salvestada numbrite loendi,
Ma ei saa lihtsalt salvestada see, kui ma tahan võime kasvada ja kahaneb
minu andmete struktuuri massiivi.
Nii et ma pean olema natuke rafineeritumalt,
aga märgata, et see pilt selline soovitab
et kui oled just vähe teemasid ühendades kõike koos,
Ilmselt ei ole nii raske teha ruumi vahele kaks nendest ristkülikud
või kaks neist sõlmed, kui hakkame kutsudes neid, pane uus sõlm,
ja siis mõned uut teemat, vaid kraavi kolm tipud kokku
esimene, viimane, ja teiselt et sa lihtsalt lisada keskel.
>> Ja tõepoolest seotud nimekirja, Erinevalt massiivi, on dünaamiline.
Ta võib kasvada ja see võib kahaneb ja sa ei
on teada, või hooli ette, kuidas palju andmeid sa lähed tuleb ladustamiseks,
Aga selgub, et me peame olema natuke ettevaatlik, kuidas rakendada seda.
Nii esimese Vaatleme, kuidas me ellu üks neist vähe ristkülikud.
See on lihtne rakendada int.
Sa lihtsalt öelda, int n ja seejärel sa saad 4 baiti int,
aga kuidas ma saan int, nimetame seda n, ja siis osuti, olgem kutsuvad seda edasi.
Võiksime nimetame neid asjad midagi tahame
aga mul on vaja kohandatud andmete struktuuri.
Jah?
>> Sihtrühm: Ampersand [kuuldamatu].
>> DAVID Humala: Nii ampersand me kasutame saada aadressile sõlme potentsiaalselt.
Aga me peame teise funktsioon C, et
mulle võime luua See komme ristkülik, see custom
varieeruv kui soovite, mälu.
PUBLIKU a struct.
DAVID Humala a struct.
Meenuta eelmisel nädalal tutvustasime struct, seda suhteliselt lihtne märksõna
mis võimaldab meil teha selliseid asju.
C ei tulnud andmebaasi struktuuri nimetatakse õpilane.
Kaasas int ja float ja char ja selline, kuid see ei tule koos õpilase,
kuid me saame luua õpilaste andmete tüübi, üliõpilane struktuuri, selle süntaks
siin.
Ja te näete seda ikka ja jälle.
Nii et ärge muretsege meeldejätmist märksõnu
aga märksõna, mis on oluline on lihtsalt sellest, et me ütlesime struct
ja siis me kutsusime ta õpilane ja sees õpilase oli nimi ja maja
või ühiselamus vms.
>> Ja nii nüüd täna teeme ettepaneku see.
Olen lisanud mõned sõnad, aga kui ma tahan rakendada seda ristkülik, mis on
sain nii int ja pointer, sa tead, mida ma olen
läheb kuulutada struct nimetatakse sõlme.
Ma olen ka sees on, ütled mis sõlme, see ristkülik, on int
ja me nimetame seda n ja tal on järgmisel osuti.
Ja see on natuke paljusõnaline, aga kui sa arvad,
nooled, mis olid pildil Hetk tagasi on, mida andmete tüübi?
Kui kõik need nooled on suunatud millist tüüpi andmestruktuuri?
See ei ole suunatud ainult int per se.
See osutab Kogu ristkülikukujuline asi
ja et ristkülikukujuline asi, me ütlesime, nimetatakse sõlme.
Ja nii me mingi pea rekursiivselt määratleda seda, nagu
et sõlm, ütleme, sisaldab int nimetatakse n
ja osuti nimetas tuleva ja tüüpi andmestruktuuri, mille
et osuti punktid on ilmselt saab olema struct node.
>> Nii et see on tüütult paljusõnaline ja lihtsalt olla pedantne,
põhjus, miks me ei saa lihtsalt öelda seda, mis ausalt öeldes
tundub palju loetavamaks seetõttu, meenutavad, et C lugeda
asju ülevalt alla, vasakult paremale.
See ei ole kuni saame semikoolonit et märksõna sõlme tegelikult olemas.
Nii et kui me tahame sellist tsükliline viide sees andmed
struktuuri, me peame seda tegema, kus ütleme struct node ülaosas, mis
annab meile enam viis kirjeldada seda asi, siis sees ütleme struct node,
ja siis kõige viimane rida ütleme, kõik õige, C, muide,
lihtsalt nimetame seda kogu kuradi asi sõlme ja lõpetage
kasutades märksõna struct kokku.
Nii et see on lihtsalt omamoodi süntaktilise trikk, mis lõppkokkuvõttes võimaldab meil luua
midagi, mis näeb välja täpselt nagu see.
>> Nii et kui me eeldame, nüüd saame rakendada seda asja C,
kuidas me tegelikult alustada liiklevad see?
Noh, tegelikult kõik me peame tegema, on itereerima vasakult paremale ja lihtsalt
Selline sisestada sõlmede või kustutada sõlmed või otsida asju kus me tahame,
aga et seda teha, lähme edasi ja teha asju veidi rohkem reaalne, sest see
on super madala siiani.
Kas keegi sõna otseses mõttes meeldib olla esimene?
OKEI.
Tule üles.
Mis su nimi on?
>> DAVID: David.
DAVID Humala: David.
Meeldiv tutvuda.
Mina ka.
Hästi.
Ja me vajame number 9.
Mitte nii hea kui esimene, ehk.
OK, number 9.
Mitmed 17, palun.
Lubage mul minna tagasi veidi kaugemal.
Number 22, palun, ja kuidas kaugemal tagasi
kui ma ei näe käed kõik väikesed või ei.
Keegi on vabatahtlikult seal.
Kas sa tahad tulla?
Sinu küünarvarre vägisi läheb üles.
OK, 17.
22.
26 on tulemas alla.
Kas keegi tahaks forcefully-- Tule üles.
Tegelik vabatahtlikuna.
>> Nii väga kiiresti, kui kutid võiks korraldada
ise lihtsalt meeldib sõlmed ekraanil.
Aitäh.
Ja sa pead olema 26.
Kõik õige ja kiire asustamise.
Nii et ma olen David ja sa oled ka?
DAVID: David.
DAVID Humala: Ja sa oled?
JAKE: Jake.
Sue: Sue.
ALEX: Alex.
Raphael: Raphael.
TAYLOR: Taylor.
DAVID Humala: Taylor.
Suurepärane.
Nii et need on meie vabatahtlikud täna ja minna
ja vahetustega natuke niimoodi, ja lihtsalt minna ja hoida
kellel oma numbrid olete või teie Esimene märk ja vasaku käega,
minna ja lihtsalt ellu Nende nooled, lihtsalt
nii, et vasak käsi on sõna otseses mõttes osutades iganes sa peaksid meelde
kell, ja anda endale ruumi, nii et saame visuaalselt näha oma käsi tegelikult
juhtides, ja te saate lihtsalt meelde omamoodi maapinnal on hea.
>> Nii et siin on meil ahelloend ühe, kaks, kolm, neli, viis sõlmede esialgu
ja teate, meil on see eriline pointer alguses, kes on
võti, sest meil on jälgida kogu pikkuses nimekirja kuidagi.
Need poisid, kuigi nad oled jäänud paremale, seljad mälu,
nad võivad tegelikult olla kuskil in arvuti mällu.
Nii et need poisid olla seisab kuskil laval
ja see on hea, nii kaua, kui nad tegelikult osutades üksteisest
aga hoida asjad puhas ja lihtne, siis me
lihtsalt juhtida neid vasakult paremale, nagu Selles, kuid seal võib olla tohutu lüngad
nende vahel sõlmi.
>> Nüüd, kui ma tahan tegelikult lisada mõned uus väärtus, lähme edasi ja tee seda.
Meil on võimalus nüüd valida teise sõlme.
Ütle alustame koos mallocing 55.
Kas keegi mind on malloc?
OK, tulge sisse.
Mis su nimi on?
RAINBOW: Rainbow.
DAVID Humala: Rainbow?
Hästi.
Malloc Rainbow.
Tule üles.
Nüüd peame endalt küsima algoritmiliselt kus saame panna 55.
Nii et kõik meist ei tea, Ilmselt kus ta ilmselt
kuulub, kui me üritame hoida seda järjestatud
ja kui te poisid võiksid ühe samm tagasi, et me ei jääks välja
laval, et oleks tore.
Seega tegelikult Rainbow, alustada siin koos minuga,
sest me arvuti nüüd saab näha ainult üks muutuja korraga.
Nii et kui see on esimese sõlme.
Pange tähele, et ta ei ole sõlme, ta on lihtsalt kursoriga
ja sellepärast on ta juhtinud olla ainult suurus osuti, mitte
üks neist täis ristkülikud.
Nii et me läheme vaadata igal iteratsiooni on 55 alla 9?
Ei.
Kas 55 alla 17?
Ei.
Vähem kui 22?
Vähem kui 26?
Vähem kui 34?
Ja nii nüüd, muidugi Rainbow kuulub lõpus.
Nii et on selge, ja mida oli oma nimi, Taylor?
>> TAYLOR: Taylor.
DAVID Humala: Nii hulgast Taylori vasak käsi ja Rainbow käed siin
kelle käest tuleb märkida, mida on Selleks, et lisada 55 sellesse nimekirja?
Mida me peame tegema?
Jah?
>> Sihtrühm: Taylor käsi peab käsk vasakule.
>> DAVID Humala: Täpselt.
Nii sisestamist sõlme meie nimekirja lõppu
on üsna lihtne, sest Taylor lihtsalt on punkti asemel maapinnal
või me nimetame seda null, null on omamoodi puudumisel
pointer või spetsiaalse null pointer, sa oled
läheb meelde oma vasaku kätt Rainbow ja siis Rainbow,
Kuhu vasak Samas ilmselt juhtida?
Alla.
See ei ole hea, kui tema käsi on omamoodi juhtides siin maha või mingi tahes
mis teed.
See võiks pidada prügi väärtus,
aga kui ta osutab mõned tuntud väärtust, siis me
nimetame seda nulli või null, see on OK sest meil on mõiste selle
ja me teame nimekirja nüüd on lõppenud.
>> Mis siis veel üks suhteliselt lihtne juhul?
Kas me malloc 5?
Tule üles.
Mis su nimi on?
Tiffany: Tiffany.
DAVID Humala: Vabandust?
Tiffany: Tiffany.
DAVID Humala: Tiffany.
Hästi.
Tiffany on malloced väärtusega 5.
Tule üles.
See üks on suhteliselt lihtne liiga, kuid Vaatleme et operatsioonide nüüd.
See oli päris lihtne Taylor lõpus.
Number 5 on muidugi alla 9, ja nii on meil David meil Tiffany,
ja mis oli su nimi on?
>> JAKE: Jake.
>> DAVID Humala: Jake.
Tiffany, Jake ja David.
Kelle poolt tuleks ajakohastada esimesena?
Mida sa tahad teha siin?
Seal on paar võimalusi, kuid seal on ka üks või mitu viga viisil.
>> Sihtrühm: Alusta vasakpoolsem.
>> DAVID Humala: Alusta vasakpoolsem.
Kes on kõige vasakpoolsem siin siis on?
Sihtrühm: Esiteks.
>> DAVID Humala: OK.
Seega tuleb alustada esimesel ja kus sa soovite värskendada Davidi käsi olema?
Sihtrühm: Teel 5.
DAVID Humala: OK.
Taavet punkt kell viis või Tiffany siin ja praegu?
>> Sihtrühm: Tiffany viitab 9?
DAVID Humala: Perfect, välja arvatud Binky on Pea lihtsalt selline kukkus, eks?
Sest see, mis sul viga on see pilt sõna otseses mõttes?
Sihtrühm: Midagi on suunatud.
DAVID Humala: Miski pole osutades Jake nüüd.
Me oleme sõna otseses mõttes orvuks 9 ja 17, ja me oleme sõna otseses mõttes
lekkinud kõik see mälu, sest ajakohastamine Davidi käsi esimene, mis on
fine, kuivõrd see on õigesti osutades Tiffany nüüd,
aga kui keegi oli prognoos osutavad Jake,
siis me kaotasime kogu selles nimekirjas.
Nii saab tagasi võtta.
Nii et oli hea asi komistada, kuid olgem korrigeerida nüüd.
Mida me peaksime tegema esimese asemel?
Jah?
>> Sihtrühm: Tiffany nentima kell 9?
DAVID Humala: ma ei saa saada, et close to you.
Kes peaks viitama kell 9?
>> Sihtrühm: Tiffany.
>> DAVID Humala: Okei.
Nii Tiffany peaks esimese punkti juures 9.
Nii Tiffany peaks samasugusele väärtus
David, mis tundub koondatud hetkeks,
aga see on hea, sest nüüd, teisel samm, saame uuendada Davidi käsi
punkti Tiffany juures, ja siis, kui me lihtsalt selline puhas asju
nagu oleks see mingi kevadel nagu, Nüüd see on õige sisestamise.
Nii hea.
Nüüd me oleme peaaegu kohal.
Lisame veel ühe väärtus, nagu väärtus 20.
Kui meil oleks malloc üks lõplik vabatahtliku?
Tule üles.
Nii et see üks on natuke rohkem keeruline.
Aga tõesti, kood oleme kirjalikult, kuigi sõnades,
on nagu võttes kamp ja kui tingimused on nüüd, eks?
Meil oli tingimus kontrollida, kas see kuulub
lõpus, võibolla alguses.
Me peame mingi silmuse leida kohapeal keskel.
Nii saab teha, et mis su nimi on?
>> ERIC: Eric.
>> DAVID Humala: Eric?
Eric.
Meeldiv tutvuda.
Nii et meil on 20.
Vähem kui viis?
Ei.
Vähem kui üheksa?
Ei.
Vähem kui 17?
Ei.
OKEI.
Ta kuulub siin Teie nimed jälle on?
Sue: Sue.
DAVID Humala: Sue.
ALEX: Alex.
DAVID Humala: Sue, Alex ja?
ERIC: Eric.
DAVID Humala: Eric.
Kelle käes on vaja saada ajakohastatud esimesena?
>> Sihtrühm: Eric.
OKEI.
Nii Ericu peaks osutavad, kus?
Kell 22.
Väga hea.
Ja nüüd mis järgmiseks?
Sue saab siis osutavad Eric ja nüüd, kui te poisid lihtsalt
tegema ruumi, mis on hea visuaalselt, nüüd me oleme teinud sisestamist.
Nii saab nüüd arutama küsimust, kuid Tänan sind nii palju vabatahtlikke.
Väga hästi tehtud.
Saate hoida neid, kui soovite.
Ja meil on ilus lahkuminek kingitus, kui sa iga meeldib teha stressi pall.
Lubage mul taolist alla.
Mis on Buffee seda?
See tundub olevat hämmastav kuivõrd meil nüüd
kasutusele alternatiivina massiivi ei ole nii piiratud
massiivi mõned fikseeritud suurus.
Nad võivad kasvada dünaamiliselt.
>> Aga palju nagu oleme näinud nädalat Varem me ei saa kunagi midagi tasuta,
nagu kindlasti seal on kompromiss siin.
Nii tagurpidi on seotud nimekirja, on see dünaamika?
See võime kasvada ja ausalt öeldes Me oleks võinud teha delete
ja me võiks väheneda, kui vaja.
Mis hind on meil maksavad?
Kaks korda nii palju ruumi, esiteks.
Kui te vaatate pilti, enam olen ma talletamise täisarvud.
Ma talletamise täisarvud pluss suunanäitajaks.
Nii et ma kahekordistada palju ruumi.
Nüüd, võibolla see ei ole selline suur asi 4 baiti, 8 baiti,
kuid see võiks kindlasti lisada kuni suurte andmekogumite.
Mis on veel puudusi?
Jah?
>> Sihtrühm: Me peame läbida neist üks-by-one.
DAVID Humala: Jah.
Me peame läbida neist üks-by-one.
Tead mis, loobusime sellest super mugav funktsioon nurksulg
märke, õigemini tuntud muutmälu,
kus saame lihtsalt hüpata indiviidile element
kuid nüüd, kui ma veel olnud minu vabatahtlike siin
kui ma tahtsin leida number 22, ma ei saa lihtsalt
hüpata sulg midagi midagi.
Mul on üle vaatama nimekirja, palju nagu meie otsides näiteid lineaarselt,
leida number 22.
Nii näib, et oleme maksis seal.
Aga me ei saa siiski lahendada muid probleeme.
>> Tegelikult, las ma tutvustan vaid paar visuaale.
Nii et kui sa oled olnud alla Ema söögisaalis hiljuti,
sa meenutada, et nende korstnad plaate nagu see,
oleme laenanud need alates Annenberg enne klassi.
Nii et see virn, kuigi esindab tegelikult
arvuti teadust andmete struktuuri.
On andmeid struktuur infotehnoloogia
tuntakse virna, mis väga kenasti sobiv just see visuaalne.
Nii et kui kõik need kandikud ei ole salve, kuid nagu number ja ma tahtsin
salvestada numbreid, ma võiks panna ühte siin,
ja ma võiks panna teise siia, ja jätkata virnastamine numbrid
peal üksteist, ja mis potentsiaalselt kasulikke sellest
on see, et milline on mõju Käesoleva andmestruktuur?
Milline number ma tõmmake Esimene kõige mugavam?
Kõige hiljuti ühe panna seal.
>> Nii et see on see, mida me nimetame sisse arvuti teadusele LIFO andmete struktuuri.
Viimane, first out.
Ja me näeme peagi, miks mis võib olla kasulik, kuid nüüd,
lihtsalt kaaluda vara.
Ja see on selline loll, kui te arvate, kuidas söögisaal teeb.
Iga kord, kui nad puhtad plaate ja pane uuemad need peal,
sa oleks võinud varem puhas kuid lõpuks väga määrdunud ja tolmune
salve väga põhjas kui sa tegelikult kunagi
põhjani selle stack, sest sa lihtsalt
hoida paneb uue ja puhas need peal.
Sama asi võib juhtuda supermarket liiga.
Kui teil on ekraani puhul Piima ja iga kord CVS
või kes saab rohkem piima, sa lihtsalt pista piimad
sul on juba tahapoole ja paned uued, kuni ees,
sa lähed on päris vastik piima lõpus andmestruktuuri,
sest see on alati allosas või samaväärselt see alati tagasi.
>> Aga seal on veel üks võimalus mõelda vooder andmed ja näiteks see.
Kui sa oled üks neist inimestest, kellele meeldib rivistama väljaspool Apple kauplustes
kui uus toode on läbi, siis oled ilmselt
ei kasuta virna andmeid struktuuri, sest sa
oleks võõrandada kõigile teistele, kes on vooder osta mõned uued mänguasjad.
Pigem oled ilmselt kasutades millist andmestruktuuri
või millist süsteemi reaalses maailmas?
Loodetavasti on see rida või rohkem korralikult või rohkem Briti-like, järjekorda.
Ja selgub järjekorras on ka andmestruktuur infotehnoloogia,
kuid järjekord on väga atribuut.
See ei ole LIFO.
Viimane, first out.
Jumal hoidku.
See on vaid FIFO.
Esiteks on esimene välja.
Ja see on hea asi õigluse "nimel
kindlasti, kui sa vooder up super varahommikul.
Kui teil seal esimene, siis saada tahame kõigepealt hästi.
>> Ja nii kõik need andmed struktuure, järjekorrad ja korstnad
ja kobarad teised, selgub sa ei mõtle seda lihtsalt massiivi.
See on massiiv, võibolla fikseeritud suurus 4, aga see tahaks
olla omamoodi tore, kui me võiks lihtsalt hunnikusse plaate peaaegu lõpmatult pikk, kui me
on, et paljud plaate või numbrid.
Ehk me tahame kasuta ahelloend siin
kuid kompromiss saab olema potentsiaalselt et meil on vaja rohkem mälu,
võtab veidi rohkem aega, kuid me ei piirata kõrgust virna,
meelega Mather ekraani puhul Võib mahtu piirata virna
ja nii need disaini otsuseid või võimalusi meile lõpuks.
Nii need andmed struktuure, oleme alustanud
näha uusi ülemised piirid potentsiaalselt mida varem oli super kiire
ja kus me jätan välja täna ja kus
Loodame saada on kolmapäeval, siis me
hakkavad vaadata andmebaasi struktuur, mis võimaldab meil otsida
läbi andmete log lõpuks jälle.
Ja me nägime, et meenutavad nädalal null ja üks binaarne otsing või lõhe
ja vallutada.
See tuleb tagasi ja veel parem, Püha Graal jaoks sel kolmapäeval
saab tulla koos andmestruktuur, mis töötab tõesti
või teoreetiliselt konstantse ajaga, kusjuures
see ei ole oluline, kui palju miljoneid või miljardeid asju
meil on andmestruktuur, siis meid konstantset aega, võib-olla üks samm
või kaks sammu või 10 sammu, kuid pidev hulga samme
otsida, et andmete struktuuri.
See tõepoolest on Püha Graal kuid rohkem, et kolmapäeval.
Näeme siis.
>> [Muusika mängib]