>> [Muusika mängib]
>> DOUG LLOYD: lähtekohad, siin me oleme.
See on ilmselt läheb kõige raskem teema
et me räägime in CS50.
Ja kui olete lugenud midagi viiteid
Enne võiks natuke hirmutada läheb see video.
See on tõsi viiteid ei võimalda sulle võimalust
võibolla keera päris halvasti, kui sa oled
töötamisel muutujate ja andmed ja põhjustades oma programmi krahhi.
Aga nad on tegelikult väga kasulik ja nad võimaldavad meil tõesti suurepärane võimalus
läbida andmed tagasi ja vahel edasi funktsioone,
et me muidu ei suuda seda teha.
>> Ja nii me tegelikult tahan teha siin on rong
Teil on hea pointer distsipliini, nii mida saab kasutada viiteid tõhusalt
teha oma programme, et palju parem.
Nagu ma ütlesin vihjeid anda meile eri võimalus edastada andmeid funktsioonide vahel.
Nüüd, kui te mäletate alates varem video, kui
me rääkisime Muutuva ulatusega, mainisin
et kõik andmed, mida me vahelt funktsioonide C on vastu võetud väärtus.
Ja ma ei kasutanud, et Mõiste, mida ma mõtlesin seal
oli see, et me oleme läbinud koopiaid andmetest.
Kui võtame muutuja funktsioon, me tegelikult ei sooritades muutuja
funktsioonile, eks?
Me kulgeb koopia nimetatud andmed funktsiooni.
Funktsioon teeb mida see ja see arvutab mingi väärtus,
ja äkki me kasutame, et väärtus kui ta annab selle tagasi.
>> Seal oli üks erand Selle reegli läbimise väärtusest,
ja me tuleme tagasi, mida see on veidi hiljem selle video.
Kui me kasutame vihjeid asemel kasutades muutujaid,
või selle asemel kasutades muutujate ise või koopiad muutujad,
saame nüüd edasi muutujad ümber funktsioonide vahel teistmoodi.
See tähendab, et kui me teeme üks muudatus funktsiooni,
et muudatus tegelikult võtta efekti tekitamiseks erinevad funktsioonid.
Jällegi, see on midagi, me ei saanud seda teha varem,
ja kui sa oled kunagi proovinud vahetada väärtus kahe muutuja funktsioonis,
olete märganud seda probleemi omamoodi hiiliva üles, eks?
>> Kui me tahame, et vahetada X ja Y, ja me edasi neid funktsioon nimega swap,
sees funktsiooni vahetada muutujad teha vahetust väärtusi.
Üks saab kaks, kaks muutub üks, kuid meil ei ole tegelikult
muuda midagi originaal funktsioon, helistaja.
Kuna me ei saa, me oleme ainult koostööd nende koopiaid.
Mis vihjeid küll, saame tegelikult läbida X ja Y funktsioon.
See funktsioon on võimalik teha midagi nendega.
Ja need muutujad väärtusi võib tegelikult muuta.
Nii et on üsna muutus Meie võime töötada andmeid.
>> Enne kui me sukelduda suunanäitajaks, ma arvan, et see on seda väärt
võttes paar minutit minna tagasi põhitõdesid siin.
Ja on vaadata, kuidas Arvuti mälu tööd
sest need kaks teemat ei kavatse tegelikult päris omavahel.
Nagu te ilmselt teate, arvuti süsteemi
teil on kõvaketas või ehk tahkes olekus autot,
mingi faili salvestamise asukoht.
See on tavaliselt kusagil naabruses 250 gigabaiti
võibolla paar terabaiti nüüd.
Ja see on koht, kus kõik oma Failide lõppkokkuvõttes elada,
isegi siis, kui arvuti on välja lülitatud off, siis saad selle tagasi
ja leiad failid on olemas uuesti, kui süsteem taaskäivitada.
Aga kettaseadmed, nagu kõvaketas, HDD, või tahkes olekus autot, SSD,
on lihtsalt ruumi.
>> Me ei saa tegelikult midagi teha andmeid, mis on kõvaketta
või tahkes olekus autot.
Et tegelikult muuta andmete või seda liigutatakse,
peame liikuma selle RAM, muutmälu.
Nüüd RAM, sul on palju vähem arvutis.
Te võib-olla kuskil naabruses 512 megabaiti
Kui teil on vanem arvuti, et võib-olla kaks, neli, kaheksa, 16,
võib-olla isegi veidi rohkem, gigabaiti mälu.
Nii et palju väiksem, kuid see on kus kõik lenduvad andmete olemasolu.
See, kui saame asju muuta.
Aga kui me pöördume meie arvuti välja, kõik andmed RAM on hävinud.
>> Nii et miks me peame olema kõvaketas jaoks rohkem püsiva asukohaga sellest,
nii, et see exists- see oleks tõesti halb, kui iga kord kui me
pöördus meie arvuti välja, iga file meie süsteem pühitud.
Nii me töötame sees RAM.
Ja iga kord, kui me räägime mälu, päris palju, on CS50,
me räägime RAM, mitte kõvakettale.
>> Nii et kui me liigume asju mällu, kulub teatud hulk ruumi.
Kõik andmetüüpe, et oleme töötanud koos
on eri koguses ruumi RAM.
Nii et iga kord, kui loote täisarv varieeruv, neli baiti mälu
on kõrvale RAM siis saab tööd, et täisarv.
Võite tunnistada täisarv, muuta, määrata selle
väärtus 10 ühiku võrra ühe, nii edasi ja nii edasi.
Kõik, mis peab juhtuma RAM, ja sa saad neli baiti
töötada iga täisarv, et loote.
>> Iga täht luua saab ühe baidi.
See on lihtsalt, kui palju ruumi on vaja salvestada iseloomu.
Iga float, tõeline number, saab nelja baiti
kui see on kahekordne täpsusega ujukoma
number, mis võimaldab on täpsemate või numbrit
pärast koma kaotamata täpsusega,
mis võtavad kaheksa baiti mälu.
Pikad pikad, tõesti suur täisarvud, Samuti võtavad kaheksa baiti mälu.
Mitu baiti mälu ei stringe alustada?
Noh olgem panna pin selles küsimuses nüüd, kuid me tuleme tagasi selle.
>> Nii tagasi idee mälu suur massiiv baidi suurusega rakud.
See on tõesti kõik see on, see on lihtsalt tohutu hulga rakkude,
nagu iga teine ​​massiivi te olete juba tuttav ja vaata,
välja arvatud iga element on üks bait lai.
Ja nagu massiivi, Iga element on aadress.
Iga element massiivi on indeks, ja me
saab kasutada, et indeks teha nn juhusliku juurdepääsu massiivi.
Me ei pea algama alguses massiiv,
itereerima läbi iga ühe elemendi selle,
leida, mida me otsime.
Me saame vaid öelda, ma tahan saada 15. element või 100. element.
Ja sa võid läbida, et number ja saada väärtus, mida otsite.
>> Samamoodi iga asukohta mälu on aadress.
Nii et teie mälu võiks välja midagi sellist.
Siin on väga väike patakas mälu, see on 20 baiti mälu.
Esimesed 20 baiti, sest minu käsitletakse seal allosas
on 0, 1, 2, 3, ja nii kõik viis kuni 19.
Ja kui ma kuulutada muutujate ja kui ma hakkan nendega koostööd tegema,
Süsteemi saab seadistada kõrvale ruumi minu jaoks
Selles mälu tööd minu muutujaid.
Nii et ma võiks öelda, char c võrdub kapitali H. Ja mis juhtub?
Noh süsteem läheb kõrvale minu jaoks üks bait.
Sel juhul valis baidist neli, bait aadressil neli,
ja see läheb salvestada kirja kapitali H seal minu jaoks.
Kui ma siis ütlen int kiirus limiit võrdub 65, siis on
läheb kõrvale neli baiti mälu mind.
Ja see läheb kohelda neid nelja baiti ühtse üksusena
sest mida me töötame koos on täisarv siin.
Ja see läheb salvestada 65 seal.
>> Nüüd juba ma olen selline ütlen sulle natuke vale,
õige, sest me teame, et arvutite tööd kahendsüsteemis.
Nad ei saa aru, tingimata, mida kapitali H on
või mida 65 on nad ainult mõista binaarne, ühtede ja nullide.
Ja nii tegelikult, mida me säilitamine on
ei ole kirja H ja number 65, vaid pigem binaarse esindused
selle, mida vaadata natuke midagi sellist.
Ja eriti kontekstis täisarv muutuja
see ei lähe lihtsalt sülitada see, ta ei kavatse seda ravida ühe neljast
bait patakas tingimata, see on tegelikult läheb
pidada seda neli üks bait tükkideks, mis võib välja midagi sellist.
Ja isegi see ei ole täiesti õige kas,
sest midagi, mida nimetatakse endianness, mis meil ei ole
hakka nüüd, kuid kui sa oled uudishimulik,
võite lugeda üles vähe ja suur endianness.
Aga pärast seda argumenti, huvides see video,
olgem lihtsalt eeldada, et on Tegelikult, kui number 65 oleks
olema esindatud mälu iga süsteem,
kuigi see ei ole päris tõsi.
>> Aga olgem tegelikult lihtsalt saada lahti kõik binaarsed täielikult,
ja mõelge, kui H ja 65, see on palju lihtsam
mõelda nagu et kui inimene.
Olgu, nii tundub ka võibolla natuke juhuslik, et I've- minu süsteemi
ei andnud mulle baiti 5, 6, 7, ja 8 salvestada täisarv.
Seal on põhjus, et liiga, mis me ei hakka kohe, vaid piisab
see tähendab, et mida arvuti teeb siin
Ilmselt on hea liikuda oma osa.
Et anna mulle mälu, mis on tingimata seljad.
Kuigi see läheb seda teha nüüd kui ma tahan saada teise string,
nimetatakse perekonnanimi, ja ma tahan panna Lloyd seal.
Ma lähen vaja, et üks iseloomu, iga tähe, mis on
läheb vaja ühte iseloomu, üks bait mälu.
Nii et kui ma saaks panna Lloyd minu rida niimoodi ma olen päris hea minna, eks?
Mis puudu?
>> Pea meeles, et iga string me töötame koos C lõpeb kurakriips null,
ja me ei saa jätta, et siin, kas.
Me peame jätma ühe baidi mälu hoida, et nii me
tea, millal meie string on lõppenud.
Nii jälle see kord sellest, kuidas asjad
ilmuvad mälu võiks olla natuke juhuslik,
kuid tegelikult on see, kuidas Kõige süsteemid on loodud.
Et rida neid korduvaladel nelja põhjustel jälle
et me ei pea sattuda just nüüd.
Aga see, et piisab, kui öelda, et Pärast neid kolme rida koodi,
see on see, mida mälu tunduda.
Kui mul on vaja mälukohtades 4, 8 ja 12, et hoida oma andmed,
see on see, mida minu mälu tunduda.
>> Ja just eriti pedantne siin, kui
me räägime mälu aadressid me tavaliselt
kasutab selleks kuueteistkümnendsüsteemis salakoodi.
Miks me ei teisendada kõik need alates koma et heksadesimaalilukua
lihtsalt sellepärast, et see on üldiselt kuidas me nimetame mälu.
Nii et selle asemel on 0 kuni 19, mis meil on null
x nullist null x1 kolm.
Need on 20 baiti mälu, et me on või me vaatleme seda pilti
siin samas.
>> Nii et kõik mis öeldud, olgem sammu kaugusel mälu teist
ja tagasi suunanäitajaks.
Siin on kõige olulisem meeles pidada
kui me alustame koos suunanäitajaks.
Pointer on midagi rohkem kui aadress.
Ma ütlen veelkord, sest see on nii oluline,
osuti on midagi rohkem kui aadress.
Lähtekohad on aadressid kohad mälu, kus muutujad elada.
Teades, et see muutub loodetavasti natuke lihtsam töötada koos nendega.
Teine asi, mulle meeldib mida teha, on olla omamoodi
diagrammide visuaalselt esindavad, milline on toimub erinevate rida koodi.
Ja me teeme seda paar kordi suunanäitajaks,
ja kui me räägime dünaamiline mälu eraldamise samuti.
Sest ma arvan, et need diagrammid võib olla eriti kasulik.
>> Nii et kui ma ütlen näiteks int k minu kood, mis toimub?
Noh, mis on põhimõtteliselt toimuvast Ma saan mälu kõrvale minu,
aga ma isegi ei meeldi mõtle selle peale niimoodi, ma
meeldib mõelda nagu karp.
Mul on kast ja see on värviline roheline, sest ma
panna täisarvud roheline kaste.
Kui see oli märk ma võib olla sinise kasti.
Aga ma olen alati öelnud, kui ma loon kast, mis mahub täisarvud
et kast on värvitud roheliseks.
Ja ma võtan püsiva marker mu kirjutada k küljel seda.
Nii et mul on kasti nimetatakse k, kuhu võin panna täisarvud.
Nii et kui ma ütlen, int k, mis on Mis juhtub mu peas.
Kui ma ütlen, k võrdub viis, mida ma teen?
Noh, ma panen viie kasti, eks.
See on üsna lihtne, kui Ma ütlen int k, luua kasti nimetatakse k.
Kui ma ütlen, k võrdub 5, pane viis kasti.
Loodetavasti ei ole liiga palju hüpe.
Siin, kus asjad lähevad natuke huvitav küll.
Kui ma ütlen, int * pk, samuti ka siis, kui ma seda ei tee tea, mida see tähendab tingimata,
see on selgelt saanud midagi pistmist täisarv.
Nii et ma lähen värvi Selle kasti roheline-ish,
Ma tean, et see on midagi pistmist täisarv,
kuid see ei ole täisarv ise, sest see on int star.
Midagi veidi erinevat infot.
Nii täisarv on kaasatud, aga muidu see on
ei erine liiga palju mida me räägime.
See kast, selle sain silt, see on seljas sildi pk,
ja see mahub int tähte, olenemata need on.
Nad on midagi teha täisarve, selgelt.
Siin on viimane küll.
Kui ma ütlen, pk = & k, oot, Mis juhtus, eks?
Nii et see juhuslik number, näiliselt juhuslik number, saab visatud kasti juures.
Kõik, mis on, on pk Jääb aadress k.
Nii et ma olen kinni, kus k elab mälu aadressi, aadressi oma baiti.
Kõik, mida ma teen on ma räägin et väärtus on see, mida ma lähen
panna sees minu kasti nimega pk.
Ja kuna need asjad on viiteid ja seetõttu otsin
kell string nagu null x kaheksa null c seitse neli kaheksa
kaks null on ilmselt ei ole väga sisukas.
Kui me tavaliselt visualiseerida suunanäitajaks, me tegelikult teeme nii suunanäitajaks.
Pk annab meile infot peame leidma k mälestuseks.
Nii et põhimõtteliselt pk on nool ta.
Ja kui me kõnnime pikkus Selle nool, kujutage ette,
see on midagi, mida saab kõndida, kui me kõndida piki noolt
päris otsa, et nool, me leiad asukohta mälus
kus k elab.
Ja see on tõesti oluline sest kui me teame, kus k elab,
saame alustada tööd andmeid sees, et mälu asukohta.
Kuigi me saada Teeny Veidi enne endale praegu.
>> Mis on osuti?
Pointer on andmeühiku kelle väärtus on mälu aadress.
See oli see, et null x kaheksa null kraami toimub, see oli mälu aadress.
See oli asukohta mälus.
Ja tüüpi pointer kirjeldab, millist
andmete leiad juures et mälu aadress.
Nii et int star osa paremale.
Kui ma jälgin, et nool, see on kõik viib mind asukohta.
Ja selles kohas, mida ma leiad seal minu näide,
on roheline värvi kasti.
See on täisarv, mis on see, mida ma leiad, kui ma lähen, et aadress.
Andmed tüübi kohta pointer kirjeldab
leiad sel mälu aadress.
Nii et siin on väga lahe asi küll.
Osuti võimaldab meil edasi muutujate funktsioonide vahel.
Ja tegelikult edasi muutujad ja ei liigu neist koopiaid.
Sest kui me teame täpselt, kus mälu leida muutuja,
me ei pea tegema koopia siis me ei saa lihtsalt minna selles kohas
ja töötada, et muutuja.
Nii sisuliselt vihjeid omamoodi ning teeb arvuti keskkond
palju nagu reaalses maailmas, eks.
>> Nii et siin on analoogia.
Ütleme, et mul on sülearvuti, õige, ja see on täis märkmeid.
Ja ma tahaksin, et te seda uuendada.
Olete funktsioon, mis uuendused märgib õige.
Kuidas me oleme olnud töötab siiani, mida
juhtub on siis võtan sülearvuti, lähete koopia salvestada,
saate teha Xerox koopia iga lehekülje sülearvuti.
Sa jäta mu sülearvuti tagasi minu laual, kui sa oled teinud,
lähete ja kriipsutama asjad minu sülearvuti, mis on aegunud või valesti,
ja siis saad edasi tagasi minu pakk Xerox lehekülge
mis on replica minu sülearvuti muutusi, mis sa oled teinud seda.
Ja sel hetkel, et see on kuni mind helistaja funktsiooni, kuna helistaja,
otsustada võtta oma märkmeid ja integreerida neid tagasi oma sülearvuti.
Nii et palju samme osalenud siin, eks.
Nagu kas ei oleks parem kui ma ütlen, Hei, kas sa
uuendada oma sülearvuti mulle käe minu sülearvuti,
ja te võtate asju ja sõna otseses mõttes risti neid
ja uuendada oma märkmeid minu sülearvuti.
Ja siis anna mulle minu sülearvuti tagasi.
See on selline, mida viiteid võimaldab meil teha,
nad teevad seda keskkonda palju rohkem meeldib, kuidas me tegutseme reaalsus.
>> Olgu siis nii, osuti on, räägime
kuidas osuti tööle C ja kuidas saame alustada nendega koostööd tegema.
Nii et väga lihtne pointer C nimetatakse nullviida.
Null pointer punktid midagi.
See ilmselt tundub see tegelikult ei ole väga kasulik asi,
aga nagu me näha natuke hiljem, asjaolu,
et see nullviida olemas tegelikult tõesti võib tulla mugav.
Ja alati, kui loote pointer, ja sa ei määra selle väärtuseks immediately-
näide, millega selle väärtus kohe
on paar slaidi tagasi kus ma ütlesin pk võrdub & k,
pk saab k aadress, kui me näeme, mida see tähendab,
Me näeme, kuidas koodi shortly- kui me ei määra selle väärtuseks midagi
mõtestatud kohe, Alati tuleb
seada kursor punkti tühjaks.
Sa peaksid kehtestama see käsk midagi.
>> See on väga erinev just lahkumas väärtus, kui see on
ja siis kuulutab pointer ja lihtsalt eeldades
see on null, sest see on harva tõsi.
Nii et sa peaksid alati seatud väärtus osuti
tühjaks, kui sa ei määra selle väärtuseks et midagi olulist kohe.
Te saate vaadata, kas osuti väärtus on null abil võrdõiguslikkuse operaator
(==), Just nagu sina võrrelda tahes täisarv väärtuste või sümboli väärtus kasutades (==)
samuti.
See on eriline omamoodi pidev väärtus, mida saab kasutada, et testida.
Nii et oli väga lihtne pointer, null pointer.
Teine võimalus luua osuti on eraldada
aadressi muutuva olete juba loonud,
ja sa seda kasutada & operaator aadress kaevandamine.
Mis me oleme juba näinud varem esimeses skeem Näiteks ma näitasin.
Nii et kui x on muutuja, mis me oleme juba loodud tüüpi täisarv,
Seejärel & x on viit täisarv.
ja x on- mäletan, ja läheb ekstrakti aadress asi õige.
Ja kuna osuti on lihtsalt aadressi, kui & x on viit täisarv
mille väärtus on kui mälu x elus.
See on x aadressi.
Nii ja x on aadress x.
Võtame selle ühe sammu edasi ja ühendada midagi
Ma vihjas eelneva video.
Kui arr on hulgaliselt paarismängus siis & arr nurksulg i on pointer
kahekordse.
OKEI.
Arr nurksulg i, kui arr on hulgaliselt paarismängus
siis Arr nurksulg i on i-nda elemendi, et massiiv,
ja & arr nurksulg i on koht, kus on Mälu i-nda elemendi arr olemas.
>> Mis siis kaudselt siin?
Massiivid nimi, tähendas kogu see asi,
on see, et massiivi nimi on tegelikult ise osuti.
Olete töötanud koos suunanäitajaks kogu aeg
iga kord, kui olete kasutanud massiivi.
Pea meeles, alates näiteks muutuva ulatusega,
lähedal lõpuks video esitlen ma näide, kus meil on funktsioon
nimetatakse komplekt int ja funktsiooni nimetatakse array.
Ja teie ülesanne teha kindlaks, kas või mida
väärtused, mida me välja printida lõppu funktsiooni,
lõpus põhiprogrammi.
>> Kui te mäletate, et näiteks või kui te olete vaatasin video,
sa tead, et kui teile-kõne komplekt int efektiivselt ei tee midagi.
Aga kõnet, et massiivi teeb.
Ja ma justkui ilustatud, miks mis juhtus ajal.
Ma lihtsalt ütlesin, ka see on massiivi, see on eriline, sa tead, seal on põhjus.
Põhjuseks on see, et massiivi poolt nimi on tõesti ainult pointer,
ja seal on see eriline nurksulg süntaksit
Et asi palju mõnusam töötada.
Ja nad teevad ideed pointer palju vähem hirmutada,
ja sellepärast nad omamoodi on esitatud nii.
Aga tõesti massiivid on vaid suunanäitajaks.
Ja sellepärast, kui me tehtud muudatus massiivi,
Kui me möödunud massiivi parameetriks funktsioonile või argumendina
funktsioonile, sisu massiivi tegelikult muutunud nii Väljakutsutu
ja helistaja.
Milline iga muud liiki muutuja nägime ei olnud.
Nii et on lihtsalt midagi, mida meeles pahanda, kui te töötate suunanäitajaks,
on see, et selle nime massiivi tegelikult osuti
esimesele element, et massiivi.
>> OK, nii nüüd on meil kõik need faktid, olgem hoida läheb, eks.
Miks me hoolime kus midagi elab.
Noh, nagu ma ütlesin, see on päris kasulik teada, kus midagi elab
nii et võid minna sinna ja seda muuta.
Töö on ja tegelikult on asi, mida
tahad teha, et muutuja jõustuvad, ja ei jõustu mõned koopia.
Seda nimetatakse dereferencing.
Läheme viide ja muudame väärtus on.
Nii et kui meil on osuti ja seda nimetatakse pc, ja see viitab märk,
siis saame öelda * pc ja * pc on nimi, mida me leiame, kui me läheme
aadressile tk.
Mida me leiame seal on iseloomu ja * pc on, kuidas me viidata andmete juures, et
asukoht.
Nii võime öelda midagi * pc = D või midagi sellist,
ja see tähendab, et mis iganes oli mälu aadress pc,
mis tahes laadi varem seal on nüüd D, kui me ütleme, * pc = D.
>> Nii et siin me läheme uuesti imelikke C värk, eks.
Nii oleme näinud * varem kui on kuidagi osa andmete liiki,
ja nüüd on see kasutusel veidi teises kontekstis
juurdepääsu andmetele kohas.
Ma tean, et see on natuke segane ja see on tegelikult osa kogu
nagu, miks suunanäitajaks on see mütoloogia ümber, kuna on nii keeruline,
on selline süntaks probleem, ausalt.
Aga * kasutatakse mõlemas kontekstis, nii osana tüübist nimi
ja me näeme vähe hiljem midagi muud ka.
Ja praegu on apparent operaator.
Nii see läheb viide see pöördub andmeid
kohas osuti ja võimaldab teil manipuleerida ta soovid.
>> Nüüd on see väga sarnane külastavad oma naabri, eks.
Kui sa tead, mida teie naaber elab, sa oled
ei poomise läbi oma ligimest.
Sa tead juhtumisi tea, kus nad elavad,
kuid see ei tähenda, et alusel, millel see teadmine
sa nendega suhtlemisel.
Kui soovite suhelda nendega, sa pead minema oma maja,
sa pead minema sinna, kus nad elavad.
Ja kui sa seda teha, siis saab suhelda
nendega just nagu sina tahaks.
Ja sarnaselt muutujad, sa pead minema oma aadress
kui sa tahad suhelda nendega, sa ei saa lihtsalt tean aadressi.
Ja kuidas sa minna aadress on kasutada * on apparent operaator.
Mis sa arvad juhtub Kui me püüame apparent
osuti, mille väärtus on null?
Tuletame meelde, et null pointer viitab midagi.
Nii et kui sa püüad ja apparent midagi või minna aadressi midagi,
Mis sa arvad juhtub?
Noh, kui sa arvasid segmenteerimine süü, et sa tahaks olla õige.
Kui püüad ja apparent nullviida,
teil laevastikuosi süü. Aga oota,
ei, ma ütlen teile, et Kui sa ei kavatse
seada oma väärtust oma kursor midagi olulist,
sa peaksid seadma tühjaks?
Ma tegin ja tegelikult killustatust Viga on selline hea käitumise eest.
>> Kas olete kunagi deklareeritud muutuja ja ei määratud selle väärtus kohe?
Nii et sa lihtsalt öelda, int x; sa ei tegelikult määrata selle midagi
ja siis hiljem oma kood, sa välja printida väärtus x,
võttes veel määratud see midagi.
Sageli saad null, kuid mõnikord
võib saada mõne juhusliku arvu ja sa ei tea, kust see tuli.
Samamoodi saab asju juhtuda suunanäitajaks.
Kui kuulutada osuti int * pk näiteks
ja sa ei anna see väärtus, sa saad neli baiti mälu.
Ükskõik neljabaidilist mälu saab süsteemi
leiavad, et on mõned mõtestatud väärtus.
Ja oleks võinud olla midagi juba olemas, et
enam ei vajata teine funktsioon, nii et sa pead lihtsalt
mida iganes andmed olid olemas.
>> Mida teha, kui oled proovinud teha apparent Mõnes aadress, mida don't- oli
juba baiti ja info seal, see on nüüd teie kursor.
Kui püüad ja apparent et pointer, siis võib jama mõned mälu
et te ei kavatse jama see kõik.
Ja tegelikult, mida võiks teha midagi tõeliselt masendav,
nagu murda teise programmi, või murda teise funktsiooni,
või midagi pahatahtlikku, et sa ei kavatse seda teha üldse.
Ja nii see on põhjus, miks see tegelikult hea mõte
seada oma suunanäitajaks tühjaks, kui sa ei lasta neil midagi olulist.
See on ilmselt parem juures Päeva lõpuks oma programmi
crash siis seda teha midagi, mis ajab
teise programmi või mõne muu funktsiooni.
See käitumine on ilmselt isegi vähem ideaalne kui lihtsalt krahh.
Ja nii see on põhjus, miks see tegelikult hea harjumus
sattuda, et määrata oma suunanäitajaks tühjaks, kui sa ei seatud neid
mõtestatud väärtus kohe, väärtus, et sa tead
ja et saate turvaliselt apparent.
>> Nii saab tagasi tulla nüüd ja tutvu kell üldine süntaks olukorda.
Kui ma ütlen, int * p ;, mida ma olen lihtsalt teinud?
Mida ma olen teinud on see.
Ma tean, et väärtus p on aadress sest kõik osuti on vaid
aadressid.
Ma ei apparent p abil * operaator.
Selles kontekstis Siit võivad hetkel väga top meenutada * on osa liigist.
Int * on andmetüüp.
Aga ma ei apparent p abil * operaator,
ja kui ma seda teha, kui ma lähen, et aadress, mida ma leida sellele aadressile?
Ma leiad täisarv.
Nii int * p on põhimõtteliselt öeldes, p on aadress.
Ma ei apparent p ja kui Ma teen, ma leida täisarv
sel mälu asukohta.
>> OK, nii ma ütlesin seal oli veel tüütu asi tähed
ja siin on, kui see tüütu asi tähed on.
Kas olete kunagi proovinud kuulutada Mitme muutuja sama tüüpi
Sama rida koodi?
Nii teist, teeselda, et joon, koodi ma tegelikult on seal roheline
ei ole olemas ja see lihtsalt ütleb int x, y, z ;.
Mis see teeks on tegelikult luua kolm täisarvu muutujad teile,
üks nn x, üks nn y ja üks nn z.
See on viis, kuidas seda teha ilma võttes jagada peale kolm rida.
>> Siin, kus tähed saavad tüütu jälle küll,
sest * on tegelikult osa Mõlema tüübi nimi ja osa
muutuja nime.
Ja kui ma ütlen, int * px, py, PZ, mida ma tegelikult saada on viit täisarv
nimetatakse px ja kaks täisarvu, py ja PZ.
Ja see on ilmselt pole see, mida Me tahame, et see ei ole hea.
>> Nii et kui ma tahan luua mitu viiteid Samal real, sama tüüpi,
ja tähed, mida ma tegelikult vaja mida teha, on öelda, int * pa * pb, * pc.
Nüüd olles just ütles, et ja nüüd ütlen teile seda,
sa ilmselt ei tee seda.
Ja see on ilmselt hea ausalt, sest te võite kogemata
jätta täht, midagi sellist.
See on ilmselt kõige parem olla kuulutada näpunäiteid konkreetsete liinide,
aga see on lihtsalt veel üks need tüütud süntaks
asju tähte, mis muudavad suunanäitajaks nii raske töötada.
Sest see on lihtsalt selle süntaktilise jama teil niita.
Mis praktikas see ei tõesti läbiv.
Ma ikka teevad vigu sellega veel pärast programmeerimine 10 aastat,
nii et ärge pahaseks, kui midagi juhtub teile, see on päris levinud ausalt.
See on tõesti selline viga süntaksi.
>> OK, et ma mingi lubasin et meil oleks vaadata
mõiste kui suur on string.
Noh, kui ma ütlesin, et string, me oleme tõesti selline
lebanud teile kogu aeg.
Pole andmete tüübi nimega string, ja tegelikult ma
mainisid seda ühele meie varem videoid andmetüüpe
et string oli andmete tüüp, mis loodi teile CS50.h.
Sa pead # include CS50.h, et seda kasutada.
>> Noh string on tõesti ainult alias midagi
nimetatakse char *, et kursor iseloomu.
Noh suunanäitajaks, mäletate, on vaid tegeleb.
Mis on suurus baitides string?
Noh see on neli või kaheksa.
Ja põhjus, miks ma öelda nelja või Kaheksa on, sest see tegelikult
sõltub süsteemi, kui te kasutate CS50 ide, char * on suurus char
* On kaheksa, see on 64-bitine süsteem.
Iga aadressi mälus on 64 bitti pikk.
Kui te kasutate CS50 seadme või kasutades mis tahes 32-bit masin,
ja sa oled kuulnud, et aja jooksul 32-bit masin, mis on 32-bitine masin?
Aga see lihtsalt tähendab, et iga aadressi mälus on 32 bitti pikk.
Ja nii 32 bitti on neli baiti.
Nii char * on neli või kaheksa baiti sõltuvalt teie süsteemi.
Ja tõepoolest mingit tüüpi andmeid, ja viit andmeid
kirjuta, sest kõik osuti on vaid aadressid on kokku neli või kaheksa baiti.
Nii saab vaadata seda Skeem ja olgem sõlmida
Selle video väike harjutus siin.
Nii et siin on diagramm jätsime maha alguses video.
Mis juhtub nüüd, kui ma ütlen * pk = 35?
Mida see tähendab, kui ma ütlen, * pk = 35?
Võtke teine.
* pk.
Kontekstis siin, * on apparent operaator.
Nii et kui apparent operaatori kasutamisel
läheme aadress osutas PK ja muudame me leiame.
Nii * pk = 35 tõhusamalt kas see pildile.
Nii et see on põhimõtteliselt süntaktiliselt identne võttes ütles k = 35.
>> Veel üks.
Kui ma ütlen, int m, ma loon uus muutuja nimega m.
Uus kast, see on roheline kast, sest see saab korraldada täisarv,
ja see on märgistatud m.
Kui ma ütlen, m = 4, panin täisarv sellesse kasti.
Kui ütleme pk = & m, kuidas Selle skeemi muutus?
Pk = & m, teha te mäletate, milline & Operaator ei või nimetatakse?
Pea meeles, et & mõned muutuja nimi on aadress muutuja nime.
Mida me tahame öelda, pk saab aadress m.
Ja nii tõhusalt mis juhtub skeem on, et pk enam punkte
k, kuid punkte m.
>> Jällegi viiteid on väga keeruline tööd
ja nad võtavad palju Praktikas aga kuna
nende võime võimaldab teil andmete edastamiseks funktsioonide vahel
ja tegelikult on need Muudatused jõustuvad,
saada oma peas ümber On väga oluline.
Tõenäoliselt on kõige keerulisem teema me käsitleme CS50,
kuid väärtus, et sa saada kasutades viiteid
palju suurem tüsistuste mis on pärit nende õppimise.
Nii et ma soovin teile parimat õnne õppida suunanäitajaks.
Ma olen Doug Lloyd, see on CS50.