[Powered by Google Translate] [Kafli 4 - öruggari]
[Rob Bowden - Harvard University]
[Þetta er CS50. - CS50.TV]
Við höfum quiz á morgun, ef þið ekki vita það.
Það er í grundvallaratriðum um allt sem þú gætir hafa séð í bekknum eða ætti að hafa séð í bekknum.
Það felur í sér ábendingar, jafnvel þó þeir ert mjög nýleg efni.
Þú ættir að minnsta kosti að skilja mikið magn af þeim.
Nokkuð sem var farið yfir í bekknum sem þú ættir að skilja að próf.
Svo ef þú hefur einhverjar spurningar á þeim, er hægt að spyrja þá nú.
En þetta er að fara til vera a mjög nemandi undir fundur þar sem þið spyrja spurninga,
svo vonandi að fólk hefur einhverjar spurningar.
Hefur einhver hefur einhverjar spurningar?
Já. >> [Nemandi] er hægt að fara yfir ábendingum á ný?
Ég fer yfir ábendingum.
Allar breytur lifa endilega í minni,
en yfirleitt er ekki hafa áhyggjur óður í það og þú segir bara x + 2 og y + 3
og þýðandi mun reikna út hvar hlutirnir eru að lifa fyrir þig.
Þegar þú ert að takast á við ábendingum, nú þú ert sérstaklega að nota þessar minni tölur.
Svo einn breytu mun bara alltaf lifa á einum heimilisfang hverju sinni.
Ef við viljum að lýsa yfir músina, það er gerð að fara að líta út?
>> Mig langar að lýsa yfir músina bls. Hvað tegund út?
[Nemandi] int * p. >> Já. Svo int * p.
Og hvernig get ég það benda á x? >> [Nemandi] merkið.
[Bowden] Svo merkið er bókstaflega kölluð heimilisfang rekstraraðila.
Svo þegar ég segi & x hann er að fá minni vistfang breytu x.
Svo nú hef ég músina p, og hvar í númerið mitt sem ég er að nota * P
eða ég gæti notað X og það verður nákvæmlega sama.
(* P). Hvað er þetta að gera? Hvað gerir þessi stjarna þýðir?
[Nemandi] Það þýðir að verðmæti á þeim tímapunkti. >> Já.
Þannig að ef við lítum á það, það getur verið mjög gagnlegt til að draga út skýringarmyndir
þar sem þetta er lítill kassi af minni fyrir X, sem gerist að hafa gildið 4,
þá höfum við smá kassa af minni fyrir P,
og svo p benda til X, þannig að við draga ör úr P í x.
Svo þegar við segjum * p við erum að segja að fara í kassa sem er á bls.
Star er að fylgja á örina og þá gera hvað sem þú vilt með þessi kassi þarna.
Svo get ég sagt * p = 7, og það mun fara í kassa sem er x og breyting það til 7.
Eða ég gæti sagt int z = * p * 2, Það er flókið, því að stjarna það er, stjarna.
Sá stjörnu er dereferencing p, hitt stjarna er að margfalda með 2.
Tilkynning Ég gæti hafa alveg eins vel í stað * p með x.
Þú getur notað þau á sama hátt.
Og svo seinna ég get haft p benda til alveg nýr hlutur.
Ég get bara sagt p = &z;
Svo nú p ekki lengur stig til X., það bendir til Ö.
Og hvenær ég * P það er það sama og að gera Z.
Svo er gagnlegur hlutur um þetta þegar við byrjum að fá í aðgerðum.
>> Það er góður af gagnslaus að lýsa bendi sem bendir á eitthvað
og þá þú ert bara dereferencing það
þegar þú gætir hafa notað upprunalega breytu til að byrja með.
En þegar þú kemst inn í störf - þannig að við skulum segja að við höfum sumir virka, int foo,
sem tekur bendi og bara er * P = 6;
Eins og við sáum áður með skipti, getur þú ekki að gera skilvirka skipti og sér virka
bara farið heiltölur því allt í C er alltaf farið með verðmæti.
Jafnvel þegar þú ert að labba framhjá ábendingum þú ert liggur við gildi.
Það gerist bara svo að þessi gildi eru minni viðtakandi.
Svo þegar ég segi foo (p), ég ætla að standast bendilinn í fallinu foo
og þá foo er að gera * P = 6;
Svo inni í þeim virka, * p er enn um X,
en ég get ekki notað x inni sem virka vegna þess að það er ekki scoped innan sem virka.
Svo er * p = 6 eina leiðin sem ég get aðgang að staðbundin breytu úr annan valkost.
Eða vel, ábendingum eina leiðin sem ég get aðgang að staðbundin breytu úr annan valkost.
[Nemandi] skulum segja að þú vildir skila músina. Hvað nákvæmlega gerir þú það?
[Bowden] aftur bendi eins og eitthvað eins og int y = 3, aftur & y? >> [Nemandi] Já.
[Bowden] lagi. Þú ættir aldrei að gera þetta. Þetta er slæmt.
Ég held að ég sá í þessum fyrirlestur skyggnur þú byrjaðir að sjá þetta allt skýringarmynd af minni
þar upp hér að þú hafir fengið minni heimilisfang 0
og niður þú ert minni heimilisfang 4 gigs eða 2 við 32.
Svo þú hefur fengið smá dót og smá dót og svo þú stafla þinn
og þú hefur fengið hrúga þitt, sem þú byrjaðir bara að læra um, að alast upp.
[Nemandi] Er ekki hrúga ofan stafla?
>> Já. Hrúga er ofan á, er það ekki? >> [Nemandi] Ja, hann setti 0 ofan.
[Nemandi] Ó, setti hann 0 á toppinn. >> [Nemandi] Ó, allt í lagi.
Fyrirvari: Einhvers staðar með CS50 þú ert að fara að sjá það með þessum hætti. >> [Nemandi] lagi.
Það er bara að þegar þú ert að sjá stafla,
eins og þegar þú hugsa um stafla þú hugsa um stöflun það ofan á annan.
Þannig að við tilhneigingu til að Flip það í kring svo að stafla er að vaxa upp eins og stafla venjulega myndi
stað stafla hangandi niður. >> [Nemandi] ekki hrúga tæknilega vaxa upp of, þó?
Það fer eftir því hvað þú átt við með að vaxa upp.
Stafla og hrúga vaxa alltaf í gagnstæða átt.
A stafla er alltaf að vaxa upp í þeim skilningi að það er að alast upp
til hærri minni heimilisföng og hrúga er að vaxa niður
á að það er að vaxa til lægri minni tölur.
Svo er efst 0 og botninn er hár netföng minni.
Þeir eru báðir að vaxa, bara í andstæðar áttir.
[Nemandi] ég ætlaði bara að því að þú sagðir að setja stafla á botninum
vegna þess að það virðist meira innsæi vegna þess að á mánudaginn til að byrja efst á hrúga,
hrúga er ofan á sig líka, svo that's - >> Já.
Þú heldur líka að hrúga sem vaxa upp og stærri, en stafla meira svo.
Svo er stafla sá sem við viljum svona til að sýna að vaxa upp.
En alls staðar þú lítur annars er að fara að sýna heimilisfang 0 efst
og hæsta minni heimilisfang neðst, þannig að þetta er venjulega skoðun þín á minni.
>> Ert þú með spurningu?
[Nemandi] Getur þú sagt okkur meira um hrúga?
Já. Ég næ að því í annað.
First, fara til baka til hvers aftur & Y er slæmt,
á stafla þú ert með fullt af römmum stafla sem tákna allar aðgerðir
sem hafa verið kölluð.
Svo hunsa fyrri hluti, efst á stafla er alltaf að fara að vera aðal virka
því það er fyrsta fall sem er að vera kölluð.
Og svo þegar þú hringir annað virka, stafla er að fara að vaxa niður.
Svo ef ég kalla sumir virka, Foo, og það fær sér stafla ramma þess,
það er hægt að kalla sumir virka, bar, það fær eigin stafla ramma þess.
Og bar gæti verið endurkvæma og það gæti kalla sig,
og svo annað símtal á bar er að fara að fá sér stafla ramma þess.
Og svo það sem fer í þessum stafla ramma eru allar staðbundnar breytur
og alla virka rök að -
Allir hlutir sem eru á staðnum scoped þessa aðgerð fara í þessum stafla ramma.
Svo þýðir að þegar ég sagði eitthvað eins og barinn er fall,
Ég ætla bara að lýsa heiltölu og síðan aftur bendi til að heiltölu.
Svo hvar er Y lifa?
[Nemandi] Y býr í bar. >> [Bowden] Já.
Einhvers staðar í þessu litla veldi af minni a littler ferningur sem hefur y í það.
Þegar ég aftur & y, ég er aftur bendi á þessu litla blokk minni.
En svo þegar skilar, stafla ramma þess fær smella af stafla.
Og það er hvers vegna það er kallað stafla.
Það er eins og gögn stafla uppbyggingu, ef þú veist hvað það er.
Eða jafnvel eins og stafla af stæði er alltaf dæmi,
Helsta er að fara að fara á the botn, þá fyrst virka þú hringir er að fara að fara á toppur af þessi,
og þú getur ekki fengið til baka helstu þar til þú aftur frá öllum aðgerðum sem hafa verið kölluð
sem hafa verið sett ofan á það.
>> [Nemandi] Svo ef þú did ekki skila og Y, sem gildi geta breyst án fyrirvara.
Já, it's - >> [nemandi] Það gæti verið skrifað yfir hana. >> Já.
Það er alveg - Ef þú ert að reyna og -
Það myndi einnig vera int * barnum vegna þess að það er aftur bendi,
svo er aftur gerð þess int *.
Ef þú reynir að nota skilagildi þessa aðgerð, það er óskilgreint hegðun
því að bendillinn bendir slæmt minni. >> [Nemandi] lagi.
Svo hvað ef, til dæmis, þú lýst int * y = malloc (sizeof (int))?
Það er betra. Já.
[Nemandi] Við töluðum um hvernig þegar við draga það að endurvinna kassi okkar
þeir eru ekki í raun þurrkast út, við missa bara ábendingum þeirra.
Þannig að í þessu tilfelli höfum við eyða í raun gildi eða er það enn í minni?
Fyrir the hluti, það er að fara til enn vera there.
En við skulum segja að við séum skyldir hringja eitthvað annað virka, Baz.
Baz er að fara að fá sér stafla ramma þess hér.
Það er að fara að skrifa of mikið öll þessi efni,
og þá ef þú reynir seinna og nota músina sem þú fékkst áður,
það er ekki að fara að vera sú sama gildi.
Það er að fara að hafa breyst aðeins vegna þess að þú heitir virka Baz.
[Nemandi] En við höfðum ekki, myndum við fá enn 3?
[Bowden] Að öllum líkindum væri þú.
En þú getur ekki treyst á það. C segir bara óskilgreindur hegðun.
>> [Nemandi] Ó, er það. Allt í lagi.
Svo þegar þú vilt koma aftur með músina, þetta er þar sem malloc koma í notkun.
Ég er að skrifa í raun bara aftur malloc (3 * sizeof (int)).
Við munum fara yfir malloc meira í annað, en hugmyndin um að malloc er öllum staðbundnum breytur
alltaf að fara á mánudaginn.
Nokkuð sem er malloced fer á hrúga, og það mun að eilífu og alltaf vera á hrúga
þar til þú frjáls sérstaklega það.
Svo þýðir þetta að þegar þú malloc eitthvað, það er að fara að lifa eftir skilar.
[Nemandi] Mun það lifa eftir að forritið hættir að keyra? >> Nei
Jæja, svo það er að fara að vera þar þangað til forritið er alveg gert gangi. >> Já.
Við getum farið yfir upplýsingar um hvað gerist þegar forritið hættir að keyra.
Þú gætir þurft að minna mig, en það er sérstakt hlutur alveg.
[Nemandi] Svo malloc skapar músina? >> Já.
Malloc - >> [nemandi] Ég held malloc tilnefnir blokk minni sem bendillinn getur notað.
[Bowden] Ég vil að skýringarmynd aftur. >> [Nemandi] Þannig virkar þessi aðgerð, þó?
[Nemandi] Já, malloc tilnefnir blokk af minni sem hægt er að nota,
og þá skilar það veffang fyrstu blokk sem minni.
>> [Bowden] Já. Svo þegar þú malloc, þú ert grabbing sumir blokk af minni
það er nú í hrúga.
Ef hrúga er of lítill, þá er hrúga er bara að fara að vaxa, og það vex í þessa átt.
Svo skulum segja að hrúga er of lítill.
Þá er það um að vaxa smá og aftur bendi á þessa blokk sem bara jókst.
Þegar þú frjáls efni, þú ert að gera meira pláss í hrúga,
svo þá síðar kalla á malloc getur endurnýta þessi minni sem þú hafðir áður leysti.
The mikilvægur hlutur óður malloc og ókeypis er að það gefur þér fullkomna stjórn
á líftíma þessara minni blokkir.
Global breytur eru alltaf lifandi.
Local breytur eru á lífi innan gildissviðs þeirra.
Um leið og þú ferð framhjá hrokkið borsveif, eru staðbundnar breytur dauður.
Malloced minni er lifandi þegar þú vilt það til að vera á lífi
og þá er út þegar þú segir það að gefa út.
Þeir eru í raun aðeins 3 tegundir af minni, í raun.
Það er sjálfvirk minni stjórnun, sem er stafla.
Hlutirnir gerast fyrir þig sjálfkrafa.
Þegar þú segir int x, er minni úthlutað fyrir int x.
Þegar x fer út af umfangi, er minni endurheimta fyrir x.
Þá er það dynamic minni stjórnun, sem er það malloc er,
sem er þegar þú hefur fulla stjórn.
Þú ákveður virk þegar minni ætti og ætti ekki að vera úthlutað.
Og þá er það fast, sem þýðir bara að það varir að eilífu,
sem er það alþjóðlegt breytur eru.
Þeir eru bara alltaf í minni.
>> Spurningar?
[Nemandi] Getur þú skilgreina blokk bara með því að nota hrokkið axlabönd
en ekki að þurfa að hafa óákveðinn greinir í ensku ef yfirlýsingu eða meðan yfirlýsingu eða eitthvað svoleiðis?
Þú getur slegið inn blokk eins og í aðgerð, en það hefur ekki hrokkið axlabönd líka.
[Nemandi] Svo þú getur ekki bara eins handahófi par af hrokkið axlabönd í kóðanum þínum
sem hafa staðbundin breytum? >> Já, þú getur.
Inni á int bar við gætum hafa {int y = 3;}.
Það er ætlast til að vera hérna.
En það skilgreinir algjörlega umfang int y.
Eftir að seinni hrokkið borsveif, getur Y ekki að nota lengur.
Þú næstum aldrei gera það, þó.
Getting bak til hvað gerist þegar forrit lýkur,
það er eins konar misskilningur / hálf liggja að við gefum til að bara gera hlutina auðveldari.
Við segja þér að þegar þú skiptir minni
þú ert að úthluta sumir klumpur af vinnsluminni fyrir þá breytu.
En þú ert í raun ekki beint að snerta vinnsluminni alltaf í áætlunum þínum.
Ef þér finnst um það, hvernig ég teiknaði -
Og í raun, ef þú ferð í gegnum í gdb þú munt sjá það sama.
Óháð því hversu oft þú keyrir forrit eða hvaða forrit sem þú ert að keyra,
stafla er alltaf að fara að byrja -
þú ert alltaf að fara að sjá breytum um netfang oxbffff eitthvað.
Það er yfirleitt einhvers staðar á því svæði.
En hvernig geta 2 forrit hugsanlega hafa ábendingum á sama minni?
[Nemandi] Það er eitthvað handahófskennt tilnefningu þar oxbfff er ætlað að vera á RAM
sem geta í raun verið á mismunandi stöðum eftir þegar fallið var kallað.
Já. Hugtakið er raunverulegur minni.
Hugmyndin er að hvert einasta ferli, hvert einasta forrit sem er í gangi á tölvunni þinni
hefur eigin - við skulum gera ráð fyrir 32 bita - alveg óháð heimilisfang rúm.
Þetta er heimilisfang rúm.
Það hefur eigið alveg óháð sína 4 gígabæta til að nota.
>> Svo ef þú keyrir 2 forrit samtímis, þetta forrit sér 4 gígabæta til að sjálfu sér,
Þetta forrit sér 4 gígabæta til að sjálfu sér,
og það er ómögulegt fyrir þetta forrit til dereference bendi
og á endanum með minni frá þessu forriti.
Og hvað raunverulegur minni er er kortlagning frá ferli heimilisfang rúm
raunverulegum hlutum á vinnsluminni.
Svo það er allt að stýrikerfi til að vita það,
hey, þegar þessi strákur dereferences bendillinn oxbfff, sem raunverulega þýðir
að hann vill RAM bæti 1000,
en ef þetta forrit dereferences oxbfff, vill hann virkilega RAM bæti 10000.
Þeir geta vera geðþótta langt í sundur.
Þetta er jafnvel rétt af hlutum í einu ferli heimilisfang rúm.
Svo eins og það sér öll 4 gígabæta í sjálfu sér, en við skulum segja -
[Nemandi] er hvert einasta ferli -
Segjum að þú ert með tölvu með aðeins 4 gígabæta vinnsluminni.
Er hvert einasta ferli sjá heilu 4 gígabæta? >> Já.
En 4 gígabæta það sér er lygi.
Það er það bara telur sem það hefur allt þetta minni vegna þess að það veit ekki önnur aðferð til.
Það mun aðeins nota eins mikið minni og það þarf í raun og veru.
Stýrikerfið er ekki að fara að gefa vinnsluminni í þessu ferli
ef það er ekki að nota hvaða minni í þessu öllu svæðinu.
Það er ekki að fara að gefa það minni fyrir héraðið.
En hugmyndin er að - ég er að reyna að hugsa um - ég get ekki hugsað um líkingar.
Svipað er erfitt.
Eitt þeirra mála af raunverulegur minni eða eitt af því sem það er að leysa
að ferli ætti að vera alveg ókunnugt um annað.
Og svo þú getur skrifað hvaða forrit sem dereferences bara allir músina,
eins og bara skrifa forrit sem segir * (ox1234)
dereferencing og það er minni heimilisfang 1234.
>> En það er allt til stýrikerfi til þá þýða hvað 1234 þýðir.
Svo gerist ef 1234 að vera gilt minni heimilisfang fyrir þessu ferli,
eins og það er á mánudaginn eða eitthvað, þá er þetta mun skila gildi þess minni heimilisfang
eins langt og ferlið veit.
En ef 1234 er ekki gilt netfang, eins og það gerist að lenda
í sumum lítill stykki af minni hér sem er handan við stafla og utan hrúga
og þú hefur í raun ekki að nota það, þá er það þegar þú færð hlutina eins segfaults
vegna þess að þú ert að snerta minni sem þú ættir ekki að vera að snerta.
Þetta er einnig satt -
A 32-bita kerfi, 32 bita þýðir að þú þarft 32 bita til að skilgreina minni heimilisfang.
Það er ástæðan fyrir ábendingum eru 8 bæti því 32 bita eru 8 bæti - eða 4 bæti.
Ábendingar eru 4 bytes.
Svo þegar þú sérð músina eins oxbfffff, sem er -
Innan hverjum forrit sem þú getur bara byggja einhverja músina,
hvar ox0 til uxar 8 f's - ffffffff.
[Nemandi] ekki að segja að þeir eru 4 bytes? >> Já.
[Nemandi] Þá hvert bæti verður - >> [Bowden] Sextánskt.
Sextánskt - 5, 6, 7, 8. Svo ábendingum sem þú ert að fara að alltaf að sjá í sextánskur.
Það er bara hvernig við flokka ábendingum.
Sérhver 2 tölustafi sextánskur er 1 bæti.
Þannig að það er að fara að vera 8 sextánskur tölustafir fyrir 4 bæti.
Svo hvert einasta músina á 32-bita kerfi er að fara að vera 4 bæti,
sem þýðir að í ferli sem þú getur reisa einhverja 4 bæti
og gera músina út af því,
sem þýðir að svo miklu leyti sem það er kunnugt, það getur takast heilt 2 við 32 bæti af minni.
Jafnvel þó að það er í raun ekki að hafa aðgang að þeim,
jafnvel ef þinn tölva hefur aðeins 512 megabæti, telur það hefur það mikið minni.
Og stýrikerfi er sviði nógur að það verður bara tekið það sem þú þarft í raun.
Það þýðir ekki bara að fara, ó, ný aðferð: 4 gigs.
>> Já. >> [Nemandi] Hvað uxa þýtt? Hvers vegna skrifa þú það?
Það er bara tákn fyrir sextánskur.
Þegar þú sérð númer byrja með uxa, eru síðari hluti sextánskur.
[Nemandi] Þú varst að útskýra um hvað gerist þegar forrit lýkur. >> Já.
Hvað gerist þegar forrit lýkur er stýrikerfi
bara þurrka þær kortlagning sem það hefur til þessara talna, og það er það.
Stýrikerfið getur nú bara gefa þessi minni í annað forrit til að nota.
[Nemandi] lagi.
Svo þegar þú skiptir eitthvað á hrúga eða á mánudaginn eða alþjóðlegum breytur eða neitt,
þeir bara hverfa um leið og forritið lýkur
vegna þess að stýrikerfið er nú frjálst að gefa að minni að öðrum ferli.
[Nemandi] Jafnvel þó að það eru sennilega enn gildi skrifað á? >> Já.
Gildin eru líklega enn.
Það er það bara að fara að vera erfitt að komast á þá.
Það er miklu erfiðara að komast á þá en það er að komast á brott skrá
því eytt skrá konar situr þar í langan tíma og harður ökuferð er mikið stærri.
Svo það er að fara að skrifa mismunandi hluta af minni
áður en það verður að skrifa í klumpur af minni að þessi skrá er notað til að vera á.
En helstu minni, RAM, þú flett í gegnum mikið hraðar,
svo það er að fara að mjög hratt að skrifa of mikið.
Spurningar um þetta eða eitthvað annað?
[Nemandi] Ég hef spurningar um mismunandi efni. >> Lagi.
Hefur einhver hefur einhverjar spurningar um þetta?
>> Allt í lagi. Mismunandi efni. >> [Nemandi] lagi.
Ég var að fara í gegnum sumir af the æfa próf,
og einn af þeim var að tala um sizeof
og gildi það skilar eða mismunandi ýmsum tegundum. >> Já.
Og það sagði að bæði int og lengi bæði aftur 4, þannig að þeir eru báðir 4 bæti.
Er einhver munur milli heiltala og a langur, eða er það það sama?
Já, það er munur.
The C Standard -
Ég er líklega að fara að skipta sér upp.
C staðall er bara eins og það C, opinber gögn um C.
Þetta er það sem það segir.
Svo segir C staðall bara að bleikju mun að eilífu og alltaf 1 bæti.
Allt eftir því - stutt er alltaf bara skilgreint sem að vera meira en eða jafnt í bleikju.
Þetta gæti verið stranglega meiri en, en ekki jákvætt.
An int er bara skilgreind sem meira en eða jafnt og stutt.
Og lengi er bara skilgreind sem meira en eða jafnt heiltala.
Og lengi lengi er meiri en eða jafn og fyrir.
Svo er það eina sem C staðall skilgreinir hlutfallsleg röðun öllu.
Raunveruleg upphæð minni að það tekur upp er yfirleitt allt til framkvæmda,
en það er nokkuð vel skilgreind á þessu stigi. >> [Nemandi] lagi.
Svo stuttbuxur eru nánast alltaf að fara að vera 2 bytes.
Ints eru nánast alltaf að fara að vera 4 bæti.
Long þráir eru nánast alltaf að fara að vera 8 bæti.
Og þráir, það fer eftir því hvort þú ert að nota a 32-bita eða 64-bita kerfi.
Svo lengi er að fara að vinna í samræmi við þá tegund af kerfi.
Ef þú ert með 32-bita kerfi eins og búnaðinn, það er að fara að vera 4 bæti.
Ef þú ert með 64-bita eins og a einhver fjöldi af nýlegum tölvum, það er að fara að vera 8 bæti.
>> Ints eru nánast alltaf 4 bæti á þessum tímapunkti.
Long þráir eru næstum alltaf 8 bæti.
Í the fortíð, ints notað til að aðeins 2 bytes.
En eftir að þetta fullkomlega uppfyllir öll þessi tengsl stærra en og jafnt.
Svo lengi er fullkomlega leyfilegt að vera í sömu stærð sem heiltölu,
og það er líka leyfilegt að vera í sömu stærð og fyrir lengi.
Og það gerist bara svo að vera að í 99,999% af kerfi, það er að fara að vera jafn
annaðhvort int eða fyrir löngu. Það veltur bara á 32-bita eða 64-bita. >> [Nemandi] lagi.
Í flotum, hvernig er kommu tilnefnd í skilmálar af bitum?
Eins og tvöfaldur? >> Já.
Þú þarft ekki að vita það fyrir CS50.
Þú þarft ekki einu sinni að læra að í 61.
Þú lærir ekki að í raun á hvaða námskeið.
Það er bara framsetning.
Ég gleymi nákvæmlega allotments hluti.
Hugmyndin um fljótandi lið er að þú úthluta tilteknum fjölda bita til að tákna -
Í grundvallaratriðum, allt er í vísindalegum merki.
Svo þú úthluta tilteknum fjölda bita til að tákna fjölda sjálft, eins og 1,2345.
Ég get aldrei tákna fjölda með fleiri stafi en 5.
Þá skiptir einnig tilteknum fjölda bita þannig að það hefur tilhneigingu til að vera eins og
þú getur aðeins farið upp í ákveðinn fjölda, eins og það er stærsta veldisvísir sem þú getur haft,
og þú getur bara farið niður að ákveðnu veldisvísir,
eins sem er minnsti veldisvísir þú getur haft.
>> Ég man ekki nákvæmlega bits leið er úthlutað öllum þessum gildum,
en ákveðinn fjöldi bita eru tileinkuð 1,2345,
annar ákveðinn fjölda bita eru tileinkuð veldisvísir,
og það er aðeins hægt að tákna veldisvísinn af ákveðinni stærð.
[Nemandi] og tvöfalda? Er það eins og extra langt fljóta? >> Já.
Það er það sama sem fljóta nema nú þú ert að nota 8 bæti í stað 4 bæti.
Nú munt þú vera fær um að nota 9 tölustafi eða 10 tölustafi,
og þetta mun vera fær um að fara upp í 300 í stað 100. >> [Nemandi] lagi.
Og fljóta eru einnig 4 bæti. >> Já.
Jæja, aftur veltur það líklega almennt á framkvæmd,
en flýtur eru 4 bytes, eru tvöfaldar 8.
Doubles kallast tvöfaldur vegna þess að þeir eru tvöfalt stærð flotum.
[Nemandi] lagi. Og eru það tvöfaldar tvöfaldur? >> Það eru ekki.
Ég held - >> [nemandi] Eins lengi þráir? >> Já. Ég held ekki. Já.
[Nemandi] Á próf á síðasta ári var spurning um helstu virkni
þurfa að vera hluti af kerfinu þínu.
Svarið var að það þarf ekki að vera hluti af kerfinu þínu.
Í hvaða aðstæðum? Það er það sem ég sá.
[Bowden] Það virðist - >> [nemandi] Hvaða aðstæður?
Ertu með vandamál? >> [Nemandi] Já, ég get örugglega draga það upp.
Það þarf ekki að vera, tæknilega, en í grundvallaratriðum það er að fara til vera.
[Nemandi] Ég sá einn á annað ári.
Það var eins og True eða False: Gilt - >> Ó, C skrá.?
. [Nemandi] Allir C Skráin verður að hafa - [bæði að tala í einu - óskiljanlegur]
Allt í lagi. Svo er það aðskilið.
>> A. C skrá þarf bara að vera virka.
Þú getur safna saman skrá í kóða vél, tvöfaldur, hvað,
án þess að vera executable enn.
Gilt executable verður að hafa helstu hlutverk.
Þú getur skrifað 100 aðgerðir í 1 skrá en ekki helstu
og svo saman að ofan til tvöfaldur,
þá skrifa aðra skrá sem aðeins hefur helsta en það kallar fullt af þessum aðgerðum
í tvöfaldur skrá hérna.
Og svo þegar þú ert að gera executable, það er það sem linker gerir
það sameinar þessar 2 tvöfaldur skrár inn í executable.
Svo. C skrá þarf ekki að hafa meginhlutverki yfirleitt.
Og stór bækistöðvar kóða sem þú munt sjá þúsundir. C skrá og 1 helstu skrá.
Fleiri spurningar?
[Nemandi] Það var annar spurning.
Það sagði að er þýðanda. True eða False?
Og svarið var rangt, og ég skildi hvers vegna það er ekki eins og Clang.
En hvað köllum að gera ef það er ekki?
Gera er í rauninni bara - ég get séð nákvæmlega hvað það kallar það.
En það liggur bara skipanir.
Gerðu.
Ég get rífa þetta upp. Já.
Ó, já. Gera er einnig að.
Þetta segir tilgangur gera gagnsemi er að ákveða sjálfkrafa
hvaða stykki af stórum program þarf að recompiled
og gefa út skipanir til að laun þeirra.
Þú getur gert skrár sem eru alveg gríðarstór.
Gerðu lítur á tíma frímerki af skrám og eins og ég sagði áður,
þú getur safna saman einstakar skrár niður, og það er ekki fyrr en þú færð að linker
að þeir setja saman í keyrsluskrá.
Svo ef þú ert með 10 mismunandi skrár og þú gerir breytingar til 1 af þeim,
þá er það að gera er að fara að gera bara laun að 1 skrá
og þá relink allt saman.
En það er miklu Dumber en það.
Það er komið að þér að alveg skilgreina að það er það sem það ætti að gera.
Það sjálfgefið hefur getu til að viðurkenna þennan stimpil tíma efni,
en þú getur skrifað að gera skrá að gera neitt.
Þú getur skrifað að gera skrána þannig að þegar þú skrifar að það bara CD í aðra möppu.
Ég var að fá svekktur vegna þess að ég tittur allt inni tækis míns
og þá er ég að skoða PDF frá Mac.
>> Svo fer ég í Finder og ég get ekki fara, að tengjast við miðlara,
og þjónustan sem ég tengst er Appliance minn, og þá vil ég opna PDF
sem fær unnin af latexi.
En ég var að fá svekktur vegna þess að hvert einasta skipti sem ég þarf að uppfæra PDF,
Ég þurfti að afrita það til a sérstakur skrá að það gæti nálgast
og það var að fá pirrandi.
Svo í stað þess að ég skrifaði að gera skrá, sem þú þarft að skilgreina hvernig það gerir það.
Hvernig þú gerir í þessu er PDF LaTeX.
Rétt eins og allir aðrir gera skrá - eða ég giska á að þú hefur ekki séð gera skrá,
en við höfum í tækið á heimsvísu gera skrá sem bara segir,
Ef þú ert að setja saman C skrá, nota Clang.
Og svo hér í skrá gera sem ég að gera ég segi,
þessi skrá sem þú ert að fara til að vilja taka saman við PDF LaTeX.
Og svo er það PDF LaTeX sem er að gera frágang.
Gera ekki gerð. Það er bara að keyra þessar skipanir í röð sem ég tilgreint.
Svo rekur PDF latex, afrit það það til að skrá að ég vil það til að afrita,
það er CD til að skrá og gerir aðra hluti,
en allt það gerir er að viðurkenna þegar skrá breytingar,
og ef það breytist, þá mun það að keyra skipanir sem það er ætlast til að keyra
þegar skrá breytingar. >> [Nemandi] lagi.
Ég veit ekki hvar á heimsvísu skrár gera er fyrir mig að athuga það út.
Aðrar spurningar? Nokkuð frá fortíðinni Skyndipróf? Allir músina hluti?
Það eru lúmskur hluti með ábendingum eins -
Ég ætla ekki að fara að vera fær um að finna quiz spurning um það -
en rétt eins og þessa tegund af hlutur.
Gakktu úr skugga um að þú skiljir að þegar ég segi int * x * y -
Þetta er ekki nákvæmlega neitt hérna, held ég.
En eins og * x * y, þá eru 2 breytur sem eru í stafla.
Þegar ég segi x = malloc (sizeof (int)), x er enn breyta á mánudaginn,
malloc er einhver blokk yfir í hrúga, og við erum með x benda á hrúga.
>> Svo eitthvað um stafla bendir á hrúga.
Alltaf þegar þú malloc neitt, þú ert óhjákvæmilega að geyma það inni í músina.
Svo að bendillinn er á mánudaginn, sem malloced blokk er á hrúga.
A einhver fjöldi af fólk fá rugla og segja int * x = malloc, x er á hrúga.
Nei Hvað x bendir til er á hrúga.
x sjálft er á mánudaginn, nema af einhverri ástæðu þú hefur verið x alþjóðlegt breytu,
en þá gerist það að vera í öðru svæði af minni.
Svo halda utan eru þessar kassi og ör skýringarmyndir nokkuð algengt fyrir próf.
Eða ef það er ekki á próf 0, verður það að vera á prófinu 1.
Þú ættir að vita allt um þetta, skref í söfnun
þar sem þú þurftir að svara spurningum um þær. Já.
[Nemandi] Gat við förum yfir þeim skrefum - >> Sure.
Áður skref og setja saman við höfum forvinnu,
safna saman, samsetningu, og tengja.
Forvinnu. Hvað þýðir það að gera?
Það er einfaldasta skref í - ja, ekki eins -
það þýðir ekki að það ætti að vera augljóst, en það er auðveldasta skrefið.
Þið krakkar geta framkvæma það sjálf. Já.
[Nemandi] Taktu það sem þú hefur í þinn inniheldur svona og afritar og þá einnig skilgreinir.
Það lítur út fyrir hluti eins og # include og # skilgreina,
og það bara afrit og deig hvað þeir meina í raun og veru.
Svo þegar þú segir # include cs50.h er Preprocessor er að afrita og líma cs50.h
í þeirri línu.
Þegar þú segir # skilgreina x að vera 4, Preprocessor fer í gegnum allt forritið
og kemur öllum tilvikum af x með 4.
Svo tekur Preprocessor gilt C skrá og framleiðsla gilt C skrá
þar sem hlutirnir hafa verið afrituð og líma.
Svo nú að setja saman. Hvað þýðir það að gera?
[Nemandi] Það fer úr C í tvöfaldur.
>> [Bowden] Það þýðir ekki að fara alla leið til tvöfaldur.
[Nemandi] Til vél númer þá? >> Það er ekki vél númer.
[Nemandi] þing? >> Þing.
Það fer til þingsins áður en það fer alla leið til C kóða,
og flest tungumál að gera eitthvað eins og this.
Veldu hvaða hár-láréttur flötur tungumál, og ef þú ert að fara að þýða það,
það er líklegt til að safna saman í skrefum.
Fyrst það er að fara að safna saman Python í C, þá er að fara að safna saman C til þingsins,
og svo þingið er að fara að fá þýða að tvöfaldur.
Svo að setja saman er að fara að koma með það frá C til þingsins.
Orðið að setja saman þýðir yfirleitt koma það frá meiri
til lægra stigi forritunarmál.
Svo er þetta eina skrefið í samantekt þar sem þú byrjar með a hár-láréttur flötur tungumál
og endar í lágu stigi tungumál, og það er hvers vegna það skref er kölluð söfnun.
[Nemandi] Á samantekt, við skulum segja að þú hafir gert # include cs50.h.
Mun þýðandinn laun cs50.h, svona aðgerðir sem eru þar,
og þýða það inn í kóða þingi og vel,
eða mun það afrita og líma eitthvað sem hefur verið fyrir þingið?
cs50.h mun nánast aldrei endað á þingi.
Stuff eins og frumgerð virka og hlutirnir eru bara fyrir þig að vera varkár.
Það tryggir að þýðandinn getur athugað það eins og þú ert að kalla aðgerðir
með rétta tegund aftur og rétt rök og efni.
>> Svo cs50.h verður preprocessed í skrá, og svo þegar hún er gerð
það er í rauninni hent eftir að það gerir viss um að allt er kallað rétt.
En aðgerðir skilgreindar í CS50 bókasafn, sem eru aðskilin frá cs50.h,
þá verður ekki sérstaklega saman.
Það mun í raun koma niður í tengja skref, þannig að við munum komast að því í annað.
En fyrst, það er samsetningu?
[Nemandi] Þingið í tvöfaldur? >> Já.
Samsetningu.
Við köllum það ekki að setja saman vegna Þingið er ansi mikið hreint þýðing tvöfaldur.
Það er mjög lítið rökfræði í að fara frá þinginu til tvöfaldur.
Það er bara eins og að horfa upp á borð, ó, við höfum þessa fræðslu;
sem svarar til tvöfaldur 01110.
Og svo skrár sem samsetningu almennt framleiðsla eru. O skrár.
Og. O skrár eru það sem við vorum að segja áður,
hvernig skrá þarf ekki að hafa meginhlutverki.
Hvaða skrá er hægt að safna saman niður á. O skrá svo lengi sem það er í gildi C skrá.
Það er hægt að safna saman niður. O.
Nú, tengja er það í raun koma fullt af. O skrá og koma þeim til executable.
Og svo hvað tengir er hægt að hugsa um CS50 bókasafninu sem. O skrá.
Það er nú þegar saman tvöfaldur skrá.
Og svo þegar þú saman skrána, hello.c þín, sem kallar GetString,
hello.c fær saman niður hello.o,
hello.o er nú tvöfaldur.
Það notar GetString, svo það þarf að fara yfir til cs50.o,
og linker smooshes þeim saman og afrit GetString í skrána
og kemur út með executable sem hefur allar aðgerðir sem það þarfnast.
Svo cs50.o ekki raun O skrá, en það er nógu nálægt að það er enginn grundvallar munur.
Svo kemur að tengja bara fullt af skrá saman
sem sérstaklega inniheldur allar aðgerðir sem ég þarf að nota
og skapar executable sem mun í raun keyra.
>> Og svo er það líka það sem við vorum að segja fyrir
þar sem þú getur haft 1000. c skrá, safna saman að þá alla til. o skrá,
sem mun væntanlega taka nokkurn tíma, svo að breyta 1. C skrá.
Þú þarft aðeins að laun að 1. C skrá og þá relink allt annað,
tengja allt aftur saman.
[Nemandi] Þegar við erum að tengja við skrifa lcs50?
Já, svo-lcs50. Að merkja merki til linker sem þú ættir að tengja í því safninu.
Spurningar?
Höfum við farið yfir tvöfaldur en að 5 sekúndum á fyrsta fyrirlestri?
Ég held ekki.
Þú ættir að vita allt um stóru OS sem við höfum farið yfir,
og þú ættir að vera fær um að, ef við gaf þér virka,
þú ættir að vera fær um að segja að það er stór O, u.þ.b.. Eða vel, stór O er gróft.
Svo ef þú sérð hreiður fyrir lykkjur lykkja á sama fjölda af hlutum,
eins og int i, i <N, int J, J > [nemandi] N veldi. >> Gæta þess að vera N veldi.
Ef þú hefur þrefaldur hreiður, gæta þess að vera N cubed.
Svo þessi tegund af hlutur sem þú ættir að vera fær um að benda á strax.
Þú þarft að vita insertion sort og kúla raða og sameina tegund og öll þeirra.
Það er auðveldara að skilja hvers vegna þeir eru þeir N veldi og n log n og allt það
því ég held að það var á spurningakeppni eitt ár þar sem við gáfum í grundvallaratriðum þér
sem framkvæmd tegund kúla og sagði: "Hvað er í gangi þegar þetta virka?"
Svo ef þú viðurkenna það eins konar kúla, þá getur þú strax að segja N veldi.
En ef þú horfir bara á hana, heldur þú ekki einu sinni að átta sig kúla tegund það er,
þú getur bara sagt þetta er að gera þetta og þetta. Þetta er n veldi.
[Nemandi] Eru einhverjar erfiðar dæmi sem þú getur komið upp með,
eins svipuðum hugmynd vangaveltur út?
>> Ég held ekki að við myndum gefa þér einhverjar erfiðar dæmi.
The konar kúla hlutur er óður í eins og sterkur eins og við myndum fara,
og jafnvel það, svo lengi sem þú skilur að þú ert iterating yfir fjölda
fyrir hvert frumefni í fylki, sem er að fara að vera eitthvað sem er n veldi.
Það eru almennar spurningar, eins og hérna við höfum - Ó.
Bara um daginn, Doug krafa, "Ég hef fundið reiknirit sem geta raða fylki
"Á n tölur í O (log n) tíma!"
Svo hvernig vitum við að er ómögulegt?
[Inaudible nemandi svar] >> Já.
Minnsta kosti, þú þarft að snerta hvert frumefni í fylking,
þannig að það er ómögulegt að raða fylki af -
Ef allt er í óflokkuðum röð, þá þú ert að fara að snerta allt í fylking,
þannig að það er ómögulegt að gera það í minna en O á n.
[Nemandi] Þú sýndi okkur það dæmi að vera fær um að gera það í O á n
ef þú notar mikið minni. >> Já.
Og that's - Ég gleymi því that's - Er það að telja tegund?
Hmm. Það er heiltala flokkun reiknirit.
Ég var að leita að sérstöku heiti fyrir þetta að ég gat ekki munað síðustu viku.
Já. Þetta eru þær tegundir af konar sem geta náð hlutina í stóra O í n.
En það eru takmörk, eins og þú getur aðeins notað heiltölur allt að tilteknum fjölda.
Plús ef þú ert að reyna að raða eitthvað that's -
Ef array er 012, -12, 151, 4 milljónir,
þá einn þátturinn er að fara að alveg eyðilagt alla flokkun.
>> Spurningar?
[Nemandi] Ef þú hafa a endurkvæma virka og það gerir bara endurkvæma símtöl
innan til baka yfirlýsingu, það er hali endurkvæma,
og svo myndi það ekki nota meira minni á afturkreistingur
eða það væri að minnsta kosti að nota sambærilega minni sem endurtekningu lausn?
[Bowden] Já.
Það myndi líklega vera nokkru minni, en ekki í raun.
Tail endurkvæma er nokkuð gott.
Horft aftur á ramma stakkur, segja skulum við hafa helstu
og við höfum int bar (int x) eða eitthvað.
Þetta er ekki fullkomið endurkvæma virka, en aftur Bar (x - 1).
Svo augljóslega, þetta er gölluð. Þú þarft grunn tilvikum og efni.
En hugmyndin hér er að þetta er hali endurkvæma,
sem þýðir að þegar helstu símtöl bar það er að fara að fá stafla ramma þess.
Í þessum stafla ramma það er að fara til vera a lítill blokk af minni
sem svarar til rifrildi x hennar.
Og svo skulum segja helstu gerist að hringja bar (100);
Svo x ætlar að byrja út sem 100.
Ef þýðandinn viðurkennir að þetta er hali endurkvæma virka,
svo þegar Bar gerir endurkvæma hringja til bar,
í stað þess að búa til nýja stafla ramma, sem er þar sem stafla byrjar að vaxa að mestu,
lokum mun keyra hrúga og þá færðu segfaults
því minni byrjar rekast.
>> Svo í stað þess að gera eigin stafla ramma þess, getur það grein,
hey, aldrei ég virkilega þarf að koma aftur á þessa stafla ramma,
svo í stað þess að ég ætla bara að skipta um þessa fullyrðingu með 99 og þá byrja bar allt.
Og þá mun það gera það aftur og það mun ná aftur bar (x - 1),
og í stað þess að gera nýja stafla ramma, það verður bara að koma í stað núverandi rök hennar með 98
og svo hoppa til baka í upphafi bar.
Þá starfsemi, í stað þess að 1 gildi á mánudaginn og stökk aftur í byrjun,
eru mjög duglegur.
Svo er ekki bara þetta sama minni notkun sem sérstakt fall sem endurtekningu
vegna þess að þú ert bara að nota 1 stafla ramma, en þú ert ekki þjáist af downsides
að þurfa að hringja í aðgerðir.
Starf aðgerðir geta verið nokkuð dýr vegna þess að það þarf að gera allt þetta skipulag
og tearDown og allt þetta dót.
Svo er þetta hali endurkvæmni gott.
[Nemandi] Hvers vegna er það ekki skapa ný skref?
Vegna þess að hún gerir sér grein fyrir að það þarf ekki að.
The kalla á bar er bara aftur endurkvæma hringja.
Svo það þarf ekki að gera neitt með skilagildi.
Það er bara að fara strax aftur því.
Svo það er bara að fara að skipta um eigin rök hennar og byrja upp á nýtt.
Og líka, ef þú ert ekki með hala endurkvæma útgáfu,
þá færðu allar þessar bars þar þegar þetta Bar skilar
það hefur til að skila gildi til þessa, þá er barinn strax aftur
og það skilar gildi til þessa, þá er það bara að fara að stað aftur
og aftur gildi þess að þessa.
Svo þú ert að vista þetta pabbi allt þetta burt af stafla
þar sem skilagildi er bara að fara til að fara framhjá alla leið aftur upp engu að síður.
Svo hvers vegna ekki bara að skipta um rifrildi okkar við uppfærðum rök og byrja upp á nýtt?
Ef aðgerð er ekki hali endurkvæma, ef þú gerir eitthvað eins og -
[Nemandi] ef Bar (x + 1). >> Já.
>> Svo ef þú setur það í ástandi, þá þú ert að gera eitthvað með skilagildi.
Eða jafnvel ef þú gera bara aftur 2 * Bar (x - 1).
Svo nú Bar (x - 1) þarf að fara í röð fyrir það að reikna 2 sinnum að gildi,
svo nú er það þarf eigin sérstaka stafla ramma þess,
og nú, sama hversu harður þú reynir, þú ert að fara að þurfa að -
Þetta er ekki hali endurkvæma.
[Nemandi] Myndi ég reyna að koma með endurkvæmni að miða að hali endurkvæmni -
[Bowden] Í fullkomnum heimi, en í CS50 þú þarft ekki að.
Til að fá hali endurkvæmni, almennt, setja þig upp til viðbótar rök
þar bar vilja taka int x í y
og y samsvarar fullkominn hlutur sem þú vilt að fara.
Svo þá er þetta sem þú ert að fara að vera aftur bar (x - 1), 2 * y.
Svo það er bara hár-láréttur flötur hvernig þú umbreyta það til að vera hali endurkvæma.
En auka rök -
Og svo á endanum þegar þú nærð stöð mál þitt, aftur bara y
vegna þess að þú hefur verið að safna allan tímann skilagildi sem þú vilt.
Manni hefur verið að gera það iteratively en með endurkvæma símtöl.
Spurningar?
[Nemandi] kannski um tölur músina, eins og þegar strengi. >> Jú.
Pointer tölur.
Þegar band það er auðvelt vegna þess að strengir séu char stjörnur,
chars eru að eilífu og alltaf eitt bæti,
og svo er bendillinn stærðfræði jafngildir reglulega tölur þegar þú ert að takast á við strengi.
Segjum bara char * s = "halló".
Þannig að við höfum blokk í minni.
Það þarf 6 bæti vegna þess að þú þarft alltaf núll Ljúka.
Og char * s er að fara að benda á í upphafi þessarar fylkisins.
Svo bendir þar.
Nú, þetta er í grundvallaratriðum hvernig allir fylki virkar,
hvort sem það var aftur með malloc eða hvort það er á mánudaginn.
Hvaða fylki er í grundvallaratriðum a bendi á upphaf í fylkinu,
og þá hvaða array rekstur, hvaða flokkun, er bara að fara inn í þessi fylki ákveðna móti.
>> Svo þegar ég segi eitthvað eins og s [3], þetta er að fara til S og telja 3 chars inn
Svo s [3], höfum við 0, 1, 2, 3, svo s [3] er að fara að vísa til þessa l.
[Nemandi] Og við gætum náð sama gildi með því að gera s + 3 og svo sviga stjörnu?
Já.
Þetta jafngildir * (s + 3);
og það er að eilífu og alltaf svarar sama hvað þú gerir.
Þú þarft aldrei að nota krappi setningafræði.
Þú getur alltaf notað * (s + 3) setningafræði.
Fólk tilhneigingu til eins og krappi setningafræði, þó.
[Nemandi] Svo allir fylki eru reyndar bara ábendingar.
Það er smá munur þegar ég segi int x [4]; >> [nemandi] Er að búa til minni?
[Bowden] Það er að fara að búa til 4 ints á mánudaginn, þannig að 16 bytes heild.
Það er að fara að búa til 16 bæti á mánudaginn.
x er ekki vistað neitt.
Það er bara tákn sem vísa til the byrjun af the hlutur.
Þar sem þú lýst fylking innan þessarar starfsemi,
hvað þýðandinn er að fara að gera er bara að skipta um öll dæmi af breytu x
með þar sem það gerðist að velja að setja þessar 16 bæti.
Það getur ekki gert það með char * s vegna s er raunveruleg músina.
Það er ókeypis að þá benda til annars.
x er fasti. Þú getur ekki hafa það benda á annað fylki. >> [Nemandi] lagi.
En þessi hugmynd, þessi flokkun er sú sama hvort sem það er hefðbundin array
eða ef það bendi á eitthvað eða ef það er bendi til malloced fylkisins.
Og í raun er það svo jafngildi að það er einnig það sama.
Það í raun bara þýða hvað er inni í sviga og hvað er eftir af þeim sviga,
bætir þeim saman, og dereferences.
Svo er þetta bara eins og gildi og * (s + 3) eða s [3].
[Nemandi] Getur þú ábendingum vísa á 2-víddar fylki?
>> Það er erfiðara. Hefð nr.
A 2-víddar array er bara 1-víddar array með einhverjum þægilegum setningafræði
vegna þess að þegar ég segi int x [3] [3], þetta er í raun bara 1 array með 9 gildum.
Og svo þegar ég vísitölu, sem þýðandi veit hvað ég meina.
Ef ég segi x [1] [2], hún veit að ég vil fara í annarri röð, svo það er að fara að sleppa fyrstu 3,
og þá vill það Annað sem á það, svo það er að fara að fá þetta einn.
En það er samt bara einn-víddar array.
Og svo ef ég vildi að tengja músina til að fylking,
Ég myndi segja int * p = x;
The tegund af x er bara -
Það er gróft að segja tegund x þar sem það er bara tákn og það er ekki raunverulegur breytu,
en það er bara int *.
x er bara bendi á upphaf þessa. >> [Nemandi] lagi.
Og svo ég mun ekki vera fær um að fá aðgang [1] [2].
Ég held að það sé sérstakt setningafræði til að lýsa bendi,
eitthvað fáránlegt eins og int (* p [-. eitthvað algerlega fáránlegt að ég veit ekki einu sinni.
En það er setningafræði til að lýsa yfir ábendingum eins og sviga og hlutum.
Það má ekki einu sinni láta þig gera það.
Ég gat að líta aftur á eitthvað sem myndi segja mér sannleikann.
Ég mun líta á það seinna, ef það er setningafræði fyrir lið. En þú munt aldrei sjá það.
Og jafnvel setningafræði er svo gamaldags að ef þú notar það, fólk verður undrandi.
Fjölvíða fylki eru mjög sjaldgæf og það er.
Þú ansi mikið -
Jæja, ef þú ert að gera fylkið hluti það er ekki að fara að vera sjaldgæft,
en í C þú ert sjaldan að fara að nota fjölvíða fylki.
Já. >> [Nemandi] Segjum að þú hafa a raunverulega langur array.
>> Svo í raunverulegur minni það virðist vera allt í röð,
eins og atriði við hliðina á hvort öðru,
en í líkamlegur minni, væri mögulegt fyrir það að vera skipt upp? >> Já.
Hvernig raunverulegur minni virkar það skilur bara -
The eining úthlutun er síða, sem hefur tilhneigingu til að vera 4 kílóbætum,
og svo þegar ferli segir, hey, ég vil nota þetta minni,
stýrikerfi er að fara að úthluta það 4 kílóbæti fyrir litla blokk minni.
Jafnvel ef þú notar aðeins einn lítill bæti í öllu blokk minni,
stýrikerfi er að fara að gefa það fullt 4 kílóbæti.
Svo hvað þýðir þetta er að ég gæti hafa - við skulum segja að þetta er stakkur minn.
Þessi stakkur gæti verið aðskilin. Stafla mitt gæti verið megabæti og megabæti.
Stafla mitt gæti verið gríðarlegur.
En stafla sjálft þarf að vera skipt í einstökum síðum,
sem ef við skoðum hérna skulum segja að þetta er RAM okkar,
Ef ég hef 2 gígabæta vinnsluminni, þetta er raunverulegt heimilisfang 0 eins og 0 bæti af RAM minni,
og þetta er 2 gígabæta alla leið niður.
Þannig að þessi síða gæti samsvara þessu blokk hérna.
Þessi síða gæti samsvara þessu blokk hérna.
Þetta eitt gæti samsvara þessu einn hérna.
Svo að stýrikerfið er frjálst að framselja líkamlegur minni
til einstakra síðu geðþótta.
Og það þýðir að ef þessi landamæri gerist að þræða fylki,
fylki gerist að vera vinstri á þessu og rétt í þessari röð á síðu
þá fylking er að fara að skipta í líkamlegur minni.
Og svo þegar þú hættir forritið, þegar ferli lýkur,
þessi kortlagning fá þurrkast út og þá er það frjálst að nota þessar litlu blokkir til annars.
Fleiri spurningar?
[Nemandi] músina tölur. >> Ó já.
Strings var auðveldara, en að horfa á eitthvað eins ints,
svo aftur til int x [4];
Hvort þetta er fylki eða hvort það bendi til malloced fjölbreytta 4 heiltölur
það er að fara að meðhöndla á sama hátt.
[Nemandi] Svo fylki eru á hrúga?
[Bowden] Fylki eru ekki á hrúga. >> [Nemandi] Ó.
>> [Bowden] Þessi tegund af array hefur tilhneigingu til að vera á mánudaginn
nema þú lýst það á - hunsa alþjóðlegt breytur. Ekki nota alþjóðlegum breytur.
Inni í aðgerð sem ég segi int x [4];
Það er að fara að búa til 4-heiltala blokk á mánudaginn fyrir þessa fylkingu.
En þetta malloc (4 * sizeof (int)); er að fara að fara á hrúga.
En eftir þessu sem ég er að nota X og P í nánast sömu leiðir,
öðrum en þeim undantekningum sem ég sagði áður um að þú getur endurúthluta bls.
Tæknilega eru stærðir þeirra nokkuð öðruvísi, en það er alveg óviðkomandi.
Þú aldrei raunverulega nota stærð þeirra.
The p ég gæti sagt p [3] = 2 eða x [3] = 2;
Þú getur notað þau á nákvæmlega sama hátt.
Svo bendi tölur núna - Já.
[Nemandi] Ert þú ekki að gera P * ef þú ert með sviga?
Festingar eru óbeina dereference. >> Lagi.
Reyndar, líka það sem þú ert að segja með hægt að fá fjölvíða fylki
með ábendingum, það sem þú getur gert er eitthvað eins og, segjum, int ** PP = malloc (sizeof (int *) * 5);
Ég ætla bara að skrifa það allt út fyrst.
Ég vildi ekki að eitt.
Allt í lagi.
Það sem ég gerði hér er - Það ætti að vera bls [i].
Svo bls bendi á músina.
Þú ert mallocing bls að benda á fjölda 5 int stjörnum.
Svo í minni sem þú ert með á stafla bls
Það er að fara að benda á fjölda 5 blokkir sem eru allt sjálfir ábendingum.
Og svo þegar ég malloc niður hér malloc ég að hver þeirra einstaka ábendingum
að benda til sérstakrar blokk 4 bæti á hrúga.
Þannig að þetta bendir til 4 bæti.
Og þetta bendir til mismunandi 4 bæti.
>> Og öllum þeim benda á þeirra eigin 4 bæti.
Þetta gefur mér leið til að gera fjölvíða hluti.
Ég gæti sagt pp [3] [4], en nú er þetta ekki það sama og fjölvíða fylki
því fjölvíða fylki það þýtt [3] [4] í einn á móti í x fylkisins.
Þetta dereferences p, aðgangur þriðja vísitölu, þá dereferences sem
og aðgangur - 4 væri ógildur - seinni vísitölu.
En þegar við þurftum að int x [3] [4] en sem fjölvíða fylki
og þegar þú tvöfaldur krappi það er í raun aðeins einn dereference,
þú ert að elta einn músina og þá er móti,
þetta er virkilega 2D tilvísanir.
Þú fylgja 2 aðskildum ábendingum.
Þannig að þetta gerir einnig tæknilega að hafa fjölvíða fylki
þar sem hver einstaklingur array er mismunandi stærðum.
Þannig að ég held að jagged fjölvíða fylki er hvað það er kallað
því í raun fyrsta sem gæti bent til einhvers sem hefur 10 atriði,
The second hlutur gæti bent til einhvers sem hefur 100 einingar.
[Nemandi] Er einhver takmörk á fjölda af ábendingum er hægt að hafa
benda öðrum ábendingum? >> Nei
Hægt er að hafa int ***** p.
Aftur músina tölur - >> [nemandi] Ó. >> Já.
[Nemandi] Ef ég int *** p og þá geri ég dereferencing og ég segi p * er jöfn þetta gildi
er það að fara bara að gera 1 stig dereferencing? >> Já.
Svo ef ég vil fá aðgang að hlutur sem síðasta bendillinn er að benda á -
Þá gerir *** p. >> Lagi.
Þannig að þetta er p stig fyrir 1 blokk, benda til annars blokk, benda til annars sýna í reitnum.
Síðan ef þú ert * p = eitthvað annað, þá ertu að breyta þessu
að nú benda til annars sýna í reitnum. >> Lagi.
>> [Bowden] Og ef þær voru malloced, þá hefur nú lekið minni
nema þú skyldir hafa mismunandi tilvísanir af þessu
þar sem þú getur ekki fengið til baka þær sjálfur sem kastaði bara í burtu.
Pointer tölur.
int x [4], er að fara að úthluta fjölda 4 heiltölur
þar sem x er að fara að benda á byrjun fylkisins.
Svo þegar ég segi eitthvað eins og x [1], ég vil það að þýða að fara að annarri heiltölu í fylking,
sem myndi vera svona einn.
En í raun, það er 4 bæti í fylki þar sem þetta heiltala tekur upp 4 bæti.
Svo á móti af 1 þýðir í raun á móti af 1
sinnum the stærð af hvaða gerð af fylki.
Þetta er fylki heiltalna, svo það veit að gera 1 sinni stærð int þegar það vill á móti.
Hin setningafræði. Mundu að þetta er jafngilt * (x + 1);
Þegar ég segi Pointer + 1, hvað það skilar er heimilisfangið sem bendillinn er að geyma
auk 1 sinnum the stærð af the tegund af músina.
Svo ef x = ox100, þá x + 1 = ox104.
Og þú getur misnota þetta og segja eitthvað eins og bleikju * c = (char *) x;
og nú C er að fara til vera the sami tölu sem x.
C er að fara að vera jafn ox100,
en C + 1 er að fara að vera jafn ox101
þar bendillinn tölur fer eftir tegund af músina sem þú ert að bæta við.
Svo C + 1, hún lítur á C, það er bleikja músina, svo það er að fara að bæta við 1 sinnum stærð bleikju,
sem er alltaf að fara að vera 1, þannig að þú færð 101,
en ef ég geri x, sem er einnig enn 100, x + 1 er að fara að vera 104.
[Nemandi] Hægt er að nota C + + til að fara músina með 1?
Já, þú getur.
Þú getur ekki gert það með x þar sem x er bara tákn, það er stöðug, þú getur ekki breytt x.
>> En C gerist bara vera músina, þannig C + + er fullkomlega gild og það mun hækka um 1.
Ef C var bara int *, þá er C + + væri 104.
+ + Er bendillinn tölur eins og C + 1 hefði gert músina tölur.
Þetta er í raun hversu mikið af hlutum eins Mergesort -
Í stað þess að búa til afrit af hlutum, getur þú í staðinn framhjá -
Eins og ef ég vildi að fara framhjá þessu hálfan array - skulum eyða eitthvað af þessu.
Við skulum segja að ég vildi að fara þessa hlið af the array í aðgerð.
Hvað myndi ég fara til að virka?
Ef ég framhjá x, ég liggur þetta netfang.
En ég vil að fara framhjá þessu tiltekna tölu. Svo hvað á ég að fara?
[Nemandi] Pointer + 2?
[Bowden] Svo x + 2. Já.
Það er að fara að vera svona tölu.
Þú munt líka mjög oft séð það sem x [2] og þá heimilisfang þess.
Svo þú þarft að taka tölu af því vegna þess að krappi er óbeina dereference.
x [2] er átt við gildi sem er í þessum kassa, og þá þú vilt heimilisfang kassann,
svo þú segir & x [2].
Svo er það hvernig eitthvað í Mergesort þar sem þú vilt fara hálfa listann eitthvað
þú í raun bara framhjá & x [2], og nú eins langt og endurkvæma hringja er varðar,
nýtt array mín byrjar þar.
Síðustu spurningarnar mínútu.
[Nemandi] Ef við ekki setja merkið eða - hvað er það kallað? >> Star?
[Nemandi] Star. >> Tæknilega, dereference rekstraraðila, en - >> [nemandi] Dereference.
>> Ef við gerum ekki setja stjörnu eða merkið, hvað gerist ef ég segi bara y = x og x er bendir?
Hvað er tegund af y? >> [Nemandi] Ég ætla bara segja músina það er 2.
Svo ef þú segir bara y = x, nú x og y að benda á það sama. >> [Nemandi] Point til sama.
Og ef x er int músina? >> Það myndi kvarta vegna þess að þú getur ekki framselt ábendingum.
[Nemandi] lagi.
Mundu að ábendingum, jafnvel þó að við draga þá sem örvum,
raun allt sem þeir geyma - int * x - í raun allt x er sögufrægur er eitthvað eins ox100,
sem við koma til að tákna sem benda á blokk geymd við 100 manns.
Svo þegar ég segi int * y = x, ég ætla bara að afrita ox100 í y,
sem við erum bara að fara til að tákna sem y, einnig bendir til ox100.
Og ef ég segi int i = (int) x, svo ég er að fara að geyma hvað verðmæti ox100 er
inni um það, en nú það er að fara að túlka sem heiltala staðinn fyrir músina.
En þú þarft að varpa eða annað það mun kvarta.
[Nemandi] Svo áttu að greiða -
Er það að fara að vera steypu int af X eða steypu int y?
[Bowden] What?
[Nemandi] lagi. Eftir þessum sviga er það að fara að vera x eða leitt þarna?
>> [Bowden] heldur. x og y eru jafngildir. >> [Nemandi] lagi.
Vegna þess að þeir eru báðir ábendingar. >> Já.
[Nemandi] Þannig að það myndi geyma sextánskur 100 í heiltölu formi? >> [Bowden] Já.
En ekki gildi hvað það bendir til.
[Bowden] Já. >> [Nemandi] Svo bara heimilisfang í heiltölu formi. Allt í lagi.
[Bowden] Ef þú vildir einhverjum furðulega ástæðu,
þú gætir eingöngu að takast á við ábendingum og aldrei að takast á við heiltölur
og bara vera eins og int * x = 0.
Síðan sem þú ert að fara að fá mjög ruglaður þegar bendillinn tölur byrjar að gerast.
Þannig að tölurnar sem þeir geyma eru hégómi.
Það er bara hvernig þú endar túlka þær.
Þannig að ég er frjáls til að afrita ox100 úr int * á int
og ég er frjáls til að tengja - þú líklega að fara að fá öskraði á fyrir ekki steypu -
Ég er frjáls til að tengja eitthvað eins og (int *) ox1234 í þessu handahófskennt int *.
Svo er ox123 jafn gild minni tölu sem er og y.
& Y gerist aftur eitthvað sem er ansi mikið ox123.
[Nemandi] Vildi að vera mjög flott leið til að fara frá sextánskur í aukastaf formi,
eins og ef þú ert með músina og þú kastar eins og int?
[Bowden] Þú getur í raun bara prenta nota eins og printf.
Við skulum segja að ég hef int y = 100.
Svo printf (% d \ n - eins og þú ættir nú þegar vita - prenta það sem heiltala,% x.
Við munum bara prenta það sem sextánskur.
Svo bendi ekki geymd sem sextánskur,
og heiltala er ekki vistað sem aukastaf.
Allt er geymt sem tvöfaldur.
Það er bara að við tilhneigingu til að sýna ábendingar sem sextánskur
því við hugsum um það í þessum 4-bæti blokkir,
og minni heimilisföng tilhneigingu til að þekkja.
Við erum eins, ef það byrjar með BF, þá gerist það að vera á mánudaginn.
Svo er það bara túlkun okkar ábendingum sem sextánskur.
Allt í lagi. Allar Síðustu spurningarnar?
>> Ég kem hér aðeins eftir að ef þú hefur eitthvað annað.
Og það er í lok þess.
>> [Nemandi] Yay! [Lófaklapp]
>> [CS50.TV]