>> [TÓNLIST spila]
>> DOUG LLOYD: Ábendingum, hér erum við.
Þetta er líklega að fara að vera sem mest erfitt efni
sem við tölum um í CS50.
Og ef þú hefur lesið eitthvað um ábendingum
áður en þú might vera a lítill hluti erfið að fara inn í þetta myndband.
Það er satt að ábendingum leyfum þér möguleika á
að kannski skrúfa upp frekar illa þegar þú ert
vinna með breytur og gögn, og veldur program til hrun.
En þeir eru í raun mjög gagnlegt og þeir leyfa okkur mjög góð leið
að fara gögn aftur og fram á milli aðgerða,
að við erum annars ekki að gera.
>> Og svo það sem við raunverulega vil gera hér er lest
þú þarft að hafa góða bendi aga, svo að þú getur notað ábendingum raun
að gera áætlanir þínar það mikið betra.
Eins og ég sagði ábendingum gefa okkur annað leið til að fara framhjá gögn á milli aðgerða.
Nú ef þú manst frá fyrr video, þegar
við vorum að tala um Variable Gildissvið, ég nefndi
að öll gögn sem við framhjá milli aðgerðir í C ​​Samþykki gildi.
Og ég má ekki hafa notað það tíma, sem ég þýddi það
var að við erum liggur afrit af gögnum.
Þegar við förum til breytu að aðgerð við erum í raun ekki farið á breytu
að aðgerðinni, ekki satt?
Við erum liggur afrit af þessi gögn til að virka.
Fallið er það sem það mun og það reiknar nokkur gildi,
og kannski við nota þessi gildi þegar það gefur það aftur.
>> Það var ein undantekning að þessi regla um brottför af verðmæti,
og við munum koma aftur til það sem er svolítið seinna í þessu myndbandi.
Ef við notum ábendingum staðinn að nota breytur,
eða í stað þess að nota breytur sjálfir eða afrit af breytum,
við getum nú standast breytur kring milli aðgerða á annan hátt.
Þetta þýðir að ef við tökum breytingu á eina virka,
þessi breyting mun í raun taka áhrif á mismunandi föllum.
Aftur, þetta er eitthvað sem við gátum ekki gert áður,
og ef þú hefur einhvern tíma reynt að skipta á gildi tveim breytum í aðgerð,
þú hefur tekið eftir þessu vandamáli konar creeping upp, ekki satt?
>> Ef við viljum að skipta X og Y, og vér fara þá að fall sem heitir skipti,
inni á virka skipta á breytur gera skipti gildi.
Einn verður tveir, tveir verður einn, en við gerum ekki raunverulega
breyta neinu í upprunalegu virka, í þeim sem hringir.
Þar sem við getum ekki, við erum bara vinna með afrit af þeim.
Með ábendingum þó, við getum reyndar fara X og Y að aðgerðinni.
Sem virka getur gert eitthvað með þeim.
Og þeim breytum gildi geta í raun breyst.
Svo er það alveg breyting á getu okkar til að vinna með gögn.
>> Áður en við kafa inn ábendingum, held ég að það er þess virði
taka nokkrar mínútur til að fara aftur til grunnatriði hér.
Og hafa a líta á hvernig tölva minni verk
því að þessir tveir einstaklingar eru að fara að raunverulega vera nokkuð innbyrðis.
Eins og þú veist líklega, á þinn tölva kerfi
þú hafa a harður ökuferð eða kannski solid ástand ökuferð,
einhvers konar skrá geymsla staðsetning.
Það er yfirleitt einhvers staðar í hverfinu í 250 gígabæta
að kannski nokkra terabytes núna.
Og það er þar sem öll þinn skrár lokum lifa,
jafnvel þó að tölvan þín sé lokað burt, getur þú snúa það aftur á
og þú munt finna skrár eru þar aftur þegar þú endurræsir vélina þína.
En diskur ökuferð, eins og harður diskur ökuferð, An HDD eða solid ástand ökuferð, SSD,
eru bara geymslurými.
>> Við getum í raun ekki gert neitt með gögn sem er í harða diskinn,
eða í A Solid State Drive.
Til að raunverulega breyta gögn eða færa það í kring,
við verðum að færa það til RAM, handahófi aðgang minni.
Nú RAM, þú hafa a einhver fjöldi minna af í tölvunni þinni.
Þú gætir þurft einhvers staðar í hverfinu í 512 megabæti
ef þú ert með eldri tölvu, að kannski tveir, fjórir, átta, 16,
jafnvel smá meira, gígabæta vinnsluminni.
Svo er það miklu minni, en það er þar sem allar rokgjörnum af gögnum.
Það er þar sem við getum breytt hlutum.
En þegar við snúa tölvunni okkar burt, öll gögn í vinnsluminni er eytt.
>> Svo er það hvers vegna við þurfum að hafa harða diskinn fyrir varanlegri staðsetningu henni,
þannig að það exists- það myndi vera mjög slæmt ef í hvert skipti sem við
sneri tölvunni okkar burt, hver skrá í kerfi okkar var eyðilögð.
Þannig að við vinnum inni af vinnsluminni.
Og í hvert skipti sem við erum að tala um minni, ansi mikið, í CS50,
við erum að tala um vinnsluminni, harður diskur.
>> Svo þegar við færa hlutina í minni, það tekur upp ákveðið magn af plássi.
Allar tegundir gagna sem við höfum verið að vinna með
taka upp öðruvísi magn af plássi í vinnsluminni.
Svo í hvert skipti sem þú býrð til er heiltala breyta, fjögur bæti af minni
eru sett til hliðar í vinnsluminni svo þér getur unnið með þeim heiltölu.
Þú getur lýsa heiltölu, breyta því, tengja það
að verðmæti 10 incremented af öðru, svo framvegis og svo framvegis.
Allt sem þarf að gerast í RAM, og þú færð fjögur bæti
að vinna með fyrir hvert heiltala sem þú býrð.
>> Sérhver persóna þér búa fær eitt bæti.
Það er bara hversu mikið pláss er þarf til að geyma persónu.
Sérhver fljóta, alvöru númer fær fjóra bæti
nema það er tvöfaldur nákvæmni fleytitölu
númer sem gerir þér kleift að hafa nákvæmari og tölustafi
eftir kommu án þess að tapa nákvæmni,
sem taka upp átta bæti af minni.
Long þráir, mjög stór heiltölur, einnig taka upp átta bæti af minni.
Hversu margir bæti af minni ekki strengir taka upp?
Jæja við skulum setja pinna í þeirri spurningu nú, en við munum koma aftur til það.
>> Svo aftur á þessa hugmynd af minni sem stór fylking af bæti stærð frumna.
Það er í raun allt það er, það er bara mikið array af frumum,
bara eins og allir aðrir array sem þú ert kunnuglegur með og sjá,
nema hvert frumefni er eitt bæti breiður.
Og rétt eins og fylki, hver þáttur hefur heimilisfang.
Sérhver þáttur af fjölda hefur vísitölu, þá viljum vér
Hægt er að nota þá vísitölu til að gera svokallaða handahófi aðgangur á fjölbreytta.
Við þurfum ekki að byrja á upphaf fylkisins,
iterate gegnum hvert einn þáttur þeirra,
að finna það sem við erum að leita að.
Við getum bara sagt, ég vil fá að 15. þáttur eða 100 frumefni.
Og þú getur bara fara í það númer og fá gildið sem þú ert að leita að.
>> Á sama hátt á hverjum staðsetningu í minni hefur heimilisfang.
Svo gæti minni þitt líta eitthvað eins og this.
Hér er mjög lítill klumpur af minni, þetta er 20 bæti af minni.
Fyrstu 20 bytes því minn fjallar það neðst
eru 0, 1, 2, 3, og svo alla leið upp til 19.
Og þegar ég lýsa breytum og þegar ég byrja að vinna með þeim,
kerfið er að fara að setja hliðar sumir pláss fyrir mig
í þessum minni til að vinna með breytum mínum.
Svo ég gæti sagt, bleikju c jafngildir fjármagn H. Og hvað er að fara að gerast?
Jæja kerfið er að fara að sett til hliðar fyrir mig einn bæti.
Í þessu tilfelli valdi bæti númer fjórir, bæti á netfangið fjórum,
og það er að fara til að geyma bréf höfuðborg H þarna fyrir mig.
Ef ég segi þá int hraða takmörk jafngildir 65, það er
fara að setja til hliðar fjögur bytes af minni fyrir mig.
Og það er að fara til að meðhöndla þá fjögur bæti sem ein heild
vegna þess hvað við erum að vinna með er heiltala hér.
Og það er að fara að geyma 65 þar.
>> Nú þegar ég er svona segja þér smá lygi,
rétt, vegna þess að við vitum að tölvur vinna í tvöfaldur.
Þeir skilja ekki endilega það fjármagn H er
eða hvað 65 er, þeir aðeins skilja tvöfaldur, núll og sjálfur.
Og svo í raun það við erum að geyma í það
er ekki bókstafurinn H og fjölda 65, heldur tvöfaldur framsetning
þar af, þar sem litið lítill eitthvað eins og þetta.
Einkum í Samhengi heiltölu breytu,
það er ekki að fara að bara að spýta hann í, það er ekki að fara að meðhöndla það eins og einn fjögurra
bæti klumpur endilega, það er í raun að fara
að meðhöndla það eins og fjórum eitt bæti bitum, sem gæti litið eitthvað svona.
Og jafnvel er þetta ekki alveg satt heldur,
vegna þess að eitthvað sem heitir An endianness, sem við erum ekki
fara að fá inn núna, en ef þú ert forvitinn um,
þú getur lesið upp á lítið og stór endianness.
En fyrir sakir þessa röksemdafærslu, fyrir sakir þetta myndband,
við skulum gera ráð bara sem er, í staðreynd, hvernig fjöldi 65 myndi
eiga fulltrúa í minni á hverju kerfi,
þó það sé ekki alveg rétt.
>> En við skulum í raun bara fá losa af öllum tvöfaldur alveg,
og hugsa bara um eins H og 65, það er mun auðveldara
að hugsa um það eins og að sem manneskju.
Allt í lagi, svo það virðist einnig kannski lítið handahófi sem I've- kerfið mitt
ekki gefa mér bytes 5, 6, 7, og 8 til að geyma heiltölu.
Það er ástæða fyrir því líka, sem við munum ekki fá inn núna, en nægja
það að segja að það sem tölvan er að gera hér
er líklega gott að færa á sitt leyti.
Að ekki gefa mér minni sem er endilega aftur til baka.
Þó að það er að fara að gera það núna ef ég vil fá annað band,
kallað kenninafn, og ég vil að setja Lloyd þar.
Ég ætla að þurfa að passa einn eðli, hvert bréf um það er
að fara að þurfa einn eðli, eitt bæti af minni.
Þannig að ef ég gæti sett Lloyd í array minn svona ég er nokkuð góð til að fara, ekki satt?
Hvað vantar?
>> Mundu að sérhver strengur við vinnum með í C endar með sviga núll,
og við getum ekki sleppt að hér heldur.
Við þurfum að leggja til hliðar eitt bæti af minni til að halda að svo við
vita þegar strengur okkar er lokið.
Svo aftur að þetta fyrirkomulag af hvernig hlutirnir
birtast í mætti ​​minni vera svolítið af handahófi,
en það er í raun hvernig Flest kerfi eru hönnuð.
Að stilla þeim upp á margfeldi af fjórum, af ástæðum aftur
að við þurfum ekki að fá inn núna.
En þetta, svo nægja að segja að eftir þessar þrjár línur af kóða,
þetta er það sem minni gæti litið út.
Ef ég þarf minni stöðum 4, 8 og 12 til að halda gögnum mínum,
þetta er það sem minni mitt gæti litið út.
>> Og bara vera sérstaklega smámunasamur hér, þegar
við erum að tala um minni viðtakandi Við venjulega
gera það með því að nota sextánskur rithætti.
Svo hvers vegna eigum við ekki að breyta öllum þessum frá aukastaf til sextánskur tákn
bara vegna þess að það er yfirleitt hvernig við tölum um minni.
Svo í stað þess að vera 0 í 19, það sem við höfum er núll
x núll gegnum núll x1 þrjú.
Þeir eru 20 bytes minni að við hafa eða við erum að horfa á í þessari mynd
hérna.
>> Svo öll þessi tilvera, við skulum stíga í burtu frá minni í annað
og aftur ábendingum.
Hér er mikilvægasta hlutur til muna
Eins og við byrjum að vinna með ábendingum.
A bendillinn er ekkert meira en heimilisfang.
Ég segi það aftur vegna þess að það er það mikilvægt,
bendi ekkert meira en heimilisfang.
Ábendingum heimilisföng til staðsetningar í minni þar sem breytur búa.
Vitandi að það verður vonandi svolítið auðveldara að vinna með þeim.
Annar hlutur ÉG eins og að gera er að hafa svona
á skýringarmyndum sjónrænt fulltrúi hvað er gerast með ýmsum línum af kóða.
Og við munum gera þetta nokkrum sinnum í ábendingum,
og þegar við tölum um dynamic minni úthlutun eins vel.
Vegna þess að ég held að þessi skýringarmyndir getur verið sérstaklega gagnlegt.
>> Þannig að ef ég segi til dæmis, int k í númerið mitt, hvað er að gerast?
Jæja hvað er í rauninni að gerast er Ég fæ minni til hliðar fyrir mig,
en ég er ekki einu sinni eins og að hugsa um það svona, ég
eins og til hugsa um það eins og kassi.
Ég er með kassa og það er lituð græn því ég
getur sett heiltölur í grænum kassa.
Ef það var eðli I gæti hafa bláa kassann.
En ég segi alltaf, ef ég er að stofna kassi sem getur haldið heiltölur
sem kassi er lituð græn.
Og ég tek fast merki og ég skrifa k á hlið hennar.
Þannig að ég hef kassa sem heitir K, inn sem ég get sett heiltölur.
Svo þegar ég segi int k, það er hvað gerist í höfðinu á mér.
Ef ég segi K jafngildir fimm, hvað er ég að gera?
Jæja, ég er að setja fimm í reitinn, ekki satt.
Þetta er mjög einfalt, ef Ég segi int k, búa til kassa sem heitir k.
Ef ég segi K er 5, Setti hann fimm inn í reitinn.
Vonandi er það ekki of mikið af stökk.
Hér er þar sem hlutirnir fara a lítið áhugavert þó.
Ef ég segi int * Pk, og jafnvel ef ég er ekki veit hvað þetta endilega þýðir,
það er greinilega með eitthvað að gera við heila tölu.
Þannig að ég ætla að lita þessi kassi græn-ish,
Ég veit að það er með eitthvað að gera með heiltala,
en það er ekki heil tala sjálft, vegna þess að það er int stjarna.
Það er eitthvað örlítið öðruvísi um það.
Svo þátt heiltala er, en annars er það
ekki of frábrugðin hvað við vorum að tala um.
Það er kassi, þess fékk merki, það er þreytandi flokk Pk,
og það er fær um að halda int stjörnur, hvað þá eru.
Þeir hafa eitthvað að gera með heiltölur, greinilega.
Hér er síðasta lína þó.
Ef ég segi PK = & K, hó, það bara gerðist, ekki satt?
Þannig að þetta slembitölu, að því er virðist af handahófi númer fær kastað inn í reitinn þar.
Allt sem er, er PK fær veffang k.
Þannig að ég er stafur þar sem k býr í minni, póstfang, veffang bæti sínum.
Það eina sem ég er að gera er að ég er að segja að gildi er það sem ég ætla
að setja inni kassann minn heitir pk.
Og vegna þess að þetta eru ábendingum, og vegna þess að leita
á band eins núll x átta núll c sjö fjögurra átta
tveir núll er líklega ekki mjög þroskandi.
Þegar við sjón almennt ábendingum, við gerum í raun það sem ábendingum.
Pk gefur okkur upplýsingar við þurfum að finna k í minni.
Svo hefur í rauninni PK ör í það.
Og ef við göngum lengd þess ör, ímynda
það er eitthvað sem þú getur gengið á, ef við ganga meðfram lengd ör,
á mjög þjórfé þess ör, við finnur staðsetninguna í minni
þar sem k býr.
Og það er mjög mikilvægt vegna þess að þegar við vitum þar sem k lifir,
við getum byrjað að vinna með gögn inni minnisins.
Þó að við erum að fá Teeny beit undan okkur nú.
>> Svo er það bendi?
A bendillinn er gögn atriði sem gildi er minni heimilisfang.
Það var að núll x átta núll stuff gangi, sem var minni heimilisfang.
Það var staðsetningu í minni.
Og tegund bendi lýsir því tagi
af gögnum sem þú munt finna á sem minni heimilisfang.
Svo er það int stjarnan hluti rétt.
Ef ég fylgja því ör, það er að fara að leiða mig á stað.
Og þessi staðsetning, hvað ég finnur það í dæmi mínu,
er grænt litað kassi.
Það er heiltala, það er það sem ég munt finna ef ég fer á þetta netfang.
Gögnin gerð a bendillinn lýsir hvað
þú finnur á þeim minni heimilisfang.
Svo hér er raunverulega kaldur hlutur þó.
Ábendingum leyfa okkur að fara breytum milli virka.
Og í raun fara breytur og ekki fara afrit af þeim.
Vegna þess að ef við vitum nákvæmlega hvar í minni til að finna breytu,
við þurfum ekki að gera afrit af það getum við bara farið að þeim stað
og vinna með breytunni.
Svo í raun ábendingum konar af gera tölvu umhverfi
a einhver fjöldi fleiri eins og the raunverulegur veröld, ekki satt.
>> Svo hér er hliðstæðan.
Við skulum segja að ég hef fartölvu, rétt, og það er fullt af athugasemdum.
Og ég vil að þú að uppfæra hana.
Þú ert fall sem uppfærslur athugasemdum, rétt.
Í því hvernig við höfum verið vinna svo langt, það
gerist er að þú verður að taka fartölvuna mína, þú munt fara að afrita búð,
þú munt gera Xerox afrit af hverri síðu af the minnisbók.
Þú munt skilja fartölvuna mína aftur á borðinu mínu þegar þú ert búinn,
þú munt fara og strika út það í minn minnisbók sem eru úrelt eða rangt,
og þá munt þú fara til baka til mér stafla af Xerox síður
sem er eftirmynd af minnisbók minni með þeim breytingum sem þú hefur gert við hann.
Og á þeim tímapunkti, það er komið að mér eins og starf virka, sem hringir,
að ákveða að taka minnismiða og fella þá aftur inn í minnisbók minni.
Þannig að það er mikið af skrefum þátt hér, ekki satt.
Eins og væri það ekki betra ef ég segi bara, hey, getur þú
uppfæra fartölvuna mína fyrir mér, afhenda þér fartölvuna mína,
og þú tekur það og bókstaflega yfir þá út
og uppfæra minnisblöð í minnisbók minni.
Og þá gefa mér fartölvuna mína aftur.
Það er góður af því ábendingum leyfa okkur að gera,
þeir gera þetta umhverfi mikið meira eins og hvernig við störfum í raun.
>> Allt í lagi svo það er það bendi er, við skulum tala
um hvernig ábendingum vinna í C, og hvernig við getum byrjað að vinna með þeim.
Svo er það mjög einfalt bendi í C kallast núll músina.
Null músina stig að engu.
Þetta virðist sennilega eins og það er reyndar ekki mjög gagnlegur hlutur,
en eins og við munum sjá Litlu síðar á, sú staðreynd
að þetta null bendi til staðar reyndar mjög getur komið sér vel.
Og þegar þú býrð til músina, og þú stillir ekki gildi immediately- þess
dæmi um að setja gildi þess strax
verður nokkrar skyggnur aftur þar sem ég sagði PK jafngildir & K,
PK fær tölu k, eins við munum sjá hvað það þýðir,
við munum sjá hvernig á að kóða sem shortly- ef við ekki sett gildi þess að eitthvað
þroskandi strax, þú ættir alltaf
setja músina til þess að benda á núll.
Þú ættir að setja það til að benda á neitt.
>> Það er mjög mismunandi en bara yfirgefa gildi eins og það er
og þá lýsa a bendillinn og bara hrokafullur
það er null því það er sjaldan satt.
Svo þú ættir alltaf að setja gildi bendi
á núll ef þú stillir ekki gildi þess að eitthvað þroskandi strax.
Þú getur athugað hvort verðmæti bendi er er null með jafnrétti rekstraraðila
(==), Bara eins og þú bera saman hvaða tölu gildi eða gildi eðli með (==)
einnig.
Það er sérstakt konar fasti gildi sem þú getur notað til að prófa.
Svo það var mjög einfalt bendillinn er null músina.
Önnur leið til að búa til bendi er að draga
veffang breytu þú hefur nú þegar búið til,
og þú gerir þetta með því að nota & rekstraraðila netfang útdráttur.
Sem við höfum þegar séð áður í fyrsta skýringarmynd dæmi sem ég sýndi.
Svo ef x er breyta sem við höfum þegar búið af gerðinni heiltala,
þá er & x bendi heiltala.
& x er- muna, og er að fara að vinna úr veffang hlutur til hægri.
Og þar bendi er bara netfang, en & x er bendi heiltala
Hvers virði er þar í minni x lífi.
Það er heimilisfang X er.
Svo & x er heimilisfang x.
Við skulum taka þetta einu skrefi frekar og tengja við eitthvað
Ég vék að í fyrri vídeó.
Ef hverfi er fylki af tvíliðaleik, þá & hverfi hornklofi ég er bendi
að tvöfalda.
OK.
ARR ferningur krappi i, ef hverfi er fylki af tvíliðaleik,
þá Arr ferningur krappi ég er i-ta þáttur þessi fylking,
og & ARR veldi krappi ég er þar í minni i-ta þáttur samkl til.
>> Svo er það vísbendingu hér?
An fylki nafn vísbendingu af þessu öllu,
er að nafn fylki er reyndar sjálft bendi.
Þú hefur verið að vinna með ábendingum alla tíð
í hvert sinn sem þú hefur notað fylki.
Muna frá dæminu á breytilegum umfangi,
undir lok the vídeó sem ég kynna dæmi þar sem við erum með virka
kallað sett INT og virka kallað setja array.
Og áskorun til að ákvarða hvort eða ekki, eða hvað
gildi sem við prentuðum út the endir af the virka,
í lok helstu forrit.
>> Ef þú manst frá því dæmi eða ef þú hefur horft á vídeó,
þú veist að þegar þig-kalla til setja INT raun gerir ekki neitt.
En kallið að setja array gerir.
Og ég glossed konar yfir hvers vegna það var raunin á þeim tíma.
Ég sagði bara, vel það er fylki, það er sérstakt, þú veist, það er ástæða.
Ástæðan er sú að fylki er Nafnið er í raun bara músina,
og það er þetta sérstaka hornklofi setningafræði sem
gera hlutina mikið betur að vinna með.
Og þeir gera þá hugmynd að a bendillinn mikið minna erfið,
og það er hvers vegna þeir eru svona af fram á þennan hátt.
En í raun fylki eru bara ábendingum.
Og þess vegna þegar við gert breytingar á array,
þegar við framhjá fjölda sem viðfang að aðgerð eða sem rök
að aðgerð innihald array í raun breyst í bæði callee
og í þeim sem hringir.
Sem fyrir öllum öðrum konar breyta sem við sáum var ekki raunin.
Svo er það bara eitthvað til að halda í huga þegar þú ert að vinna með ábendingum,
er að nafn er array raun bendi
til fyrsta frumefni af þessi array.
>> Allt í lagi svo nú höfum við allt þetta staðreyndir, við skulum halda áfram, ekki satt.
Hvers vegna eigum við að hugsa um þar eitthvað býr.
Jæja eins og ég sagði, það er ansi gagnlegt að vita hvar eitthvað býr
svo þú getur farið þangað og breyta því.
Vinna með það og í raun hafa það, sem þér
langar að gera til þess breytilegum taka gildi, og ekki taka gildi á einhverjum afrit af henni.
Þetta er kallað dereferencing.
Við förum til viðmiðunar og við breytt gildi þar.
Svo ef við höfum músina og það er kallað stk, og það bendir til staf
þá getum við sagt * stk og * stk er nafn af því sem við munum finna ef við förum
á netfangið tölvunni.
Það sem við munum finna það er eðli og * stk er hvernig við vísa til gagna á að
staðsetningu.
Þannig að við gætum sagt eitthvað eins * stk = D eða eitthvað svoleiðis,
og það þýðir að allt sem var minni heimilisfang tölvunni,
hvað karakter var áður það er nú D, ef við segjum * PC = D.
>> Svo hér við fara aftur með sumir furðulegur C dót, ekki satt.
Þannig að við höfum séð * áður eins og að vera einhvern veginn hluti af gögn gerð,
og nú er verið að nota í örlítið mismunandi samhengi
að fá aðgang að gögnum á stað.
Ég veit að það er svolítið ruglingslegt og sem er í raun hluti af þessari heild
eins, hvers vegna ábendingum hafa þetta goðafræði í kringum þá eins og að vera svo flókið,
er góður af a setningafræði vandamál, heiðarlega.
En * er notað í bæði samhengi, bæði sem hluta af gerðinni nafni,
og við munum sjá smá síðar eitthvað annað líka.
Og núna er dereference rekstraraðila.
Svo það fer til viðmiðunar, það notar gögn
á þeim stað á músina, og gerir þér kleift að vinna það að vild.
>> Nú er þetta mjög svipuð heimsækja náunga þinn, ekki satt.
Ef þú veist hvað þitt Nágranni lifir, þú ert
ekki hangandi út með náunga þínum.
Þú veist að þú skyldir vita hvar þeir búa,
en það þýðir ekki að með því að dyggð af því að hafa þá þekkingu
þú ert samskipti við þá.
Ef þú vilt að hafa samskipti við þá, þú þarft að fara heim til þeirra,
þú þarft að fara þangað sem þeir búa.
Og þegar þú gerir það, þá er hægt að hafa samskipti
með þeim bara eins og þú vilt vilt.
Og álíka með breytum, þú þarft að fara á aðsetur þeirra
ef þú vilt að samskipti þeirra, þú getur ekki bara vita á netfangið.
Og hvernig þú ferð á heimilisfang er að nota * er dereference rekstraraðila.
Hvað finnst þér gerist ef við reynum og dereference
bendi sem gildi er núll?
Muna að null bendillinn bendir ekkert.
Svo ef þú reynir og dereference ekkert eða fara á póstfang ekkert,
hvað finnst þér gerist?
Jæja, ef þú giska skiptingu kenna, þú vilt vera rétt.
Ef þú reynir og dereference a null músina,
þú ert a skiptingu kenna. En bíddu,
gerði ég ekki sagt þér, að ef þú ert ekki að fara
að setja gildi þitt af þínum bendi á eitthvað þroskandi,
þú ættir að setja á núll?
Ég gerði og í raun skiptingu kenna er góður af a góða hegðun.
>> Hefur þú lýst alltaf breytu og ekki úthlutað gildi þess strax?
Svo þú segir bara int x; þú ert ekki reyndar framselja það til nokkuð
og þá seinna í kóðanum þínum, þú prentað út verðmæti x,
hafa enn ekki úthlutað það til nokkuð.
Oft þú munt fá núll, en stundum
gæti fengið smá slembitölu, og þú hefur ekki hugmynd um hvar það kom frá.
Á sama hátt getur það gerast með ábendingum.
Þegar þú lýsa bendi int * PK til dæmis,
og þú framselja ekki það að verðmæti, þú færð fjögur bæti fyrir minni.
Whatever fjögur bæti af minni kerfið getur
finna að hafa þroskandi gildi.
Og það gæti hafa verið eitthvað þegar það sem
er ekki lengur þörf af öðru virka, svo þú verður bara
hvað sem gögn voru þar.
>> Hvað ef þú reyndir að gera dereference sumir netfang sem þú don't- það voru
þegar bæti og upplýsingar í það, sem er nú í músina þína.
Ef þú reynir og dereference þess músina, þú gætir verið að fíflast með nokkrum minni
að þú ætlaðir ekki að skipta sér af öllu.
Og í raun að þú gætir gert eitthvað mjög hrikalegt,
eins brjóta annað forrit, eða brjóta aðra virka,
eða gera eitthvað illgjarn að þú ætlar ekki að gera á öllum.
Og svo er það hvers vegna það er reyndar góð hugmynd
að setja ábendingum þínum á núll ef þú ekki setja þá í eitthvað þroskandi.
Það er líklega betri í lok dagsins program
að hrun þá fyrir það að gera Eitthvað sem klikkar
annað forrit eða önnur aðgerð.
Að hegðun er líklega enn minna tilvalið en bara hrun.
Og svo er það hvers vegna það er reyndar góð venja
til að komast inn til að setja ábendingum þínum á núll ef þú stillir ekki þá
að þroskandi gildi strax, er gildi sem þú veist
og að þú getur örugglega að dereference.
>> Svo skulum koma aftur núna og taka a líta á heildar setningafræði af ástandinu.
Ef ég segi int * bls ;, hvað hef ég gert bara?
Það sem ég hef gert er þetta.
Ég veit gildi p er heimilisfang vegna þess að allar ábendingar eru bara
heimilisföng.
Ég get dereference bls með * rekstraraðila.
Í þessu samhengi hér, á mjög toppur muna * er hluti af gerð.
Int * er gögn tegund.
En ég get dereference bls nota * rekstraraðila,
og ef ég geri það, ef ég fer á þetta netfang, hvað finn ég á þetta netfang?
Ég mun finna heiltölu.
Svo er INT * p grundvallaratriðum segja, p er netfang.
Ég get dereference p og ef Ég geri, mun ég finna heiltala
á þeim minni stað.
>> Allt í lagi svo ég sagði það var annar pirrandi hlutur með stjörnum
og hér er þar sem pirrandi hlutur með stjörnum er.
Hefur þú einhvern tíma reynt að lýsa margar breytur af sömu gerð
á sömu línu af kóða?
Svo fyrir annað, þykjast að línan, kóðinn ég hef í raun það í grænu
er ekki þar og það segir bara int x, y og z ;.
Hvað það myndi gera er í raun að búa til þrjú heiltala breytur fyrir þig,
Hét x kallaði eitt Y, og hinn heitir z.
Það er leið til að gera það án þess að þurfa að skipta á þremur línum.
>> Hér er þar sem stjörnur fá pirrandi aftur þó,
vegna þess að * er í raun hluti bæði Sláðu inn heiti og hluti
af breytu nafninu.
Og svo ef ég segi int * px, py, PZ, hvað ég raunverulega fá er bendi heiltala
kallað px og tvær heiltölur, py og PZ.
Og það er líklega ekki hvað við viljum, það er ekki gott.
>> Þannig að ef ég vil búa til margar ábendingar á sömu línu, af sömu tegund,
og stjörnur, sem ég þarf reyndar að gera er að segja int * ári, * Pb, * stk.
Nú hafa bara sagt að og nú segja þér þetta,
þú munt sennilega aldrei gera þetta.
Og það er líklega gott heiðarlega, vegna þess að þú gætir óvart
sleppa stjörnu, eitthvað svoleiðis.
Það er sennilega best að kannski lýsa ábendingum á einstökum línum,
en það er bara annað af þessum pirrandi setningafræði
hluti með stjörnum sem gera ábendingum svo erfitt að vinna með.
Vegna þess að það er bara þetta nokkur dæmi um setningarleg sóðaskapur sem þú þarft að vinna í gegnum.
Með starfi það er virkilega orðið annað eðli.
Ég geri samt mistök með það enn eftir forritun í 10 ár,
svo ekki vera í uppnámi ef eitthvað gerist að þér, er það nokkuð algengt heiðarlega.
Það er í raun eins konar galli á setningafræði.
>> Allt í lagi svo ég lofaði konar að við myndum endurskoðun
hugtakið hversu stór er band.
Jæja ef ég sagt þér að band, höfum við í raun eins konar
verið að ljúga að þér allan tímann.
Það er engin gögn tegund kölluð band, og í raun ég
nefndi þetta í einni af okkar Elstu vídeó á gagnatög,
að strengur var gögn tegund sem var búið til fyrir þig í cs50.h.
Þú þarft að #include Cs50.h í því skyni að nota það.
>> Jæja band er í raun bara samnefni fyrir eitthvað
kallað char *, a bendi á staf.
Jæja ábendingum, muna, eru bara fjallar.
Svo er það stærð í bytes streng?
Jæja það er fjórum eða átta.
Og ástæða þess að ég segi fjögur eða átta er vegna þess að það í raun
veltur á kerfinu, ef þú ert að nota CS50 IDE, char * er á stærð við bleikju
* Er átta, það er 64-bita kerfi.
Sérhver netfang í minni er 64 bitar.
Ef þú ert að nota CS50 tæki eða nota 32-bita vél,
og þú hefur heyrt hugtakið 32-bita vél, hvað er 32-bita vél?
Jæja það þýðir bara að hver heimilisfang í minni er 32 bitar.
Og svo 32 bita er fjögur bæti.
Svo er char * fjórum eða átta bæti eftir vélinni þinni.
Og reyndar allir gagnatög, og bendi á hvaða gögnum
tegund, þar sem allar ábendingar eru bara heimilisföng, eru fjórar eða átta bæti.
Svo skulum rifja þetta skýringarmynd og við skulum gera
þetta video með smá æfingu hér.
Svo hér er skýringarmynd sem við var horfið með á mjög byrjun af the vídeó.
Svo gerist það núna ef ég segi * PK = 35?
Svo hvað þýðir það þegar ég segi, * PK = 35?
Taktu annað.
* Pk.
Í samhengi hér, * er dereference rekstraraðila.
Svo þegar dereference rekstraraðili er notað,
við förum að heimilisfangið benti til eftir pk, og við breyta því sem við finnum.
Svo * PK = 35 áhrifaríkan er þetta á myndinni.
Svo það er í rauninni setningafræðilega eins og af því að hafa sagt k = 35.
>> Einn enn.
Ef ég segi int m, ég skapa nýja breytu sem heitir m.
Ný kassi, það er græna reitinn því það er að fara að halda tölu,
og það er merkt m.
Ef ég segi m = 4, lagði ég heiltala inn kassann.
Ef segja PK = & m, hvernig er Þessi skýringarmynd breyting?
Pk = & m, Manstu hvað á & Rekstraraðila gerir eða heitir?
Mundu að & sumir breyta nafni er heimilisfang breytilegum nafn.
Svo það sem við erum að segja er PK fær veffang m.
Og svo í raun hvað gerist í skýringarmynd er að PK ekki lengur stig
sl, en bendir á m.
>> Aftur ábendingum mjög erfiður að vinna með
og þeir taka mikið af æfa, heldur vegna þess að
getu þeirra til að leyfa þér að fara gögn á milli virka
og í raun hafa þeir breytingar taka gildi,
fá höfuðið í kring er mjög mikilvægt.
Það er líklega flókið efni við ræðum í CS50,
en gildi sem þér fá frá því að nota ábendingar
langt meiri fylgikvillum að koma af því að læra þá.
Svo ég óska ​​ykkur bestu heppni að læra um ábendingum.
Ég er Doug Lloyd, þetta er CS50.