[Powered by Google Translate] [4 skirsnis - patogiau]
[Rob Bowden - Harvardo universiteto]
[Tai CS50. - CS50.TV]
Mes turime Viktorina rytoj, tuo atveju, jei nežinojo, kad vaikinai.
Tai iš esmės viską, ką galėjo matyti klasėje arba turėjo matyti klasėje.
Tai apima nurodymus, nors jie yra labai neseniai tema.
Jūs bent jau turėtų suprasti aukšto lygio.
Nieko, kad praėjo per klasėje, jūs turite suprasti, kad viktorina.
Taigi, jei turite klausimų dėl jų, jūs galite paprašyti juos dabar.
Bet tai bus labai studentas vadovaujamos sesija, kur jus vaikinai užduoti klausimus,
todėl tikiuosi, žmonės turi klausimų.
Ar kas nors turite klausimų?
Taip. >> [Studentas] Ar jūs einate per rodykles naujo?
Aš eisiu per rodykles.
Visi savo kintamiesiems nebūtinai gyvena atmintyje,
bet paprastai jums nereikia nerimauti, kad ir jūs tiesiog pasakyti, x + 2 ir y + 3
ir kompiliatorių bus išsiaiškinti, kur viskas gyvena už jus.
Kai jūs susiduriame su rodyklės, dabar jūs aiškiai naudojant šias atminties adresus.
Taigi vienas kintamasis bus tik kada nors gyvena vienu adresu, bet kuriuo metu.
, Jei norime paskelbti žymeklį, kas tipo atrodys?
>> Noriu paskelbti rodyklė p. Ką tipo atrodo?
[Studentas] int * p. >> Taip. Taigi, int * p.
Ir kaip padaryti, kad ji nurodo x? >> [Studentas] Ampersand.
[Bowden] Taigi Ampersand yra tiesiog vadinama operacijų vykdytojo adresas.
Taigi, kai aš sakau, ir X tai vis kintamojo x atminties adresą.
Taigi dabar turiu žymiklį P ir bet kur, mano kodas galiu naudoti * P
arba aš galėtų naudoti x ir jis bus lygiai toks pats dalykas.
(* P). Kas tai yra daro? Ką reiškia, kad žvaigždės?
[Studentas] Tai reiškia, kad tuo momentu, vertę. >> Taip.
Taigi, jei pažvelgsime į tai, jis gali būti labai naudinga atkreipti dėmesį į diagramas
kur tai yra šiek tiek atminties dėžutė x, kuris atsitinka vertės 4,
tada mes turime šiek tiek atminties dėžutę p,
ir taip p-X, todėl mes nubrėžti strėlę iš p-X.
Taigi, kai mes sakome, * p mes sakome eiti į langelį, kad yra p.
Žvaigždė yra sekti rodyklę ir tada daryti ką nori su tame langelyje.
Taigi, galiu pasakyti * p = 7 ir, kad eis į lauką, kad yra X ir pakeisti, kad iki 7.
Ar galėčiau pasakyti, int z = * p * 2 Tai painu, nes tai žvaigždė, žvaigždė.
Žvaigždė dereferencing p, kita žvaigždė padauginus iš 2.
Atkreipkite dėmesį, aš galėjo lygiai taip pat pakeitė * P x.
Jūs galite juos naudoti tokiu pačiu būdu.
Ir vėliau į I psl tašką, gali turėti visiškai naujas dalykas.
Aš galiu tik pasakyti, p = &z;
Taigi, dabar p nebėra taškų-X, ji nurodo iki z.
Ir bet kuriuo metu, kai aš * P, tai tas pats, kaip padaryti z.
Taigi naudingas dalykas, apie tai, kai mes pradėti gauti į funkcijas.
>> Tai koks nenaudingas deklaruoti rodyklę, kuri nukreipia į kažką
ir tada jūs tiesiog dereferencing
, kai galėjo naudoti originalų kintamąjį pradėti.
Bet kai jūs gaunate į funkcijas - tarkim, mes turime tam tikrą funkciją, int foo,
kad mano žymiklį ir tiesiog daro * P = 6;
Kaip matėme anksčiau su apsikeitimo sandorio, jūs negalite padaryti veiksmingą apsikeitimo ir atskirą funkciją
tik artimųjų sveikieji skaičiai, nes viskas C visada eina pagal vertę.
, Net jei jūs artimųjų patarimų jums perduoti pagal vertę.
Jis tiesiog taip atsitinka, kad šios vertybės yra atminties adresai.
Taigi, kai aš sakau, foo (p); aš perduoti žymiklį į funkcijai foo
ir tada foo daro * P = 6;
Viduje šią funkciją, * p vis dar atitinka x,
bet aš negaliu naudoti viduje šią funkciją X, nes tai nėra aprėptis per tą funkciją.
Taigi * p = 6 yra vienintelis būdas aš galiu gauti prieigą vietos kintamąjį iš kitos funkcijos.
Ar gerai, rodykles yra vienintelis būdas aš galiu gauti prieigą vietos kintamąjį iš kitos funkcijos.
[Studentas] Tarkime, kad jūs norėjo grįžti rodyklę. Kaip tiksliai tai padaryti?
[Bowden] Grįžti rodyklę, kaip kažką panašaus į int y = 3; Return & m? >> [Studentas] Yeah.
[Bowden] Gerai. Jūs niekada neturėtų daryti. Tai yra blogai.
Manau, aš mačiau šių paskaitų skaidrės, pradėjau matyti visą šią diagramą atminties
kur čia jūs turite Atmintis Adresų 0
ir žemyn, čia jūs turite Atmintis Adresų 4 koncertai arba 2 į 32.
Taip, tada jūs turite kai kurių dalykų ir kai kurių dalykų ir tada jūs turite savo kamino
ir jūs turite savo krūvos, kurį ką tik pradėjo mokytis apie, augo.
[Studentas] Ar ne virš kamino krūva?
>> Taip. Krūvos viršuje, ar ne? >> [Studentas] Na, jis įdėti 0 viršuje.
[Studentas] O, jis įdėti 0 viršuje. >> [Studentas] O, gerai.
Atsakomybės apribojimas: bet su CS50 jūs einate, kad ji tokiu būdu. >> [Studentas] Gerai.
Tai tiesiog, kad, kai jūs pirmą kartą pamatęs kaminai,
patinka, kai manote, kad kamino jūsų manymu, krovimas dalykų, vienas ant kito.
Todėl mes linkę apversti tai aplink, kamino auga kaip kamino paprastai
vietoj kamino nuleisti. >> [Studentas] Ar ne krūvos techniškai augti taip pat nors?
Tai priklauso nuo to, ką reiškia augti.
Kamino ir krūva visada auga skirtingomis kryptimis.
Kamino visada auga ta prasme, kad ji augo
į aukštojo atminties adresai ir krūvos auga
tuo, kad jis auga link žemesnių atminties adresai.
Taigi viršuje yra 0, o apačioje yra didelės atminties adresai.
Jie abu auga, tik priešingomis kryptimis.
[Studentas] Aš tiesiog reiškia, kad, nes jūs sakėte, jūs įtraukėte kamino apačioje
nes atrodo, kad labiau intuityvus, nes kamino pradėti krūvos viršuje,
krūvos viršuje savaime per, todėl that - >> Taip.
Jūs taip pat manau, kaip vis daugiau ir didesnių krūvą, bet labiau, kad kamino.
Taigi krūva yra vienas, kad mes tipo noriu parodyti auga.
Bet visur jums atrodo kitaip ketiname parodyti Adresas 0 viršuje
, o didžiausia atminties adresas apačioje, todėl tai yra jūsų įprastu vaizdu iš atminties.
>> Ar turite klausimų?
[Studentas] Ar galite papasakoti daugiau apie krūvą?
Taip. Aš gausiu, kad per sekundę.
Pirmą kartą, grįžta, kodėl grįžti ir Y yra blogas dalykas,
kamino turite krūva kamino kadrų, kurie atstovauja visas funkcijas
buvo vadinamas.
Taigi ignoruojant ankstesnius dalykų, Jūsų žetonų viršus visada bus pagrindinė funkcija
nes tai pirmoji funkcija yra vadinamas.
Ir tada, kai skambinate kitą funkciją, kamino augs žemyn.
Taigi, jei aš vadinu tam tikrą funkciją, foo, ir jis gauna savo kamino rėmo,
jis gali paskambinti tam tikrą funkciją, baras, jis gauna savo kamino rėmo.
Ir baras gali būti rekursinis ir ji galėtų vadintis,
ir kad antrasis kvietimas juostoje ketinate gauti savo kamino rėmo.
Ir taip, kas vyksta šių kamino kadrų yra visi lokalūs kintamieji
ir visi funkcijos argumentų -
Visi dalykai, kurie vietoje aprėptis šiai funkcijai eiti šių kamino kadrų.
Taigi, tai reiškia, kad, kai aš sakiau, kažkas panašaus juostoje yra funkcija,
Aš tik ketina paskelbti sveikasis skaičius ir tada grąžina rodyklę į tą sveikojo skaičiaus.
Taigi, kur gi y gyventi?
[Studentas] y gyvena juostoje. >> [Bowden] Yeah.
Kažkur, šioje mažoje aikštėje atminties littler kvadratas, Y.
Kai grįžtu & y, aš grįžti rodyklę į šį mažai atminties bloko.
Bet tada, kai funkcija grąžina, jo kamino rėmas gauna popped kamino.
Ir štai kodėl jis vadinamas kamino.
Tai tarsi kamino duomenų struktūros, jei žinote, kas tai yra.
Ar net kaip kamino padėklai visada yra pavyzdys,
Pagrindinis ketina eiti ant dugno, tada pirmoji funkcija skambinate ketina eiti viršuje, kad,
ir jūs negalite grįžti į pagrindinį, kol grįšite iš visų funkcijų, kurios buvo vadinama
kad buvo pateikti ant jo.
>> [Studentas] Taigi, jei tu padaryti grąžinti ir Y, kad vertė turi būti keičiamos be įspėjimo.
Taip, it's - >> [studentas] Tai gali būti perrašyti. >> Taip.
Tai visiškai - Jei bandysite ir
Tai taip pat būtų int * bar, nes jis grąžina rodyklę,
todėl jos grįžimo tipas yra int *.
Jei bandote naudoti šios funkcijos grąžinamą reikšmę, tai neapibrėžta elgesys
dėl to, kad rodyklė rodo į blogas atmintį. >> [Studentas] Gerai.
Taigi, ką daryti, jei, pavyzdžiui, jūs pareiškė, int * y = malloc (sizeof (int))?
Tai geriau. Taip.
[Studentas] Mes kalbėjome apie tai, kaip kai mes vilkite dalykų mūsų šiukšlinę
jie nėra faktiškai ištrinami; mes tiesiog prarasti savo patarimų.
Taigi šiuo atveju mes iš tikrųjų ištrinti vertę ar ji vis dar ten atminties?
Nes didžioji dalis, tai vyksta vis dar bus ten.
Bet tarkime mes atsitiktų skambinti nors kitą funkciją, bazių.
Baz ketina gauti savo kamino rėmą čia.
Tai bus perrašyti visą šią medžiagą,
ir tada, jei vėliau išbandyti ir naudoti pelės žymeklį, kad jūs turite prieš,
ji nesiruošia būti ta pati vertė.
Ji ketina pasikeitė tik todėl, kad jūs vadinamas funkcijos BAZ.
[Studentas] Bet jeigu mes ne, tai mes vis dar galite gauti 3?
[Bowden] Panašu, jūs.
Bet jūs negalite remtis, kad. C tiesiog sako neapibrėžtą elgesį.
>> [Studentas] O, ji veikia. Gerai.
Taigi, kai norite grįžti rodyklę, tai kur malloc ateina.
Aš rašau iš tikrųjų tiesiog grįžti malloc (3 * sizeof (int)).
Mes pereiti malloc per sekundę, tačiau, malloc idėja yra visi lokalūs kintamieji
visada eiti kamino.
Nieko, kad malloced eina į krūvą, ir jis bus amžinai ir visada turi būti ant krūvos
kol aiškiai jį išlaisvinti.
Taigi, tai reiškia, kad, kai jūs malloc kažką, jis bus išgyventi po funkcija grąžina.
[Studentas] Ar tai išgyventi po to, kai programa sustoja? >> No
Gerai, kad jis bus ten, kol programa visą kelią padaryti veikia. >> Taip.
Mes galime eiti per išsami informacija apie tai, kas atsitinka, kai programa sustoja.
Jums gali tekti priminti man, bet tai yra visiškai atskiras dalykas.
[Studentas] Taigi malloc sukuria rodyklę? >> Taip.
Malloc - >> [studentas] Manau, kad malloc paskiria atminties bloką, kad žymeklis gali naudoti.
[Bowden] Aš noriu vėl tą diagramą. >> [Studentas] Taigi, nors ši funkcija veikia?
[Studentas] Taip, malloc paskiria atminties blokas, kad jūs galite naudoti,
ir tada ji grąžina pirmojo bloko tos atminties adresą.
>> [Bowden] Taip. Taigi, kai jūs, malloc, jūs greiferiniai tam tikrą atminties bloką
, kad šiuo metu į krūvą.
Jei krūva yra per maža, tada krūva yra tik augs, o jis auga šia linkme.
Taigi tarkim krūva yra per mažas.
Tada tai augti šiek tiek ir grąžina rodyklę į šio bloko, tiesiog išaugo.
Kai jums free stuff, jūs padaryti daugiau vietos krūvos,
taip, tada vėliau paskambinti malloc pakartotiniam atmintį, kurioje anksčiau buvo nepanaudota.
Malloc ir nemokamas Svarbus dalykas, apie tai, kad ji suteikia jums visiškai kontroliuoti
per šių atminties blokus gyvenimą.
Globalūs kintamieji yra visuomet gyvas.
Vietiniai kintamieji yra gyvas patenka į jų taikymo sritį.
Kaip greitai, kaip jūs einate pro garbanotas petnešomis, vietos kintamieji yra mirę.
Malloced atmintis yra gyvas, kai norite, kad jis būtų gyvas
ir tada grąžinamas, kai jūs pasakyti, kad bus išleistas.
Tie, kurie iš tikrųjų yra tik 3 tipų atminties, tikrai.
Yra automatinis atminties valdymas, kuris yra kamino.
Dalykų atsitikti automatiškai.
Kai jūs sakote, int x, atmintis yra skirta int x.
Kai x išeina iš taikymo sritį, atminties atsiėmimo x.
Tada ten dinaminis atminties valdymas, o tai, ką malloc yra,
kuris yra, kai jūs turite kontroliuoti.
Jūs dinamiškai nuspręsti, kai atminties turėtų ir neturėtų būti skiriama.
Ir tada ten statinis, kuris tiesiog reiškia, kad jis gyvena amžinai,
visuotiniai kintamieji.
Jie tiesiog visada atmintyje.
>> Turite klausimų?
[Studentas] Ar galite apibrėžti tik naudojant garbanotas petnešos blokas
bet neturi turėti, jei ataskaitos arba while ar ko nors panašaus?
Galite nustatyti blokas, kaip ir funkcijos, bet kad garbanotas petnešos.
[Studentas] Taigi galite ne tik kaip atsitiktinių pora Garbanotasis petnešos savo kodą
kurie turi vietos kintamieji? >> Taip, galite.
Viduje int baras galėtume turėti {int y = 3;}.
Tai turėtų būti čia.
Bet tai visiškai apibrėžia int y taikymo sritį.
Po to antrą garbanotas petnešomis, y negali būti naudojama daugiau.
Jūs beveik niekada tai padaryti, nors.
Sugrįžimas į tai, kas atsitinka, kai programa baigiasi,
rūšies klaidinga / pusė melą, kad mes suteikiame tam, kad tik būtų lengviau.
Mes pasakyti, kad, kai paskirstyti atmintį
jūs skirti šiek tiek RAM riekė tos kintamojo.
Bet jūs tikrai ne tiesiogiai neliesti RAM kada nors savo programose.
, Jei jūs manote apie tai, kaip aš patraukė
Ir iš tikrųjų, jei jūs einate per GDB jums matyti tą patį.
Nepriklausomai nuo to, kiek kartų jums paleisti savo programą arba kokia programa jūs naudojate,
kamino visada bus pradėti -
jūs visada vyksta, norėdami pamatyti kintamuosius aplink adresas oxbffff kažką.
Tai paprastai kažkur tame regione.
Bet kaip gali 2 programos galbūt turite patarimų į tą patį atminties?
[Studentas] Yra keletas savavališkai pavadinimas kur oxbfff turėtų būti RAM
kad iš tiesų gali būti skirtingose ​​vietose, priklausomai nuo to, kai funkcija buvo vadinama.
Taip. Terminas yra virtualioji atmintis.
Idėja yra ta, kad kiekvienas procesas, kiekviena programa, kuri veikia ant jūsų kompiuterio
turi savo - įsivaizduokime, 32 bits - visiškai nepriklausomas adresų erdvę.
Tai adresų erdvė.
Ji turi savo visiškai nepriklausomas 4 gigabaitų naudoti.
>> Taigi, jei jūs naudojate 2 programas vienu metu, tai programa mato 4 gigabitų į save,
ši programa mano, kad 4 GB į save,
ir tai yra neįmanoma šią programą, dereference rodyklė
ir galų gale su atmintim iš šios programos.
Ir virtualiosios atminties yra iš adresų erdvės procesų atvaizdavimą
į faktinių dalykų RAM.
Todėl žinoti, kad jūsų operacinė sistema,
ei, kai šis vaikinas dereferences rodyklė oxbfff, kad iš tikrųjų reiškia
kad jis nori RAM baitas 1000,
kadangi, jei ši programa dereferences oxbfff, jis tikrai nori RAM baitas 10.000.
Jie gali būti savavališkai toli vienas nuo kito.
Tai net tiesa dalykų vienoje procesų adresų erdvę.
Taip, kaip jis mato visus 4 gigabaitų į save, bet tarkim -
[Studentas] Ar kiekvieną procesą
Tarkime, jūs turite kompiuterį tik su 4 GB RAM.
Ar kiekvienas procesas pamatyti visą 4 GB? >> Taip.
Bet 4 GB mato yra melas.
Tai tiesiog ji mano, kad ji turi visą šią atmintį todėl, kad jis nežino, bet koks kitas procesas.
Tai bus tik naudoti kuo daugiau atminties, nes ji iš tikrųjų reikia.
Operacinė sistema neduos RAM į šį procesą
jei ji ne naudojant bet šioje atmintį visam regionui.
Jis nesiruošia suteikti jai atminties tame regione.
Bet idėja yra ta, kad aš bandau galvoti apie - Aš negaliu galvoti apie analogiją.
Analogijos yra sunku.
Vienas iš virtualiosios atminties klausimais arba vienas iš dalykų, tai sprendžiant
yra, kad procesai turėtų būti visiškai nežino vienas nuo kito.
Ir todėl jūs galite rašyti bet kokią programą, kad tik dereferences bet POINTER
patinka tiesiog parašyti programą, kuri sako * (ox1234),
ir tai, atminties adresas dereferencing 1234.
>> Bet jis į operacinę sistemą, tada išversti ką 1234 priemones.
Taigi, jei 1234 atsitinka, kad šis procesas būtų galiojantis atminties adresas,
kaip tai kamino ar kažką, tai bus grąžinti tos atminties adresą vertę
kiek procesas žino.
Bet jei 1234 yra neteisingas adresas, kaip tai atsitinka su žeme
čia nors dalelę atminties, kuri yra anapus kamino ir už krūvos
o jūs nesate iš tikrųjų naudojamas, kad, tada, kad kai jums gauti dalykų, pavyzdžiui, segfaults
, nes jūs liesdami atminties, kad jums neturėtų būti neliesti.
Tai taip pat pasakytina
32-bitų sistema, 32 bitų reiškia, kad turite 32 bitų nustatyti atminties adresą.
Tai kodėl rodykles 8 baitai, nes 32 bitai yra 8 baitai - ar 4 baitų.
Rodykles 4 baitai.
Taigi, kai pamatysite kaip oxbfffff žymeklį, tai yra -
Per kiekvienos konkrečios programos, galite tiesiog pastatyti bet kokį pasirinktą žymeklį,
bet nuo ox0 jautis 8 f's - ffffffff.
[Studentas] Ar jums sako, kad jie 4 baitų? >> Taip.
[Studentas] Tada kiekvienas baitas - >> [Bowden] Šešioliktainis.
Šešioliktainis - 5, 6, 7, 8. Taigi rodykles jūs ketinate rodyti visada šešioliktainis.
Tai tiesiog kaip mes klasifikuoti patarimų.
Kas 2 skaitmenys šešioliktainių yra 1 baitas.
Taigi ten bus 8 šešioliktainis skaičius 4 baitų.
Todėl kiekvienas žymiklį ant 32-bit sistemos bus 4 baitai,
tai reiškia, kad savo procesą galite sukurti bet kokį pasirinktą portą 4 baitai
ir padaryti žymeklį iš jo,
tai reiškia, kad kiek tai žino, ji gali spręsti visą 2 iki 32 baitų atminties.
Nors jis ne iš tikrųjų turėti prieigą prie to,
net jei jūsų kompiuteris turi tik 512 megabaitų, jis mano, kad tai, kad daug atminties.
Ir operacinė sistema yra pakankamai protingas, kad ji skiria tik tai, ką jūs iš tikrųjų reikia.
Ji ne tik eiti, oh, naują procesą: 4 koncertai.
>> Taip. >> [Studentas] Ką jautis? Kodėl rašote?
Tai tiesiog Šešioliktainius skaičius simbolis.
Kai pamatysite numeris pradžią jautis, vėlesni dalykai yra šešioliktainis.
[Studentas] Jums buvo paaiškinti apie tai, kas atsitinka, kai programa baigiama. >> Taip.
Kas atsitinka, kai programa baigiasi yra operacinė sistema
tik ištrina vaizdavimus, kad ji turi šiuos adresus, ir viskas.
Operacinė sistema gali duoti, kad dabar tiesiog atminties į kitą programą naudoti.
[Studentas] Gerai.
Taigi, kai jūs skirti krūvos ar kamino ar globalių kintamųjų ar kas nors ką nors,
jie visi tiesiog dingti kuo greičiau baigsis programa
nes operacinė sistema dabar nemokamai duoti, kad atminties bet kokiu kitu procesu.
[Studentas] Nors yra tikriausiai dar vertės parašyta? >> Taip.
Vertybės yra tikėtina, vis dar ten.
Tai tiesiog, kad jis ketina būti sunku gauti į juos.
Tai daug sunkiau gauti į juos, nei ji yra gauti ištrintas failas
,, nes ištrintas failas rūšies sėdi ilgą laiką, ir kietąjį diską yra daug didesnis.
Taigi jis ketina perrašyti skirtingų dalių atminties
prieš tai atsitinka perrašyti atminties gabalą, kad ši byla turi būti ne.
Tačiau pagrindinės atminties, RAM, jūs ciklą per daug greičiau,
todėl vyksta labai greitai, bus perrašyti.
Turite klausimų apie tai, ar kas nors kitas?
[Studentas] Turiu klausimų apie skirtingą temą. >> Gerai.
Ar kas nors turite klausimų apie tai?
>> Gerai. Kita tema. >> [Studentas] Gerai.
Buvau išgyvena kai kurie Practice Tests,
ir vienas iš jų buvo kalbama apie sizeof
ir vertė, kad ji grąžina arba skirtingų kintamųjų tipai. >> Taip.
Ir jis sakė, kad tiek int, ir ilgai ir grąža 4, todėl jie abu 4 baitų ilgio.
Ar yra koks nors skirtumas tarp int ir ilgą, ar tai tas pats?
Taip, yra skirtumas.
C standartas -
Aš tikriausiai bus bałagan.
C standartas tiesiog patinka tai, ką C yra oficialūs dokumentai C.
Tai, ką ji sako.
Taigi C standartas tiesiog sako, kad char bus amžinai ir visada bus 1 baitas.
Viskas po to - trumpas yra visada tiesiog apibrėžiamas kaip yra didesnis nei arba lygus char.
Tai gali būti griežtai didesnis nei bet ne teigiamas.
Žiniasklaida yra tiesiog apibrėžiamas kaip yra didesnis nei arba lygus trumpas.
Ir ilgas, tai tiesiog yra didesnis nei arba lygus int.
Ir ilgai ilgai yra didesnis nei arba lygus ilgas.
Taigi vienintelis dalykas, C standartas apibrėžia viską, kas yra santykinis rūšiavimas.
Faktinė suma, atminties, kad viskas užima paprastai yra iki įgyvendinimo
bet tai gana gerai apibrėžta šiame taške. >> [Studentas] Gerai.
Taigi šortai beveik visada bus 2 baitai.
Ints beveik visada bus 4 baitų.
Long long beveik visada bus 8 baitai.
Ir trokšta, tai priklauso nuo to, ar jūs naudojate 32-bitų arba 64 bitų sistemą.
Taigi ilgai ketinate atitinka taikomos sistemos tipo.
Jei naudojate 32-bit sistemą kaip Appliance, tai bus 4 baitų.
Jei naudojate 64-bitų kaip pastarojo meto kompiuterių daug, tai bus 8 baitai.
>> Ints beveik visada yra 4 baitų šiuo metu.
Long long beveik visada yra 8 baitai.
Praeityje, int naudojami tik 2 baitai.
Bet pastebėsite, kad tai visiškai atitinka visus šių santykių yra didesnis kaip ir lygus.
Tol, kol yra puikiai gali būti tokio pat dydžio kaip sveikasis skaičius,
ir jis taip pat gali būti tokio pat dydžio kaip ilgai ilgai.
Ir ji tiesiog taip atsitinka, kad 99,999% sistemų, ji ketina būti lygus
int arba ilgai ilgai. Tai tiesiog priklauso nuo 32-bit ar 64-bitų. >> [Studentas] Gerai.
Plaustai, kaip kablelio, bitų paskirta?
Kaip kaip dvejetainis? >> Taip.
Jums nereikia žinoti, kad CS50.
Jums nereikia net sužinoti, kad 61.
Nenorite mokytis, kad tikrai bet žinoma.
Tai tik atstovavimas.
Aš tiksliai pamiršti bitų sugauti.
Slankiojo kablelio idėja yra tai, kad jums skirti tam tikrą skaičių lazdą -
Iš esmės, viskas yra slankiojo kablelio formatu.
Taigi jūs skirti tam tikrą skaičių lazdą numerį pati, kaip ir 1,2345.
Aš niekada negali atstovauti daugiau kaip 5 skaitmenų skaičių.
Tada jūs taip pat skirti tam tikro skaičiaus bitai, kad jis yra linkęs būti kaip
jūs galite tik pereiti tam tikrą skaičių, kaip tai didžiausia eksponentė galite turėti,
ir jūs galite eiti tik iki tam tikro eksponentė,
patinka, kad mažiausias eksponentė galite turėti.
>> Aš nepamenu, Tikslus bitai priskiriami visų šių vertybių,
bet tam tikras bitų skaičius yra skirta 1,2345,
kitas tam tikras bitų skaičius yra skirta į eksponentė
ir tai tik įmanoma, atstovauti tam tikro dydžio eksponentų.
[Studentas] ir du kartus? Yra tai, kad kaip papildomą ilgą plūdės? >> Taip.
Tai tas pats, išskyrus dabar jūs naudojate 8 baitai vietoj 4 baitų plūdės.
Dabar jūs galėsite naudoti 9 skaitmenų arba 10 skaitmenų,
ir tai bus gali eiti iki 300, o ne 100. >> [Studentas] Gerai.
Ir teka taip pat yra 4 baitų. >> Taip.
Na, dar kartą, tai tikriausiai priklauso apskritai bendru įgyvendinimu,
bet plūdės yra 4 baitai, dviviečiai 8.
Dviviečiai kambariai yra vadinami dvigubai, nes jie yra dvigubai plaustų dydis.
[Studentas] Gerai. Ir dukart padvigubėja? >> Nėra.
Aš manau - >> [studentas] Kaip long long? >> Taip. Aš taip nemanau. Taip.
[Studentas] Remiantis praėjusių metų bandymo buvo klausimas apie pagrindinės funkcijos
, kurie turi būti dalis savo programą.
Buvo atsakyta, kad ji neturi būti dalis savo programą.
Kokia situacija? Tai, ką aš pamačiau.
[Bowden] Atrodo - >> [studentas] Kokia situacija?
Ar turite šią problemą? >> [Studentas] Taip, aš tikrai gali traukti ją į viršų.
Ji neturi būti, techniškai, bet iš esmės tai bus.
[Studentas] Aš mačiau vieną dėl skirtingų metų.
Tai buvo tarsi Tiesa ar klaidinga: galioja - >> O, c failas.?
[Studentas] Bet c failas turi būti - [tiek kalbanti vienu metu - nesuprantamas]
Gerai. Taigi, kad atskirai.
>> C failas tiesiog turi būti funkcijų.
Galite surinkti failą į mašininiu kodu, dvejetainiai, nepriklausomai,
nesant vykdomąjį dar.
Galioja vykdomąjį privalo turėti pagrindinę funkciją.
Jūs galite rašyti 100, bet ne pagrindines funkcijas, 1 failas
ir tada sudaryti, kad žemyn į dvejetainį
tada rašote kitą failą, kad tik pagrindinis, bet ji ragina iš šių funkcijų krūva
Šiame dvejetainiame failą per čia.
Ir todėl, kai jūs padaryti vykdomąjį failą, kad kas Linker
ji jungia šiuos 2 dvejetainius failus į vykdomąjį.
Taigi c failas nereikia turėti pagrindinę funkciją.
Ir dėl didelių kodų bazių pamatysite tūkstančius C bylų ir 1 Pagrindinė byla.
Daugiau klausimų?
[Studentas] buvo dar vienas klausimas.
Jis sakė, kad sudarytojas. True arba false?
Ir atsakymas yra klaidinga, ir supratau, kodėl tai ne kaip Apsukite metalinis garsas.
Bet ką mes vadiname, kad, jei tai ne?
Padaryti iš esmės yra tik - Matau, ką ji vadina jį.
Bet jis tiesiog vykdo komandas.
Padaryti.
Galiu traukti tai padaryti. Taip.
O, taip. Darome taip pat daro.
Tai sako, kad padaryti naudingumo tikslas yra nustatyti automatiškai
didelėje programoje vienetų reikia perkompiliavote
ir išduoda komandas perkompiliuoti.
Jūs galite padaryti, kad failus, kurie yra visiškai didžiulis.
Padaryti žiūri failų laiko ir, kaip mes sakėme anksčiau,
galite surinkti atskirus failus, ir tai nėra, kol gausite į Linker
, kad jie sujungti į vykdomąjį.
Taigi, jei turite 10 skirtingų failus ir padaryti pakeitimą, 1 iš jų,
kas tada markė ruošiasi daryti tik perkompiliuoti, kad: 1 failas
ir tada relink viskas kartu.
Bet tai daug kvailesnis nei kad.
Tai iki jums visiškai apibrėžia, kad tai, ką ji turėtų daryti.
Jis pagal nutylėjimą turi galimybę pripažinti šį laiko spaudu stuff,
, bet jūs galite rašyti markę failą nieko daryti.
Galite rašyti, kad failą taip, kad, kai įvesite, jis tiesiog CD į kitą katalogą.
Aš buvo gauti nusivylė, nes aš pakeisti halsą viskas viduje mano Appliance
ir tada aš peržiūrėti PDF iš "Mac".
>> Taigi aš einu į Ieškiklis Galiu padaryti Eiti, prisijungti prie serverio,
ir aš prisijungti prie serverio yra mano prietaisą, ir tada aš atverti PDF
, kad gauna surinkti LaTeX.
Bet aš buvo gauti nusivylė, nes kiekvieną kartą, man reikia atnaujinti PDF
Aš turėjau nukopijuokite jį į konkretų katalogą, kad ji galėtų pasiekti
ir buvo gauti erzina.
Taigi vietoj aš parašiau markę failą, kuriame jūs turite nustatyti, kaip ji daro ką.
Kaip jūs darote tai yra PDF LaTeX.
Tiesiog kaip ir bet kuri kita markė failą - ar aš manau, jūs dar nematėte Padaryti failus,
bet mes turime Prietaiso pasaulinį markę failą, tiesiog sako,
jei sudarant C failą, naudokite Apsukite metalinis garsas.
Ir todėl čia mano padaryti failą, kad aš, kad aš sakau,
šį failą, jūs ketinate norite kompiliuoti su PDF LaTeX.
Ir todėl PDF lateksu, kad daro kompiliavimas.
Padaryti, yra ne kompiliavimas. Jis tiesiog veikia šių komandų seka.
Taigi ji veikia PDF LaTeX, tai kopijuoja į katalogą, noriu, kad jis bus nukopijuotas į
tai CD į katalogą ir daro kitus dalykus,
tačiau ji yra atpažinti, kada failo pakeitimus,
ir, jei jis keičia, tada ji paleisti, kad jis turėjo paleisti komandas
kai failo pakeitimus. >> [Studentas] Gerai.
Aš nežinau, kur pasaulinės Padaryti failai man check it out.
Kiti klausimai? Viskas iš praeities viktorinos? Bet žymeklis dalykų?
Yra subtilių dalykų, su rodyklėmis, pavyzdžiui -
Aš nesiruošia, kad būtų galima rasti Viktorina klausimą -
bet kaip šis dalykas rūšiuoti.
Įsitikinkite, kad jūs suprantate, kad, kai aš sakau, int * x * y -
Tai nėra tiksliai nieko čia, I guess.
Bet kaip ir * x * y, jie yra 2 kintamieji, kurie yra ant kamino.
Kai aš sakau, x = malloc (sizeof (int)), x yra kamino kintamasis,
malloc kai per krūvą blokas, ir mes x tašką, į krūvą.
>> Kad kažkas Stack į krūvą.
, Kai jūs malloc nieko, jūs neišvengiamai ją saugoti viduje rodykle.
Taip, kad žymeklis yra ant kamino, malloced blokas krūvos.
Daug žmonių susipainioti ir sako, int * x = malloc, x yra krūvos.
Nr KAS YRA X nurodo krūvą.
x savaime yra kamino, išskyrus atvejus, kai dėl kokios nors priežasties jūs turite x pasaulinį kintamąjį,
tokiu atveju tai atsitinka būti kitoje atminties regione.
Taigi sekti šios dėžutės ir rodyklė diagramos yra gana įprasta, kad viktorina.
Arba, jei tai ne viktorina 0, ji bus Quiz 1.
Jūs turėtumėte žinoti, kad visų šių, rengdamas veiksmus
, nes jums turėjo atsakyti į klausimus dėl šių. Taip.
[Studentas] Ar mes galime eiti per šių žingsnių - >> Žinoma.
Prieš žingsnių ir kaupimo turime išankstinio apdorojimo,
sudarant, montavimas, ir susiejimas.
Pirminio apdorojimo. Ką daryti?
Tai lengviausias žingsnis - gerai, o ne kaip
tai nereiškia, kad tai turėtų būti akivaizdu, tačiau tai lengviausias žingsnis.
Jus vaikinai gali įgyvendinti patys. Taip.
[Studentas] Paimkite, ką jūs turite savo yra kaip tai ir kopijuoja, ir tada taip pat apibrėžia.
Jis ieško dalykų, pavyzdžiui, # include # define,
ir tai tik kopijos ir pastos, kas tai iš tikrųjų reiškia.
Taigi, kai jūs sakote # include cs50.h Preprocesorius yra kopijavimas ir įklijuoti cs50.h
į tos linijos.
Kai jūs sakote, # define x būti 4 Preprocesorius eina per visą programos
ir pakeičia visus su 4 x atvejus.
Taigi Preprocesorius mano galiojantį C failą ir išveda galiojantį C failą
, kur viskas buvo nukopijuoti ir įklijuoti.
Taigi dabar kompiliavimas. Ką daryti?
[Studentas] Jis eina iš C į dvejetainį.
>> [Bowden] Tai nereiškia, pereiti visą kelią į dvejetainį.
[Studentas] mašininiu kodu tada? >> Tai ne kompiuterinio kodo pavidalu.
[Studentas] Asamblėja? >> Asamblėja.
Jis eina į asamblėjos iki jis eina visą kelią iki C kodas,
ir daugeliu kalbų, padaryti kažką panašaus į tai.
Pasirinkti bet kokį aukšto lygio kalba, ir jei jūs ketinate sudaryti,
tai gali sudaryti pakopomis.
Pirmiausia ji ketina sudaryti Python C, vadinasi, jis ketina sudaryti C į surinkimo,
ir tada Asamblėja ketina gauti išverstas į dvejetainį.
Taigi sudarant ketina pareikšti iš C asamblėjos.
Paprastai reiškia žodis sudarant iš aukštesnio lygio
žemesnio lygio programavimo kalba.
Taigi tai yra tik žingsnis duomenims rengti, jeigu jums pradėti aukšto lygio kalba
ir galų gale žemo lygio kalba, ir tai, kodėl žingsnis yra vadinamas sudarant.
[Studentas] Per sudarant, tarkime, kad jūs padaryti # include cs50.h.
Ar sudarytojas perkompiliuoti cs50.h, kaip ir funkcijų, kurios yra ten,
ir išversti, kad į Asamblėjos kodas, taip pat,
ar ji nukopijuokite ir įklijuokite kažką, kad buvo iš anksto Asamblėja?
cs50.h bus gana daug niekada baigti asamblėjos.
Funkcijos prototipų ir daiktų stuff like tik jums būti atsargūs.
Jis užtikrina, kad kompiliatorius gali patikrinti tokius dalykus, kaip jūs skambinate funkcijas
su teise grąžinimo tipų ir tinkamus argumentus ir kita.
>> Taigi cs50.h bus apdorotų į failą, ir tada, kai ji manimi sudarant
tai iš esmės išmesti po to, kai jis užtikrina, kad viskas yra vadinamas tinkamai.
Bet apibrėžta CS50 bibliotekos funkcijas, kurios yra atskirai nuo cs50.h,
tiems, nebus atskirai surinkti.
Kad tikrai bus nusileisti susiejimo žingsnio, todėl mes gauti per sekundę.
Bet pirmiausia, kas yra surinkimo?
[Studentas] Asamblėja į dvejetainį? >> Taip.
Montavimas.
Mes vadiname tai sudarant nes Asamblėja yra beveik grynas vertimas iš dviejų.
Yra labai mažai logika vyksta asamblėjos į dvejetainį.
Tai tiesiog kaip žiūrint į lentelę, oh, mes turime šį nurodymą;
, kuris atitinka į dvejetainį 01.110.
Ir todėl failai, montavimas apskritai rezultatai yra o failai.
O failai yra tai, ką mes buvo pasakyti prieš,
kaip failas nereikia turėti pagrindinę funkciją.
Kiekvienas failas gali būti rengiami O failo, kol jis galioja C failas.
Jis gali būti rengiami Õ.
Dabar susiejimas, kas iš tikrųjų duoda krūva o failai ir atneša juos į vykdomąjį.
Ir kas susiejimas ar galite galvoti apie CS50 bibliotekoje O failo.
Tai yra jau yra sudariusi dvejetainis failas.
Ir taip, kai renka savo failą, jūsų hello.c, kuriame raginama GetString,
hello.c gauna parengė į hello.o,
hello.o dabar dvejetainiu.
Jis naudoja GetString, todėl ji turi pereiti į cs50.o
ir Linker smooshes juos kartu ir kopijuoja į šį failą GetString
ir išeina vykdomąjį, kuris turi visas funkcijas, ji turi.
Taigi cs50.o yra ne iš tikrųjų O failas, bet jis yra pakankamai arti, kad nėra esminio skirtumo.
Taigi susiejimas tik atneša daug failų krūva kartu
kad atskirai yra visas funkcijas, man reikia naudoti
ir sukuria vykdomąjį failą, kad tikrai bus paleisti.
>> Ir kad taip pat tai, ką mes buvo pasakyti prieš
, kai jūs galite turėti 1000 c failus, galite sudaryti juos visus o failai,
kuris tikriausiai šiek tiek užtrukti, tada jūs pakeisite 1 c failas.
Jums tik reikia perkompiliuoti, kad 1 C failą ir tada relink visa kita,
susieti viską atgal kartu.
[Studentas] Kai mes susiejimas, mes rašome lcs50?
Taip, taip lcs50. , Kad laivo vėliavos signalai Linker, kad jums reikia, jungiantys šios bibliotekos.
Turite klausimų?
Mes perėjo dvejetainis, išskyrus tai, kad 5 sekundes Pirmoji paskaita?
Aš taip nemanau.
Turėtumėte žinoti, visi didžiojo Os, kad mes perėjo,
ir jums turėtų būti suteikta galimybė, jei mes davė jums funkciją,
jums turėtų galėti pasakyti, kad tai didelis O maždaug. Ar gerai, didelis O yra šiurkštus.
Taigi, jei matote įdėtos kilpos, Looping per tą patį dalykų,
kaip int i, i <n; int j, j > [studentas] n kvadrato. >> Jis yra linkęs būti n kvadrato.
Jei turite trigubas įdėtos, jis yra linkęs n kubeliais.
Taip, kad dalykas rūšiuoti, jums turėtų būti suteikta iš karto.
Įterpimo Rūšiuoti ir burbulas rūšiuoti jums reikia žinoti, ir sujungti rūšiuoti, ir visos tos.
Tai lengviau suprasti, kodėl jie yra tie n kvadrato ir n log n ir visa tai
, nes manau, kad po vienerių metų, kai mes iš esmės davė jums buvo viktorinoje
burbuliukų Rūšiuoti įgyvendinimas ir tarė: "Kas yra šios funkcijos veikimo laikas?"
Taigi, jei jūs atpažins jį kaip burbulas rūšiuoti, tada jūs galite iš karto pasakyti, n kvadrato.
Bet jei jūs tiesiog žiūrėti į jį, jūs net reikia suvokti burbulas rūšiuoti;
galite tiesiog pasakyti tai daro tai ir tai. Tai n kvadratu.
[Studentas] Ar yra kietas pavyzdžių galite sugalvoti,
kaip suprasti, panašią idėją?
>> Nemanau, kad mes norėtume duoti jums jokių sunkius pavyzdžių.
Burbulas rūšiuoti dalykas yra taip sunku, kaip mes norėtume eiti,
ir net, kad taip ilgai, kaip jūs suprantate, kad jūs per masyvo iteravimu
kiekvieno masyvo elemento, kuris bus kažkas, kad n kvadrato.
Yra bendri klausimai, pavyzdžiui, čia mes turime - Oh.
Tik kitą dieną, Doug teigė, "Aš išrado algoritmą, kuris gali rūšiuoti masyvo
"N O (log n) laiko!"
Taigi, kaip mes žinome, kad tai neįmanoma?
[Nesigirdi studentas atsakas] >> Taip.
Bent jau, turite paliesti kiekvieną elementą masyve,
todėl neįmanoma rūšiuoti masyvo -
Jei viskas yra nerūšiuotų tvarka, tada jūs ketinate būti neliesti viską masyve,
todėl neįmanoma padaryti mažiau nei O n.
[Studentas] Jūs mums parodė, kad pavyzdys, kad galėtų tai padaryti O n
jei jūs naudojate daug atminties. >> Taip.
Ir būdams - aš pamiršti, ką that - Ar skaičiuoti rūšiuoti?
Hmm. Kad yra sveikasis skaičius rūšiavimo algoritmą.
Aš ieškojau specialų pavadinimą, kad aš negalėjo prisiminti, kad praėjusią savaitę.
Taip. Tai yra rūšių tipai, kuriuos gali atlikti dalykus Big O n.
Tačiau yra apribojimai, kaip jūs galite naudoti tik sveikieji skaičiai iki tam tikro skaičiaus.
Plius, jei bandote rūšiuoti kažką that
Jei jūsų masyvas yra 012, -12, 151, 4 mln,
tada, kad vienas elementas visiškai sužlugdyti visą rūšiavimą.
>> Turite klausimų?
[Studentas] Jei turite rekursinį funkciją ir jis tiesiog daro rekursinis skambučius
per Grizimas, kad uodega rekursinis
ir taip norėčiau, kad negalima naudoti daugiau atminties per runtime
ar jis bent panašių atminties, kartotinis sprendimas?
[Bowden] Taip.
Tai greičiausiai bus šiek tiek lėčiau, bet ne tikrai.
Liekamosios rekursinis yra gana gera.
Domina vėl kamino kadrų, galime pasakyti, kad mes turime pagrindinis
ir mes turime LC juostą (int x) ar kažką.
Tai nėra puikus rekursinis funkcija, tačiau grąža bar (x - 1).
Taigi, akivaizdu, kad tai yra ydinga. Jums reikia bazinių atvejus ir kita.
Tačiau čia yra idėja, kad tai yra uodega rekursinis,
tai reiškia, kai pagrindinį skambučių juostą jis ketina gauti savo kamino rėmo.
Šiuo kamino rėmo ten bus šiek tiek atminties blokas
, kuris atitinka jos argumentas x.
Ir taip tarkim pagrindinis atsitinka skambinti juostą (100);
Taigi x yra ketina pradėti kaip 100.
Jei kompiliatorius pripažįsta, kad tai uodega rekursinis funkcija,
tada, kai juosta jos rekursinis kvietimas uždrausti,
vietoj to, kad naują kamino rėmo, kuris yra kur kamino pradeda auga daugiausia,
galų gale ji bus paleisti į krūvą ir tada jums segfaults
nes visa atmintis prasideda susidūrimo.
>> Taigi, vietoj to, kad savo kamino rėmo, jis gali suvokti,
Ei, aš niekada iš tikrųjų reikia grįžti į šią kamino rėmo,
todėl vietoj aš tiesiog pakeisti šį argumentą su 99 ir tada pradėti baras viso.
Ir tada ji bus tai padaryti iš naujo ir jis pasieks grąžinimo juostą (x - 1),
ir vietoj to, kad naują kamino rėmelį, jis bus tiesiog pakeisti savo dabartinę argumentą 98
ir tada šokti atgal į pačioje pradžioje juostoje.
Šios operacijos, pakeisti, kad 1 reikšmę į steką ir šokinėja atgal į pradžią,
yra gana efektyvus.
Taigi, ne tik tai tas pats atminties kaip atskira funkcija, kuri yra pasikartojantis
, nes jūs tik naudojant 1 kamino kadrą, bet jūs ne kenčia praradimas
skambinti funkcijas.
Skambinimo funkcijos gali būti šiek tiek brangesnis, nes jis turi padaryti visą šią įrangą
ir teardown ir visa tai stuff.
Taigi tai uodega rekursija yra gera.
[Studentas] Kodėl ji sukurti naujų priemonių?
Nes ji suvokia, kad nereikia.
Skambučių į baro tik grįžau rekursinis skambutį.
Taip, kad nereikia nieko daryti su sugrįžimo vertę.
Tai tik ketina nedelsiant grąžinti.
Taigi, tai tik ketina pakeisti savo argumentams pagrįsti, ir pradėti iš naujo.
Ir, jei jūs neturite uodega rekursinis versiją
tada jūs gaunate visas šias juostas, kai ši juosta gražinimai
ji turi grąžinti jo vertę šį vieną, tada, kad baras nedelsiant grąžina
ir grąžina jo reikšmę į šį vieną, tada ji tiesiog ketina nedelsiant grąžinti
ir grąžinti jo vertę šį vieną.
Taigi, Jūs sutaupysite Popping visų šių dalykų, kamino
, nes grąžina vertė yra tik ketina būti perduoti visą kelią atgal vistiek.
Tad kodėl gi ne tiesiog pakeisti mūsų argumentus su atnaujinta argumentu, ir pradėti iš naujo?
Jei funkcija nėra uodega rekursinis, jei jūs darote kažką panašaus -
[Studentas], jei bar (x + 1). >> Taip.
>> Taigi, jei jūs įtraukėte būklės, tada jūs darote kažką su sugrįžimo vertę.
Ar net jei jūs tiesiog 2 grąžą * bar (x - 1).
Taigi dabar bar (x - 1) turi grįžti, kad ji galėtų apskaičiuoti 2 kartus, kad vertės,
todėl dabar ji reikia savo atskirą kamino kadrą
ir dabar, nesvarbu, kaip sunkiai jūs bandote, jūs ketinate reikia
Tai ne uodega rekursinis.
[Studentas] Ar aš pabandyti pareikšti rekursija, kad būtų siekiama uodegos rekursijos -
[Bowden] Idealiame pasaulyje, bet į CS50 jūs neturite.
Siekiant gauti uodegos rekursija, iš esmės, jūs įsteigti papildomą argumentą
, kai juosta bus int x į y
ir y atitinka galutiniam dalykas, jūs norite grįžti.
Taip, tada jūs ketinate būti grįžta juostą (x - 1), 2 * y.
Taip, kad tik aukšto lygio, kaip jums paversti ką rekursinis uodega.
Tačiau papildomos argumentas -
Ir tada galų gale, kai jūs pasieksite savo pagrindinę bylą, jūs tiesiog grįžti y
nes jūs kaupėsi per visą laikotarpį grąžos vertę, kurią norite.
Jūs rūšies buvo tai daryti keletą kartų, tačiau naudojant rekursinių skambučius.
Turite klausimų?
[] Gal apie rodyklių aritmetinis studentas, pavyzdžiui, kai naudojant styginiams. >> Žinoma.
Rodyklė aritmetika.
Kai naudojant styginiams tai lengva,, nes stygos char žvaigždutės,
simbolių yra amžinai ir visada vieną baitą
ir todėl rodyklė aritmetinis reguliariai aritmetinis, kai jūs susiduriame su stygos.
Tegul tiesiog pasakyti, char * s = "hello".
Taigi mes turime atminties bloką.
Ji turi 6 baitai, nes jūs visada reikia null terminatorius.
Char * s ketina atkreipti dėmesį į šio masyvo pradžioje.
Taigi taškai,.
Dabar, tai yra iš esmės, kaip bet kokia matrica veikia,
nepriklausomai nuo to, ar ji buvo malloc, ar tai dėl kamino grąža.
Bet masyvas yra iš esmės rodyklė į masyvo pradžios,
ir tada bet koks masyvas operacija, bet indeksavimo, tik vyksta į tą masyvo tam tikras kompensuoti.
>> Taigi, kai aš pasakyti kažką panašaus į S [3]; tai vyksta s ir skaičiuoti 3 simbolių in
Taigi [3], mes turime 0, 1, 2, 3, taip s [3] ketina perduoti šios l.
[Studentas] Ir mes galime pasiekti tą pačią vertę atlikdami s + 3 ir skliaustus, žvaigždė?
Taip.
Tai prilygsta * (s + 3);
ir tai yra amžinai ir visada ekvivalentas nesvarbu, ką jūs darote.
Jums niekada nereikės naudoti laikiklį sintaksę.
Jūs visada galite naudoti * sintaksė (-ai + 3).
Žmonės linkę patinka laikiklis sintaksę, nors.
[Studentas] Taigi visos matricos yra iš tikrųjų tik patarimų.
Yra nedidelis skirtumas, kai aš sakau, int x [4]; >> [studentas] Ar tai sukurti atmintį?
[Bowden], kad ketina sukurti 4 Ints kamino, kad 16 baitų bendras.
Ji ketina sukurti 16 baitų kamino.
x yra saugomi ne visur.
Jis yra tik simbolis, nuoroda į dalykas pradžios.
Nes jūs paskelbė masyvo viduje šią funkciją,
sudarytojas ketina padaryti, tai tiesiog pakeisti visus atvejus kintamojo x
kur tai įvyko, leidžiama pasirinkti, kaip įgyvendinti šiuos 16 baitų.
Ji negali padaryti, kad char * s, nes ai yra tikrasis rodyklė.
Jis yra nemokamas, tada nukreipkite į kitus dalykus.
x yra konstanta. Jūs negalite turėti nukreipkite žymiklį į kitą masyvą. >> [Studentas] Gerai.
Tačiau ši idėja, tai indeksavimo, yra tas pats, nepriklausomai nuo to, ar tai tradicinis masyvas
arba, jei tai yra rodyklė į kažką, arba jei tai žymiklį į malloced masyvo.
Ir iš tiesų, ji yra tokia tolygi, kad tai irgi tas pats.
Ji iš tikrųjų tiesiog verčia tai, kas viduje skliausteliuose ir kas liko skliausteliuose,
prideda jas kartu, ir dereferences.
Kad tai tik interpretuojama kaip * (s + 3) ar s [3].
[Studentas] Ar turite patarimų, nukreipiančios į 2-vienmačių masyvų?
>> Tai sunkiau. Tradiciškai, ne.
2-dimensional array yra tik 1-dimensional array su kai kuriais patogioje sintaksė
nes kai aš sakau, int x [3] [3], tai tikrai tik 1 su 9 reikšmių masyvas.
Ir todėl, kai aš indeksas, kompiliatorius žino, ką turiu galvoje.
Jei aš sakau, x [1] [2], ji žino, kad aš noriu eiti į antrą eilutę, kad ji ketina praleisti pirmąjį 3
ir tada ji nori Antras dalykas, ta prasme, kad jis ketina gauti šį vieną.
Bet ji vis dar yra tik vienas-dimensional array.
Ir todėl, jei aš norėjau priskirti žymiklį į masyvo,
Sakyčiau, int * p = x;
X tipas yra tiesiog
Tai grubus sakydamas tipas x, nes tai yra tik simbolis, ir tai nėra tikrasis kintamasis,
bet tai tik int *.
x yra tik rodyklė į šio pradžios. >> [Studentas] Gerai.
Ir todėl aš negalėsite naudotis [1] [2].
Manau, kad yra speciali sintaksė skelbiantis rodyklę,
kažkas juokinga kaip int (* p [- kažkas visiškai juokinga aš net nežinau.
Bet yra patarimų, kaip su skliausteliuose ir daiktų deklaravimo sintaksė.
Jis gali net jums tai padaryti.
Galėtų pažvelgti atgal į kažką, kad būtų pasakyti tiesą.
Atrodys vėliau, jei yra taško sintaksė. Bet jūs niekada pamatyti jį.
Ir net sintaksė yra tokia archajiška, kad jei jūs jį naudoti, žmonės bus nesuprantamas.
Daugiamačių masyvų yra gana reti, nes ji yra.
Jūs gana daug -
Na, jei jūs darote matricos dalykų ji nesiruošia būti retas,
bet, C jūs retai bus naudojant daugiamačių masyvų.
Taip. >> [Studentas] Tarkime, kad turite tikrai ilgai masyvas.
>> Todėl virtualiosios atminties, atrodo, būti viską iš eilės,
kaip elementų, viena šalia kitos,
bet fizinės atminties, tai būtų įmanoma, kad taip negali būti skaidomas? >> Taip.
Kaip veikia virtualiosios atminties tai tik atskiria -
Paskirstymo įrenginys yra puslapis, kuris linkęs būti 4 kilobaitai,
ir, kai procesas sako, ei, aš noriu naudoti šią atminties,
operacinė sistema ketina skirti 4 kilobaitų atminties, kad šiek tiek bloko.
Net jei jūs naudojate tik vieną mažą baitas visą atminties bloko,
operacinė sistema suteiks jai visas 4 kilobaitų.
Taigi, ką tai reiškia, aš galėjo - tarkim tai yra mano kamino.
Šis kamino gali būti atskirtos. Mano kamino gali būti megabaitų ir megabaitais.
Mano kamino gali būti didžiulis.
Tačiau kamino turi būti padalytas į atskirus puslapius,
jei pažvelgsime čia galime pasakyti, kad tai mūsų atminties,
jei aš turiu 2 GB RAM, tai yra faktinis adresas 0 kaip nulinis baitas mano RAM,
ir tai yra 2 gigabaitai visą kelią žemyn čia.
Taigi, šis puslapis gali atitikti šio bloko čia.
Šis puslapis gali atitikti šio bloko čia.
Tai vienas gali atitikti Vienas tai per čia.
Taigi operacinė sistema yra priskirti fizinės atminties
savavališkai bet kurį atskirą puslapį.
Ir tai reiškia, kad, jei ši riba būna sėdėjimas išsižergus masyvą,
masyvas atsitinka, turi būti palikta, tai ir teisė į šį puslapį, kad būtų
tada, kad bus padalyta į fizinės atminties masyvas.
Ir tada, kai jums mesti rūkyti programą, kai procesas baigiasi,
šie priskyrimai gauti ištrinami ir tada ji laisvai naudoti kitų dalykų šių mažai blokus.
Daugiau klausimų?
[Studentas] rodyklė aritmetika. >> Oh yeah.
Stygos buvo lengviau, bet žiūri kažką panašaus į int,
Taigi atgal į int x [4];
Nesvarbu, ar tai yra masyvas ar tai rodyklė į malloced masyvas 4 sveikieji skaičiai,
tai bus traktuoti taip pat.
[Studentas] Taigi matricos yra krūvos?
[Bowden] Masyvai nėra krūvos. >> [Studentas] Oh.
>> [Bowden] Šis masyvo tipas linkęs būti kamino
nebent jūs paskelbė jį ignoruojant globalių kintamųjų. Nenaudokite globalių kintamųjų.
Viduje funkcijos, sakau int x [4];
Ji ketina sukurti 4-sveikasis skaičius blokas kamino šio masyvo.
Bet tai malloc (4 * sizeof (int)); ketina eiti krūvos.
Bet po to, kai šiuo klausimu galiu naudoti x ir p gana daug tais pačiais būdais,
išskyrus išimčių, aš sakė prieš maždaug galite perskirstyti p.
Techniškai, jų dydžiai yra šiek tiek kitoks, bet tai visiškai neturi reikšmės.
Jūs niekada iš tikrųjų naudoti jų dydžius.
P galėčiau pasakyti p [3] = 2 arba x [3] = 2;
Jūs galite naudoti juos lygiai tais pačiais būdais.
Taigi rodyklė aritmetinis dabar - Taip.
[Studentas] Ar jūs neturite daryti p * Jei turite laikiklius?
Skliausteliuose numanoma dereference. >> Gerai.
Tiesą sakant, tai, ką jūs sakote, su galite gauti daugiamačių masyvų
patarimų, ką galite padaryti, yra kažkas panašaus į, tarkim, int ** pp = malloc (sizeof (int *) * 5);
Aš tiesiog rašyti viskas iš pradžių.
Nenorėjau, kad vienas.
Gerai.
Ką aš padariau, čia - Tai turėtų būti pp [i].
Taigi PP žymeklis žymeklis.
Jūs mallocing pp, kad rodytų į 5 int žvaigždžių masyvo.
Taigi atminties turite kamino pp
Ji ketina atkreipti dėmesį į 5 blokus, kurie visi yra patys patarimų masyvo.
Ir tada, kai aš malloc žemyn čia, aš malloc, kad kiekvienos iš šių atskirų rodykles
turėtų atkreipti dėmesį į atskirą bloką 4 baitų krūvos.
Taigi tai rodo iki 4 baitų.
Ir tai vienas į kitą 4 baitų.
>> Ir visi jie nurodo į savo 4 baitų.
Tai suteikia man daro daugiamačių dalykų.
Galėčiau pasakyti, pp [3] [4], tačiau dabar tai yra ne tas pats kaip daugiamačių masyvų
nes daugiamatės matricos išversti [3] [4] į vieną kompensuoti į x masyvo.
Tai dereferences p, pasiekia trečiąjį indeksą, tada dereferences, kad
ir užklausų - 4 negalioja - antrą indeksas.
Kadangi, kai mes turėjome int x [3] [4] anksčiau kaip daugiamatis masyvas
ir kai dukart laikiklį tai tikrai tik vienas dereference,
esate po vieną žymiklį ir tada kompensuoti,
tai tikrai 2D nuorodos.
Po 2 atskirus nurodymus.
Taigi tai taip pat yra techniškai leidžia jums turėti daugiamačių masyvų
kur kiekvienas masyvas yra įvairių dydžių.
Taigi, manau, Jagged daugiamatės matricos yra tai, ką ji vadinama
nes tikrai pirmas dalykas, galėtų būti kažkas, kad turi 10 elementų,
Antras dalykas, galėtų būti kažkas, kad yra 100 elementai.
[Studentas] Ar yra kokia nors riba rodykles, jūs galite turėti
nukreipta į kitas rodykles? >> No
Jūs galite turėti int ***** p.
Atgal į rodyklės aritmetinis - >> [studentas] Oh. >> Taip.
[Studentas] Jeigu aš turiu int *** p ir tada aš padaryti dereferencing ir sakau p * yra lygi šiai reikšmei,
tai tik ketina padaryti 1 lygio dereferencing? >> Taip.
Taigi, jei norite prieiti prie dalykas, kad paskutinis rodyklė būtų nukreipta -
Tada jūs *** p. >> Gerai.
Taigi tai yra 1 blokas, atkreipia dėmesį į kitą bloko į kitą bloko punktuose nurodo, kad p.
Tada, jei jūs darote * p = kažkas, tada jūs keičiasi tai
dabar į kitą bloko. >> Gerai.
>> [Bowden] Ir jei jie buvo malloced, tada jūs jau nutekėjo atmintį
nebent jums atsitikti, kad skirtingas šių nuorodų
nes jūs negalite grįžti Tuos, kad jūs tiesiog išmetė.
Rodyklė aritmetika.
int x [4]; ketina skirti 4 sveikieji skaičiai masyvo
kur x yra nurodyti masyvo pradžioje.
Taigi, kai aš sakau kažką panašaus x [1], noriu, kad jis reiškia eiti į antrąjį sveikasis skaičius masyve,
kuris būtų šį vieną.
Bet iš tikrųjų, tai 4 baitų į masyvo, nes tai sveikasis skaičius užima 4 baitų.
Taigi, kompensuoti iš 1, iš tikrųjų reiškia, kompensuoti iš 1
kartus nepriklausomai nuo masyvo tipas yra dydis.
Tai yra sveikųjų skaičių masyvas, todėl ji žino, kad padaryti 1 kartus dydis int, kai ji nori kompensuoti.
Sintaksė. Nepamirškite, kad tai prilygsta * (x + 1);
Kai aš sakau, POINTER + 1, ką kuri grąžina adresas, kad žymeklis yra saugoti
plius 1 kartų rodyklė tipo dydis.
Taigi, jei x = ox100, tada x + 1 = ox104.
Ir jūs galite piktnaudžiauti tai ir pasakyti kažką panašaus char * c = (char *) x;
ir dabar bus tas pats adresas kaip x c.
c būti lygus ox100,
bet c + 1 bus lygus ox101
nes rodyklė aritmetinis priklauso nuo rodyklė tipo, kad jūs įtraukiate į.
Taigi c + 1, atrodo c, char rodyklė, todėl ketina pridėti 1 kartų dydį char,
, kuris visada bus 1, taigi, galėsite gauti 101,
kadangi, jei aš tai padaryti X, kuris taip pat dar 100, x + 1 bus 104.
[Studentas] Ar galima naudoti C + +, siekiant iš anksto žymeklį 1?
Taip, galite.
Jūs negalite padaryti, kad su x, nes x yra tik simbolis, tai yra pastovus; jūs negalite pakeisti x.
>> Bet c atsitinka tiesiog būti rodyklė, kad C + + yra visiškai galioja ir jis bus prieaugio 1.
Jei c buvo tik int *, tada C + + bus 104.
+ + Rodyklė aritmetinis tik kaip c + 1 padaryta rodyklė aritmetiką.
Tai iš tikrųjų, kaip daug dalykų, pavyzdžiui, sujungti rūšiuoti -
Užuot kūrę dalykų kopijas, galite vietoj Pass -
Pavyzdžiui, jei aš norėjau perduoti šią masyvo pusę - tegul ištrinti kai tai.
Tarkime, aš norėjau perduoti šią masyvo funkcijos pusę į.
Ką turėtų praeiti tą funkciją?
Jei galiu perduoti x, Aš perduodu šį adresą.
Bet aš noriu perduoti šį konkretų adresą. Taigi, ką turėčiau praeiti?
[Studentas] pointer + 2?
[Bowden] Taigi x + 2. Taip.
Kad bus šis adresas.
Jūs taip pat labai dažnai matyti, kaip X [2], o po to, kad adresas.
Taigi, jūs turite imtis jo adresą, nes laikiklis yra numanomas dereference.
x [2] - tai į vertę, kuri yra šiame langelyje, ir tada jūs norite tame langelyje adresą,
todėl jūs sakote & X [2].
Taigi tai, kaip kažkas sujungti rūšiuoti, kur norite praleisti pusę sąrašą kažką
jūs tikrai tiesiog praeiti ir x [2], o dabar kiek rekursinis skambutis
mano naujas masyvas prasideda ten.
Paskutinės minutės klausimai.
[Studentas] Jei mes neskirti ampersendo arba - kas tai vadinama? >> Žvaigždė?
[Studentas] Star ". >> Techniškai, dereference operatorius, bet - >> [studentas] Dereference.
>> Jei mes neturime įdėti žvaigždę ar ampersendo, kas atsitiks, jei aš tiesiog pasakyti, y = x ir x yra rodyklė?
Kas yra y tipas? >> [Studentas] aš tiesiog pasakyti, kad tai žymeklį 2.
Taigi, jei jūs tiesiog pasakyti, y = x, dabar x ir y žymiklį į tą patį. >> [Studentas] Taškas į tą patį.
Ir, jei x yra int rodyklė? >> Jis skundžiasi, nes tu negali priskirti patarimų.
[Studentas] Gerai.
Atminkite, kad patarimų, nors mes ir padaryti juos kaip rodyklėmis,
tikrai visi jie - parduotuvė int * x - tikrai visais x kaupia kažkas panašaus ox100
kurią mes atsitiktų atstovauti nukreipta į 100 laikomo bloko.
Taigi, kai aš sakau, int * y = x; aš tiesiog nukopijuoti ox100 į y,
, kurią mes tik ketina atstovauti kaip y, taip pat nukreipta į ox100.
Ir jei aš sakau, int i = (int) x, tada i laikyti, nepriklausomai ox100 vertė
viduje ji, bet dabar tai bus aiškinama kaip sveikasis skaičius, vietoj rodykle.
Bet jūs turite mesti arba dar ji skundžiasi.
[Studentas] Taigi jums reiškia mesti -
Jis ketina liejimo int x arba liejimo int y?
[Bowden] Kas?
[Studentas] Gerai. Po šių skliausteliuose ten bus x arba ay yra?
>> [Bowden]. x ir y yra lygiaverčiai. >> [Studentas] Gerai.
Nes jie abu patarimų. >> Taip.
[Studentas] Taigi tai būtų laikyti šešioliktainį 100 sveikasis forma? >> [Bowden] Yeah.
Bet ne, kokia ji nurodo vertę.
[Bowden] Taip. >> [Studentas] Taigi tik sveikasis forma adresas. Gerai.
[Bowden] Jei nori dėl kokių nors keistai priežasties,
jums tik gali susidoroti su rodyklės ir niekada elgtis su sveikaisiais skaičiais
ir tiesiog būti kaip int * x = 0.
Tada jūs ketinate gauti tikrai supainioti,, kai rodyklė aritmetinis prasideda vyksta.
Taip, kad jie saugo numeriai yra beprasmis.
Tai tik kaip jūs galų gale jas aiškinant.
Taigi, aš laisvai kopijuoti iš int * ox100 int,
ir aš tikiu, priskirti - Tu tikriausiai nesiruošia gauti rėkė ne liejimo
Aš esu nemokamai priskirti kažką panašaus (int *) į šį savavališkai int * ox1234.
Taigi ox123 yra lygiai taip pat galioja atminties adresas & y.
& Y atsitinka atsiųsti ką nors, kad yra gana daug ox123.
[Studentas] Ar tai būtų šaunus būdas eiti Šešioliktainius skaičius dešimtaine forma,
patinka, jei turite rodyklę ir jums mesti jį kaip int?
[Bowden] Galite tikrai tik spausdinti naudojant kaip printf.
Tarkime, turiu int y = 100.
Taigi printf (% d \ n - kaip jau turėtumėte žinoti - atsispausdink, kad kaip sveikasis skaičius,% x.
Mes tiesiog atspausdinti jį kaip šešioliktainius.
Taigi žymeklis nėra saugomas kaip šešioliktainius
ir sveikasis skaičius nėra saugomas kaip dešimtainį.
Viskas bus saugoma kaip dvejetainis.
Tai tiesiog, kad mes linkę patarimų, kaip šešioliktainius
nes mes manome, šių 4-baitų blokus dalykų,
ir atminties adresai yra linkę būti susipažinę.
Mes, pavyzdžiui, jei ji pradeda su bf, tada jis būna, kad ant kamino.
Taigi, tai tik mūsų interpretacija kaip šešioliktainius rodykles.
Gerai. Paskutinę klausimų?
>> Aš būsiu čia šiek tiek, po to, jei turite ką nors kita.
Ir tai, kad pabaiga.
>> [Studentas] Puiku! [Plojimai]
>> [CS50.TV]