[Powered by Google Translate] [4 jakso - More Comfortable] [Rob Bowden - Harvardin yliopisto] [Tämä on CS50. - CS50.TV] Meillä on tietokilpailu huomenna, jos te tiennyt että. Se on pohjimmiltaan kaikesta olisit nähnyt luokassa tai olisi pitänyt nähdä luokassa. Se sisältää viitteitä, vaikka he äskettäin aihe. Sinun pitäisi ainakin ymmärtää korkeita niistä. Mitään, oli mennyt ohi luokassa sinun pitäisi ymmärtää tietokilpailu. Joten jos sinulla on kysyttävää niitä, voit pyytää heitä nyt. Mutta tämä tulee olemaan hyvin opiskelija-johtoiseen istunto, jossa te kysyä kysymyksiä, niin toivottavasti ihmiset ovat kysymyksiä. Onko kellään kysyttävää? Kyllä. >> [Opiskelija] Voitko mennä yli osoittimia uudestaan? Menen aikana viitteitä. Kaikki muuttujat välttämättä asu muistiin, mutta yleensä et ole huolissasi siitä ja sanoit x + 2 ja y + 3 ja kääntäjä selvittää missä asiat elävät sinua. Kun olet tekemisissä viitteitä, nyt olet täsmällinen näitä muisti osoitteita. Joten yhden muuttujan aina vain elää yhdessä osoitteessa milloin tahansa. Jos haluamme julistaa osoitin, mitä tyyppiä tulee näyttämään? Haluan julistaa osoitin p. Mitä tyyppiä näyttää? [Opiskelija] int * p. >> Joo. Joten int * p. Ja miten saan sen viitata x? >> [Opiskelija] Ampersand. [Bowden] Eli et-on kirjaimellisesti kutsutaan osoite operaattorin. Joten kun sanon & x se alkaa muistin osoitteen muuttujan x. Joten nyt olen osoittimen p, ja missä minun koodia voin käyttää * p tai voisin käyttää x ja se on täsmälleen sama asia. (* P). Mitä tämä tekee? Mitä tuo tähti tarkoittaa? [Opiskelija] Se tarkoittaa arvoa, joka tässä vaiheessa. >> Joo. Joten jos katsomme sitä, se voi olla erittäin hyödyllistä vetää pois kaaviot jos tämä on pieni laatikko muistia x, joka sattuu on arvo 4, Sitten meillä on pieni laatikko muistia p, ja niin p pistettä x, niin vedämme nuoli P x. Joten kun sanomme * p sanomme mennä laatikko, joka on s.. Star on seurata nuolta ja sitten tehdä mitä haluat kanssa että laatikko tuolla. Voin siis sanoa * p = 7 ja että menee laatikko, joka on x ja muutos 7. Tai voisin sanoa int z = * p * 2; Tämä on hämmentävää, koska se on tähti, tähti. Yksi tähti on dereferencing p, muu tähti kertomalla 2. Ilmoitus voisin olla yhtä hyvin korvata * P x. Voit käyttää niitä samalla tavalla. Ja sitten myöhemmin voin olla p viittaavat aivan uusi asia. Voin vain sanoa p = &z; Joten nyt P ei enää viittaa x, se osoittaa z. Ja aina teen * p se on sama kuin tekemässä z. Joten hyödyllisiä asia tässä on, kun alamme päästä toimintoihin. Se on tavallaan turha julistaa osoitin, joka osoittaa jotakin ja sitten olet vain dereferencing se kun olet voinut käyttää alkuperäisen muuttujan aluksi. Mutta kun olet päässyt toimintoja - niin sanotaan meillä jokin funktio, int foo, , joka vie osoittimen ja vain ei * p = 6; Kuten näimme aiemmin swap, et voi tehdä tehokasta swap ja erillinen toiminto vain hieman ohi kokonaislukuja, koska kaikki C aina ohi arvon. Silloinkin kun olet ohimennen viitteitä olet ohimennen arvosta. Se vain on niin, että nämä arvot ovat muistissa osoitteita. Joten kun sanon foo (p), olen ohimennen osoitin funktion foo ja sitten foo tekee * p = 6; Niin sisällä, jotka toimivat, * p on edelleen vastaa x, mutta en voi käyttää x sisällä että funktion koska se ei ole scoped kyseisen toiminnon. Joten * p = 6 on ainoa tapa voin käyttää paikallisen muuttujan toisen toiminnon. Tai, no, osoittimet ovat ainoa tapa voin käyttää paikallisen muuttujan toisen toiminnon. [Opiskelijan] sanokaamme olet halunnut palata osoitin. Miten aiotte tehdä sen? [Bowden] Palauta osoitin kuin jotain int y = 3; tuottoa & y? >> [Opiskelija] Joo. [Bowden] Okei. Sinun ei koskaan tulisi tehdä. Tämä on huono. Taisin nähdä näissä luentokalvot olet alkanut nähdä tämä koko kaavio muistin missä täällä sinulla muistiosoite 0 ja tänne olet muistiosoite 4 gigan tai 2 32. Joten sinulla joitakin juttuja ja joitakin juttuja, ja sitten sinulla on pino ja olet saanut kasaan, joka juuri alkanut oppia, kasvaa. [Opiskelija] Eikö kasan yläpuolella pino? Joo. Keko päällä, eikö? >> [Opiskelija] No, hän laittoi 0 päälle. [Opiskelija] Oh, hän laittaa 0 päälle. >> [Opiskelija] Ai, okei. Disclaimer: Anywhere kanssa CS50 aiot nähdä sen tällä tavalla. >> [Opiskelija] Okei. Se on vain, että kun olet ensimmäinen nähdä pinoja, kuten silloin ajattelet pinon luulet pinoaminen asioita päällekkäin. Joten meillä on tapana kääntää tämän ympäri niin pino kasvaa ylöspäin kuin pino normaaliin tapaan sijaan pinon roikkuu alaspäin. >> [Opiskelija] Älä kasaa teknisesti kasva liikaa, vaikka? Se riippuu mitä tarkoitat kasvaa. Pinoon ja pino kasvavat aina vastakkaisiin suuntiin. Pino on aina kasvaa siinä mielessä, että se kasvaa kohti korkeampia muisti osoitteita, ja kasa kasvaa alaspäin koska se kasvaa kohti alemman muistipaikan osoitetta. Niin alkuun on 0 ja pohja on suuri muisti osoitteita. He molemmat kasvavat, aivan vastakkaisiin suuntiin. [Opiskelija] Tarkoitin vain, että koska sanoit laittaa pinon pohjalle koska näyttää siltä, ​​intuitiivinen, sillä, että pino alkaa yläosassa kasaan, keko on itsensä päälle myös, joten that's - >> Joo. Voit myös ajatella kasan kuin kasvaa ja suurempi, mutta pino enemmän. Joten pino on joka me sellaista halua näyttää kasvaa. Mutta kaikkialla näytät muuten aikoo näyttää osoitteen 0 yläreunassa ja korkein muistin osoitteen alaosassa, joten tämä on tavanomaista näkymä muistia. Onko sinulla kysymys? [Opiskelija] Voisitko kertoa lisää kasaan? Joo. Saan siihen toisessa. Ensinnäkin, menee takaisin miksi palaamassa & Y on huono asia, pinoon sinulla nippu pino kehyksiä, jotka edustavat kaikkia toimintoja jotka on kutsuttu. Joten unohdetaan edellinen asioita, yläosassa pino on aina olemaan tärkein ominaisuus koska se on ensimmäinen tehtävä, joka on kutsutaan. Ja sitten kun soitat toisen toiminnon, pino tulee kasvamaan alaspäin. Joten jos pyydän jokin funktio, foo, ja se saa oman pinokehys, se voi kutsua joitakin toiminto, baari, se saa oman pinokehys. Ja baari voisi olla rekursiivinen, ja se voi kutsua itseään, ja niin tämä toinen puhelu bar on menossa oma pino runko. Ja niin, mitä tapahtuu näiden pino kehyksiä ovat kaikki paikalliset muuttujat ja kaikki funktion argumentteja, että - Jokainen asioita, jotka ovat paikallisesti scoped tämän toiminnon mennä näissä pino kehyksiä. Joten se tarkoittaa, kun sanoin jotain baari on funktio, Olen juuri menossa julistaa kokonaisluku ja palaa sitten osoitin että kokonaisluku. Joten mistä y elää? [Opiskelija] y asuu baarissa. >> [Bowden] Joo. Jossain tämä pieni neliö muistia on littler neliö, joka on y siinä. Kun palaan & Y, olen palaamassa osoittimen tämä pieni lohko muistia. Mutta sitten kun funktio palaa, sen pinokehys saa piipahti pinosta. Ja siksi sitä kutsutaan pino. Se on kuin pino tietorakenne, jos tiedät mitä se on. Tai edes pidä pino tarjottimia on aina esimerkiksi tärkein on menossa pohjalle, sitten ensimmäinen funktio soitat ei mene päälle, että ja et voi saada takaisin päävalikkoon kunnes palaat kaikki toiminnot, jotka on kutsuttu jotka on sijoitettu sen päälle. [Opiskelija] Joten jos teit palaavat & Y, että arvo voidaan muuttaa ilman erillistä ilmoitusta. Kyllä, Se on - >> [opiskelija] Voisi olla päälle. >> Joo. Se on täysin - Jos yrität ja - Tämä olisi myös int * bar koska se palaa osoitin, joten sen paluuarvon tyyppi on int *. Jos yrität käyttää paluuarvo tämän toiminnon, se on määrittelemätöntä käyttäytymistä koska osoitin osoittaa huono muisti. >> [Opiskelija] Okei. Joten mitä jos, esimerkiksi, sinun julisti int * y = malloc (sizeof (int))? Se on parempi. Kyllä. [Opiskelija] Puhuimme miten kun vedät asioita meidän roskakoriin he eivät oikeastaan ​​poistaa, me vain menettävät osoittimia. Eli tässä tapauksessa emme oikeastaan ​​poistaa arvo vai onko se vielä siellä muistissa? Suurimmaksi osaksi, se tulee yhä olemaan siellä. Mutta sanokaamme satumme soittaa jonkin muun toiminnon, Baz. Baz on menossa oma pino runko täällä. Se tulee olemaan päälle kaikki tätä kamaa, ja sitten jos myöhemmin kokeilla ja käyttää osoitin että sinulla ennen, se ei tule olemaan sama arvo. Se tulee muuttuneen vain siksi soitit toiminnon Baz. [Opiskelija] Mutta ellemme olisi, voisimme silti 3? [Bowden] Todennäköisesti olisit. Mutta et voi luottaa siihen. C sanoo vain määrittelemätöntä käyttäytymistä. [Opiskelija] Voi se. Okei. Joten kun haluat palauttaa osoittimen, tämä on silloin malloc tulee käyttöön. Kirjoitan oikeastaan ​​vain palata malloc (3 * sizeof (int)). Menemme yli malloc enemmän toinen, mutta ajatus malloc on kaikki paikalliset muuttujat aina mennä pinoon. Mitään, mikä on malloced menee kasaan, ja se ikuisesti ja aina kasaan kunnes erikseen vapauttaa sitä. Joten tämä tarkoittaa, että kun malloc jotain, se tulee selviämään jälkeen toiminto palaa. [Opiskelija] Aikooko se selviäisi jälkeen ohjelma pysähtyy? >> No Okei, joten se tulee olemaan siellä kunnes ohjelma on aina valmis käynnissä. >> Kyllä. Voimme mennä yli yksityiskohtia siitä, mitä tapahtuu, kun ohjelma pysähtyy. Saatat joutua muistuttaa minua, mutta se on erillinen asia. [Opiskelija] Joten malloc luo osoittimen? >> Joo. Malloc - >> [opiskelija] Mielestäni malloc nimeää lohko muistin osoitin voi käyttää. [Bowden] Haluan että kaavio uudestaan. >> [Opiskelija] Joten tämä toiminto toimii, vaikka? [Opiskelija] Joo, malloc nimeää lohko muistia, jota voit käyttää, ja sitten se palauttaa osoitteen ensimmäinen lohko, että muistia. [Bowden] Joo. Joten kun malloc, olet tarttumalla joitakin lohko muistia joka on tällä hetkellä kasaan. Jos keko on liian pieni, niin kasa on juuri menossa kasvaa, ja se kasvaa tähän suuntaan. Joten sanokaamme keko on liian pieni. Sitten se on noin kasvavan hieman ja palata osoittimen tähän lohkoon että vain kasvoi. Kun ilmaista tavaraa, teet enemmän tilaa kasaan, niin sitten myöhemmin soittaa malloc voi käyttää uudelleen, että muistin että olet aiemmin vapautettu. Tärkeä asia malloc ja free on, että se antaa sinulle täydellisen hallinnan elinaikana näiden muistilohkoja. Globaalit muuttujat ovat aina elossa. Paikalliset muuttujat ovat elossa niiden soveltamisalaan. Heti mennä ohi kihara ahdin, paikalliset muuttujat ovat kuolleet. Malloced muisti on elossa, kun haluat sen olevan elossa ja sitten vapautuu, kun kerrot sen vapautetaan. Nämä ovat oikeastaan ​​vain 3 tyyppisiä muistia, todella. On automaattinen muistin hallinta, joka on pino. Asioita tapahtuu automaattisesti. Kun sanot int x, muistista on int x. Kun x sammuu soveltamisalasta, muisti talteen varten x. Sitten on dynaaminen muistin hallinta, joka on mitä malloc on, mikä on kun on ohjaus. Voit dynaamisesti päättää milloin muistia pitäisi ja ei pitäisi kohdentaa. Ja sitten on staattinen, mikä tarkoittaa vain sitä, että se elää ikuisesti, joka on mitä globaalien muuttujien ovat. He vain aina muistiin. Kysymyksiä? [Opiskelija] Voitteko määritellä lohkon vain käyttämällä aaltosulkeita mutta ei tarvitse olla, jos ilmoitus tai kun ilmoitus tai jotain sellaista? Voit määrittää lohkon kuin toiminto, mutta se on aaltosulkeita liikaa. [Opiskelija] Eli et voi vain olla kuin satunnaisesti pari aaltosulkeita koodissa että on paikallisia muuttujia? >> Kyllä voit. Sisällä int baarin voisimme {int y = 3;}. Se pitäisi olla täällä. Mutta että täysin määritellään soveltamisala int y. Sen jälkeen, kun tämä toinen kihara ahdin, y ei voi enää käyttää. Et juuri koskaan tehdä, vaikka. Palatakseni mitä tapahtuu, kun ohjelma loppuu, siellä sellainen väärinkäsitys / puoli valhetta, että annamme sen vain helpottaa asioita. Kerromme teille, että kun jakaa muistia olet kohdistamalla osa kimpale RAM kyseisen muuttujan. Mutta et todellakaan kosketa RAM koskaan ohjelmat. Jos ajattelet sitä, kuinka piirsin - Ja itse asiassa, jos et mene läpi GDB näet saman asian. Riippumatta siitä, kuinka monta kertaa olet ajaa ohjelma tai mitä ohjelmaa käytät, pino on aina menossa aloittaa - olet aina menossa nähdä muuttujien ympäri osoite oxbffff jotain. Se on yleensä jossain tuolla alueella. Mutta miten 2-ohjelmien mahdollisesti on viitteitä samaan muistiin? [Opiskelija] On joitakin mielivaltainen nimeäminen jossa oxbfff on tarkoitus olla RAM todella voi olla eri paikoissa riippuen siitä, milloin toiminto nimeltään. Joo. Termi on virtuaalinen muisti. Ajatuksena on, että jokainen yksittäinen prosessi, joka ikinen ohjelma, joka on käynnissä tietokoneessa on oma - Oletetaan 32 bittiä - täysin riippumaton osoite tilaa. Tämä on osoite tilaa. Se on oma täysin itsenäinen 4 gigatavua käyttää. Joten jos suoritat 2 ohjelmia samanaikaisesti, tämä ohjelma pitää 4 gigatavua itselleen, Ohjelman näkee 4 gigatavua itselleen, ja se on mahdotonta tämän ohjelman dereference osoitin ja lopulta muistilla tästä ohjelmasta. Ja mitä virtuaalinen muisti on on kuvaus prosesseista osoitetilan todellisia asioita RAM. Joten se on jopa käyttöjärjestelmän tietää, että Hei, kun tämä kaveri dereferences osoitin oxbfff, joka todella merkitsee että hän haluaa RAM tavu 1000, katsoo, että jos tämä ohjelma dereferences oxbfff, hän todella haluaa RAM tavu 10000. Ne voivat olla mielivaltaisesti kaukana toisistaan. Tämä on jopa totta asioita yhden prosesseja osoiteavaruuteen. Niin kuin se näkee kaikki 4 gigatavua itselleen, mutta sanotaanko - [Opiskelija] Onko jokainen prosessi - Sanotaan sinulla on tietokone, jossa on vain 4 gigatavua muistia. Onko jokainen prosessin nähdä koko 4 gigatavua? >> Kyllä. Mutta 4 gigatavua se näkee on valhe. Se on vain sen mielestä on kaikki tämä muisti, koska se ei tiedä mitään muuta prosessia olemassa. Se käyttää vain niin paljon muistia kuin se todella tarvitsee. Käyttöjärjestelmä ei aio antaa RAM tähän prosessiin jos se ei käytä mitään muistia koko tällä alueella. Se ei aio antaa sen muistiin kyseiselle alueelle. Mutta ajatus on, että - Yritän ajatella - En voi ajatella analogisesti. Analogiat ovat kovia. Yksi kysymyksistä virtuaalimuistin tai yksi niistä asioista, se on ratkaista että prosessien tulisi olla täysin tietämättömiä toisistaan. Ja niin voit kirjoittaa minkä tahansa ohjelman, joka juuri dereferences tahansa osoitin, kuten vain kirjoittaa ohjelma, joka kertoo * (ox1234), ja että on dereferencing muistiosoite 1234. Mutta se on jopa käyttöjärjestelmä sitten kääntää mitä 1234 tarkoittaa. Joten jos 1234 sattuu olemaan voimassa muisti osoite tähän prosessiin, kuin se pinoon tai jotain, niin se palauttaa arvon että muistin osoitteen niin pitkälle kuin prosessi tietää. Mutta jos 1234 ei ole kelvollinen osoite, kuten se tapahtuu laskeutumaan Joissakin pieni pala muistia täällä, että on kuin pino ja sen jälkeen kasaan ja et ole oikeasti käyttänyt tätä, niin silloin saat asiat kuten segfaults koska olet koskettaa muistia, että sinun ei pitäisi koskettaa. Tämä pätee myös - 32-bittinen järjestelmä, 32 bittiä tarkoittaa olet 32 ​​bittiä määrittää muistin osoite. Se, miksi osoittimet ovat 8 tavua, koska 32 bittiä on 8 tavua - tai 4 tavua. Osoittimet ovat 4 tavua. Joten kun näet osoittimen kuten oxbfffff, että on - Sisällä minkään ohjelman voit vain rakentaa mielivaltaiseen osoitin, missä tahansa ox0 ja ox 8 f's - ffffffff. [Opiskelija] Etkö sanonut he 4 tavua? >> Joo. [Opiskelija] Sitten jokainen tavu on - >> [Bowden] Heksadesimaali. Heksadesimaali - 5, 6, 7, 8. Joten viitteitä aiot aina nähdä heksadesimaalimuodossa. Se on vain miten luokittelemme osoittimia. Joka 2 numeroa heksadesimaalinen on 1 tavu. Joten siellä tulee olemaan 8 heksadesimaalilukua 4 tavua. Joten jokainen osoittimen 32-bittinen järjestelmä tulee olemaan 4 tavua, mikä tarkoittaa, että sinun prosessi voi rakentaa mielivaltaiseen 4 tavua ja tehdä osoittimen pois, mikä tarkoittaa, että niin paljon kuin se on tietoinen siitä, se voi puuttua koko 2 32 tavua muistia. Vaikka se ei oikeastaan ​​ole pääsyä, että vaikka tietokoneessa on vain 512 megatavua, sen mielestä on niin paljon muistia. Ja käyttöjärjestelmä on fiksu, että se vain osoittaa, mitä todella tarvitset. Se ei vain mennä, oh, uusi prosessi: 4 keikkoja. Joo. >> [Opiskelija] Mitä härkä tarkoittaa? Miksi kirjoitat sen? Se on vain symboli heksadesimaali. Kun näet useita alkavat härkä, peräkkäiset asiat ovat heksadesimaalimuodossa. [Opiskelija] Olit selittää mitä tapahtuu, kun ohjelma loppuu. >> Kyllä. Mitä tapahtuu, kun ohjelma loppuu on käyttöjärjestelmä vain poistaa kuvaukset että se on nämä osoitteet, ja se on siinä. Käyttöjärjestelmä voi nyt vain antaa joka muisti toiseen ohjelma käyttää. [Opiskelija] Okei. Joten kun jakaa jotain kasaan tai pino-tai globaaleja muuttujia tai mitään, ne kaikki katoavat heti ohjelman päättymisen koska käyttöjärjestelmä on nyt vapaa antaa että muisti muille prosessiin. [Opiskelija] Vaikka on luultavasti vielä arvoja kirjoitettu? >> Joo. Arvot ovat todennäköisesti edelleen siellä. Se on vain se tulee olemaan vaikeaa saada niitä. Se on paljon vaikeampaa saada niitä kuin se on saada aikaa poistettu tiedosto koska poistetun tiedoston sellainen istuu siellä pitkään ja kiintolevy on paljon isompi. Joten se tulee korvata eri puolilla muistia ennen kuin se tapahtuu korvata kimpale muistin että tiedosto käyttää olevan. Mutta tärkein muistia, RAM, voit selata paljon nopeammin, joten se tulee hyvin nopeasti päälle. Kysymykset tämän tai jotain muuta? [Opiskelija] Minulla on kysyttävää eri aihe. >> Okei. Onko kellään kysyttävää tähän? Okei. Eri aihe. >> [Opiskelija] Okei. Olin menossa läpi joitakin käytännön testejä, ja yksi heistä se puhui sizeof ja arvo, että se palauttaa tai eri muuttujan tyyppiä. >> Kyllä. Ja sanoi, että sekä int ja pitkä sekä tuotto 4, joten he molemmat 4 tavua pitkä. Onko eroa int ja pitkä, vai onko se sama asia? Kyllä, on olemassa ero. C-standardi - Olen luultavasti menossa sotkea. C-standardi on aivan kuin mitä C on virallisiin asiakirjoihin C. Tämä on mitä se sanoo. Joten C standardi sanoo vain, että char ikuisesti ja aina 1 tavun. Kaiken sen jälkeen, että - lyhyen on aina vain määritelty niin, että suurempi tai yhtä suuri kuin char. Tämä saattaa olla ehdottomasti suurempi kuin, mutta ei positiivista. Int on juuri määritelty niin, että suurempi tai yhtä suuri kuin lyhyt. Ja pitkä on juuri määritelty niin, että suurempi tai yhtä suuri kuin int. Ja pitkään pitkään on suurempi tai yhtä suuri kuin pitkä. Joten ainoa asia C standardi määrittelee on suhteellinen tilaamista kaiken. Todellisen muistin määrä, että asiat vievät yleensä jopa täytäntöönpanoa, mutta se on aika hyvin määritelty tässä vaiheessa. >> [Opiskelija] Okei. Joten shortsit ovat lähes aina olemaan 2 tavua. Ints ovat lähes aina olemaan 4 tavua. Pitkät pitkät ovat lähes aina olemaan 8 tavua. Ja kaipaa, se riippuu siitä, käytät 32-bittinen tai 64-bittinen järjestelmä. Niin kauan on menossa vastaamaan järjestelmän tyyppiä. Jos käytät 32-bittinen järjestelmä kaltainen laite, se tulee olemaan 4 tavua. Jos käytät 64-bittistä kuin paljon viime tietokoneiden, se tulee olemaan 8 tavua. Ints ovat lähes aina 4 tavua tässä vaiheessa. Pitkä pitkät ovat lähes aina 8 tavua. Aikaisemmin, ints käytetään vain 2 tavua. Mutta huomaa, että tämä täysin täyttää kaikki nämä suhteet suurempi ja yhtä. Niin kauan on täydellisesti saa olla saman kokoinen kuin kokonaisluku, ja se on myös mahdollisuus olla saman kokoinen kuin pitkä pitkä. Ja se vain niin sattuu olemaan, että 99,999% järjestelmiä, se tulee olemaan yhtä suuri kuin joko int tai pitkään pitkään. Se vain riippuu 32-bittinen tai 64-bittinen. >> [Opiskelija] Okei. Vuonna kellukkeet, miten on desimaalipilkun nimetty bitteinä? Niinkuin binary? >> Joo. Sinun ei tarvitse tietää, että CS50. Et edes opi että 61. Et opi että oikeastaan ​​missään aikana. Se on vain edustus. Unohdan tarkka bitti siirtolapuutarhojen. Ajatus liukulukujen on, että te jakaa tietty määrä bittejä edustamaan - Periaatteessa kaikki on tieteellisessä muodossa. Joten te jakaa tietty määrä bittejä edustamaan itse numeroa, kuten 1.2345. En voi koskaan edustaa useita enemmän numeroita kuin 5. Sitten voit myös varata tietty määrä bittejä siten, että sillä on taipumus olla esimerkiksi voit vain mennä jopa tietty määrä, kuten se on suurin eksponentti voi olla, ja voit vain mennä alas tietty eksponentti, kuten se pienin eksponentti voi olla. En muista tarkkaa bitit jaetaan kaikkien näiden arvojen mutta tietty määrä bittejä on omistettu 1,2345, toinen tietty määrä bittejä on omistettu eksponentti ja se on mahdollista vain edustamaan eksponentti tietyn koon. [Opiskelija] Ja kaksinkertainen? Onko se kuin erikoispitkä float? >> Joo. Se on sama asia kuin float paitsi nyt käytät 8 tavua sijasta 4 tavua. Nyt voit käyttää 9 numeroa tai 10 numeroa, ja tämä voi mennä jopa 300 sijasta 100. >> [Opiskelija] Okei. Ja kelluu myös 4 tavua. >> Kyllä. No, jälleen, se luultavasti riippuu yleisestä yleistä täytäntöönpanoa, mutta kellukkeet ovat 4 tavua, kaksinkertaistuu ovat 8. Doubles kutsutaan kaksinkertainen, koska ne ovat kaksinkertaiset kelluu. [Opiskelija] Okei. Ja on siellä kaksinkertainen kaksinkertaistuu? >> Ei ole. Uskon - >> [opiskelija] Kuten pitkä pitkät? >> Joo. En usko. Kyllä. [Opiskelija] viime vuoden koe oli kysymys päätehtävä tarvitse olla osa ohjelmaa. Vastaus oli, että se ei tarvitse olla osa ohjelmaa. Missä tilanteessa? Se mitä olen nähnyt. [Bowden] Vaikuttaa - >> [opiskelija] Mikä tilanne? Onko sinulla ongelmia? >> [Opiskelija] Joo, voin varmasti vetää sitä ylös. Sen ei tarvitse olla, teknisesti, mutta pohjimmiltaan se tulee olemaan. [Opiskelija] Näin yksi eri vuoden. Se oli kuin True tai False: kelvollinen - >> Voi. C-tiedoston? [Opiskelija] Kaikki. C tiedosto on oltava - [molemmat puhuvat yhtä aikaa - käsittämätön] Okei. Joten se erillinen. . C-tiedoston tarvitsee vain olla toimintoja. Voit koota tiedoston konekielelle, binary riippumatta, ilman että executable vielä. Voimassa executable oltava päätehtävä. Voit kirjoittaa 100 toimintoa 1 tiedosto, mutta ei tärkein ja sitten koota se alas binääri, sitten kirjoittaa toisen tiedoston, jossa on vain tärkeimmät mutta se vaatii kasan näitä toimintoja Tämän binääritiedoston tänne. Ja niin kun teet executable, että mitä linkkeri tekee on se yhdistää nämä 2 binääri tiedostoja executable. Niin. C tiedostoa ei tarvitse olla main toimi lainkaan. Ja iso koodi perustaa näet tuhansia. C tiedostojen ja 1 tärkein tiedosto. Lisää kysymyksiä? [Opiskelija] Oli toinen kysymys. Se sanoi tee on kääntäjä. Totta vai tarua? Ja vastaus oli väärä, ja ymmärsin, miksi se ei ole kuin clang. Mutta mitä me kutsumme tehdä, jos se ei ole? Make on pohjimmiltaan vain - Näen mitä se kutsuu. Mutta se vain toimii komentoja. Make. Voin vetää tämän ylös. Joo. Joo. Tee myös tekee sen. Tämä kertoo tarkoitus merkistä apuohjelma on määrittää automaattisesti mitkä osat suuresta ohjelmasta pitää kääntää uudelleen ja antaa komentoja kääntää niitä. Voit tehdä tehdä tiedostoja, jotka ovat aivan valtava. Tee tarkastellaan aikaleimat tiedostoja, ja kuten sanoin, voit kääntää yksittäisiä tiedostoja alas, ja se vasta saat linkittäjän että he laittaa yhteen executable. Joten jos sinulla on 10 eri tiedostoja ja teet muutoksen 1 niistä, niin mitä tehdä aikoo tehdä, on vain käännöksen että 1 tiedosto ja sitten linkittää kaiken yhdessä. Mutta se on paljon tyhmempi kuin. Se on jopa voit täysin määritellä, että mitä sen pitäisi tehdä. Sen oletuksena on kyky tunnistaa tämä aikaleima kamaa, mutta voit kirjoittaa merkki tiedosto tehdä mitään. Voit kirjoittaa tehdä tiedoston niin, että kun kirjoitat tehdä sen vain cd toiseen hakemistoon. Olin saada turhautuneita, koska en luovi kaiken sisällä minun Appliance ja sitten katsella PDF Mac. Joten menen Finder ja voin Go, Yhdistä palvelimeen, ja palvelimen Liityn on minun Appliance, ja sitten avata PDF että saa kokoamat LaTeX. Mutta olin saada turhautuneita, koska joka ikinen kerta minun piti päivittää PDF- Jouduin kopioida tietyn hakemiston että se voisi käyttää ja se oli tulossa ärsyttävää. Joten sen sijaan kirjoitin merkki tiedoston, jossa sinun täytyy määrittää, miten se tekee asioista. Miten teet tämän on PDF-LaTeX. Aivan kuten mikä tahansa muu merkki tiedoston - tai kai ole nähnyt merkki tiedostoja, mutta meillä Appliance maailmanlaajuinen merkki tiedosto vain sanoo, jos olet koota C tiedoston, käytä clang. Ja niin täällä minun tehdä tiedosto teen sanon, Tämä tiedosto aiot haluavat kääntää PDF LaTeX. Ja niin se on PDF LaTeX että tekee kootaan. Tee ei koota. Se on juuri käynnissä nämä komennot järjestyksessä I määritelty. Niin se toimii PDF LaTeX, kopioi se hakemistoon haluan sen kopioidaan, se cd on hakemistoon ja tekee muita asioita, mutta kaikki se on tunnustettava, kun tiedosto muuttuu, ja jos se muuttuu, niin se ajaa komentoja että sen pitäisi ajaa kun tiedosto muuttuu. >> [Opiskelija] Okei. En tiedä missä globaali merkki tiedostot ovat minulle check it out. Muita kysymyksiä? Mitään menneisyyden tietokilpailuja? Jokainen osoitin asioita? On hienovaraisia ​​asioita viitteitä esimerkiksi - En aio pystyä löytämään tietovisa kysymys siitä - mutta aivan kuten näissä jutuissa. Varmista, että ymmärrät, että kun sanon int * x * y - Tämä ei ole täsmälleen mitään täällä, luulisin. Mutta kuten * x * y, jotka ovat 2 muuttujiin, jotka ovat pinoon. Kun sanon x = malloc (sizeof (int)), x on edelleen vaihteleva pinoon, malloc on jonkin lohkon ohi kasaan, ja emme ottaa x pisteen kasaan. Joten jotain pino osoittaa kasaan. Aina kun malloc mitään, olet väistämättä tallentamalla sen sisällä osoittimen. Siten, että osoitin on pinoon, malloced lohko on kasaan. Monet ihmiset hämmentyvät ja sanovat int * x = malloc, x on kasaan. No mitä x viittaa on kasaan. x itsessään on pino, ellei jostain syystä olet x olla globaali muuttuja, jolloin se sattuu olemaan toisella alueella muistia. Joten pitää kirjaa, nämä laatikko ja nuoli kaaviot ovat melko yleisiä ja tietokilpailu. Tai jos se ei tietovisa 0, se tulee olemaan Quiz 1. Sinun pitäisi tietää kaikki nämä vaiheet kokoamisessa koska sinulla oli vastata kysymyksiin näistä. Kyllä. [Opiskelija] Voisimmeko mennä yli nämä vaiheet - >> Toki. Ennen vaiheita ja koota olemme esikäsittely, laadinnassa, kokoonpano ja yhdistää. Esikäsittely. Mitä se tekee? Se on helpoin askel - hyvin, pidä - se ei tarkoita sitä pitäisi olla itsestään selvää, mutta se on helpoin vaihe. Te voisi toteuttaa sen itse. Joo. [Opiskelija] Ota mitä sinulla on myös näin, ja se kopioi ja sitten myös määrittelee. Näyttää asioita, kuten # include ja # define- ja se vain kopiot ja tahnoja mitä ne oikeastaan ​​tarkoittavat. Joten kun sanot # include cs50.h, esikäsittelijän on kopioimalla cs50.h tuohon viiva. Kun sanot # define x on 4, esikäsittelijä kulkee koko ohjelman ja korvaa kaikki esiintymät x 4. Joten esikäsittelijä vie kelvollista C-tiedoston ja tulostaa kelvollinen C tiedosto jossa asiat on kopioitu ja liitetty. Joten nyt kokoamisessa. Mitä se tekee? [Opiskelija] Se kulkee C binary. [Bowden] Se ei mene aina binary. [Opiskelija] koneen koodi sitten? >> Se ei konekielelle. [Opiskelija] Assembly? >> Assembly. Se menee Assembly ennen kuin se menee aina C-koodia, ja useimmilla kielillä tehdä jotain tällaista. Valita minkä tahansa korkean tason kieli, ja jos aiot kääntää sitä, se on todennäköisesti kääntää portaittain. Ensin se tulee koota Python C, niin se tulee laatia C Assembly, ja sitten Assembly on menossa käännetty binääri. Joten kootaan aikoo tuoda sen C Assembly. Sana kootaan yleensä tarkoittaa tuo sitä korkeampi ja alemman tason ohjelmointikieli. Joten tämä on vain askel kokoelma jossa aloitat korkean tason kielellä ja päätyvät matalan tason kieli, ja siksi vaihetta kutsutaan laadinnassa. [Opiskelija] aikana kokoamiseen, sanotaan, että olet tehnyt # include cs50.h. Tulee kääntäjä käännöksen cs50.h, kuten toimintoja, jotka ovat olemassa, ja kääntää sen osaksi edustajakokous koodia samoin, tai se kopioi ja liitä jotain, joka on ollut pre-Assembly? cs50.h melko paljon koskaan päädy Assembly. Tavaraa kuten toiminta prototyyppejä ja asiat ovat sinua varten olla varovainen. Se takaa, että kääntäjä voi tarkistaa asioita, kuten soitat toiminnot oikealla palata tyypit ja oikean väitteitä ja juttuja. Joten cs50.h tullaan esikäsitellään osaksi tiedoston, ja sitten kun se kootaan Se on pohjimmiltaan heitetään pois, kun se varmistaa, että kaikki on kutsutaan oikein. Mutta toiminnot on määritelty CS50 kirjastossa, jotka ovat erillään cs50.h, näitä ei erikseen laadittuja. Se todella tulee alas yhdistää vaiheessa, joten saamme siihen toisessa. Mutta ensin, mitä on kokoonpano? [Opiskelija] yleiskokouksen binääri? >> Joo. Kokoaminen. Emme kutsu sitä kootaan koska Assembly on melko puhdas käännös binary. On hyvin vähän logiikkaa menee Assembly binary. Se on aivan kuin etsii taulukossa, oh, meillä on tämä ohje; , joka vastaa binäärinen 01110. Ja niin tiedostojen kokoaminen yleisesti ulostulot. O tiedostoja. Ja. O tiedostot ovat mitä sanoimme aiemmin, Näin tiedosto ei tarvitse olla tärkein ominaisuus. Jokainen tiedosto voidaan laatia alas. O tiedosto niin kauan kuin se on voimassa C tiedostoa. Se voidaan laatia alas. O. Nyt, yhdistää mitä oikeastaan ​​tuo kasan. O tiedostoja ja tuo ne executable. Ja niin, mitä yhdistäminen ei on voit ajatella CS50 kirjasto. O-tiedoston. Se on jo käännetty binaaritiedosto. Ja niin kun käännät tiedoston, sinun hello.c, jossa vaaditaan GetString, hello.c saa käännetty alas hello.o, hello.o on nyt binary. Se käyttää GetString, joten se tarvitsee mennä yli cs50.o, ja linkkeri smooshes ne yhteen ja kopioi GetString tähän tiedostoon ja tulee ulos executable että on kaikki toiminnot, joita se tarvitsee. Joten cs50.o ei oikeastaan ​​O-tiedoston, mutta se on tarpeeksi lähellä, ettei mitään periaatteellista eroa. Joten yhdistää vain tuo kasan tiedostoja yhteen että erikseen sisältävät kaikki toiminnot Minun täytyy käyttää ja luo executable joka todella ajaa. Ja niin se on myös mitä sanoimme aiemmin jossa voit olla 1000. C-tiedostoja, käännät ne kaikki. O tiedostoja, joka todennäköisesti kestää jonkin aikaa, sitten muutat 1. C tiedosto. Sinun tarvitsee vain kääntää että 1. C tiedosto ja sitten Linkitä uudelleen kaiken muun, linkki kaiken takaisin yhteen. [Opiskelija] Kun Liitämme kirjoitamme lcs50? Joo, niin lcs50. Tämä lippu signaaleja linkittäjän että sinun pitäisi yhdistää kyseisessä kirjastossa. Kysymyksiä? Olemmeko menneet yli binary muihin kuin 5 sekuntia ensimmäisellä luennolla? En usko. Sinun pitäisi tietää kaikki suuret Os että olemme menneet ohi, ja sinun pitäisi pystyä, jos me annoimme teille toiminto, sinun pitäisi pystyä sanomaan se iso O, suunnilleen. Tai no, iso O on karkea. Joten jos näet sisäkkäisiä silmukoita silmukoiden yli sama määrä asioita, kuten int i, i > [opiskelija] n potenssiin. >> Sillä on taipumus olla n neliöön. Jos olet kolminkertainen sisäkkäin, se on yleensä n. kuutioitu. Niin, että sellainen asia, sinun pitäisi pystyä huomauttaa heti. Sinun täytyy tietää insertion sort ja kupla lajitella ja yhdistää lajitella ja kaikki nämä. On helpompi ymmärtää, miksi ne ovat n neliö ja n log n ja kaikki tämä koska mielestäni siellä oli tietovisa yksi vuosi me pohjimmiltaan annoimme teille täytäntöönpano kupla lajitella ja sanoi: "Mikä on ajoaika tämän toiminnon?" Joten jos tunnistaa sen kupla lajitella, voit heti sanoa n potenssiin. Mutta jos vain katsoa sitä, sinun ei tarvitse edes ymmärtää se kupla tavallaan; voit vain sanoa tämä tekee tätä ja tätä. Tämä on n potenssiin. [Opiskelija] Onko kova esimerkkejä voi keksiä, kuin samanlainen ajatus selvittämiseen? En usko, että antaisi sinulle kova esimerkkejä. Bubble sort asia on suunnilleen yhtä kova kuin me menisi, ja sekin, kunhan ymmärrät, että olet iteroimalla yli array kunkin alkio, joka tulee olemaan jotain, joka n: n potenssiin. On yleisiä kysymyksiä, kuten täällä meillä on - Oh. Aivan toinen päivä, Doug väitti, "olen keksinyt algoritmin, joka voi lajitella taulukon "N numeroita O (log n) ajan!" Joten miten me tiedämme, että on mahdotonta? [Äänetön opiskelija vastausta] >> Joo. Ainakin, sinun täytyy kosketa toisiaan alkio, joten on mahdotonta lajitella joukko - Jos kaikki on lajittelemattoman järjestyksessä, sitten olet menossa on koskettaa kaiken array, joten on mahdotonta tehdä se alle O n. [Opiskelija] Näytit meille, että esimerkiksi pysty tekemään sitä O n Jos käytät paljon muistia. >> Joo. Ja that's - Unohdan mitä that's - Onko se laskee tavallaan? Hmm. , Joka on kokonaisluvun lajittelu algoritmi. Etsin erityistä nimeä tälle, että en voinut muistaa viime viikolla. Joo. Nämä ovat eri lajittelee, jotka voivat toteuttaa asioita iso O n. Mutta on olemassa rajoituksia, kuten voit käyttää vain kokonaislukuja asti tietty määrä. Plus jos yrität lajitella jotain that's - Jos matriisi on 012, -12, 151, 4 miljoonaa euroa, Silloin yksittäinen elementti on menossa täysin pilata koko lajittelun. Kysymyksiä? [Opiskelija] Jos sinulla on rekursiivinen funktio, ja se vain tekee rekursiivinen puhelut sisällä return, että hännästä rekursiivinen ja niin se että saa käyttää enemmän muistia ajon aikana tai se ainakin käyttää vertailukelpoisia muistia kuin iteratiivinen ratkaisu? [Bowden] Kyllä. Olisi todennäköisesti hieman hitaampi, mutta ei oikeastaan. Tail rekursiivinen on melko hyvä. Tarkasteltaessa jälleen pino kehyksiä, sanotaan meillä on pääasiallinen ja meillä on int bar (int x) tai jotain. Tämä ei ole täydellinen rekursiivinen funktio, mutta paluu bar (x - 1). Eli ilmeisesti tämä on virheellinen. Tarvitset pohja tapauksia ja juttuja. Mutta ajatus tässä on, että tämä on häntä rekursiivinen, mikä tarkoittaa kun tärkeimmät puhelut baarissa se tulee saamaan sen pinokehys. Tässä pinokehys siellä tulee olemaan hieman lohko muistia joka vastaa sen väitettä x. Ja niin sanokaamme tärkein sattuu soittamaan bar (100); Joten x aikoo aloittaa ulos 100. Jos kääntäjä myöntää, että tämä on häntä rekursiivinen funktio, Sitten kun palkki tekee rekursiivinen kutsu bar, sen sijaan, että uusi pino runko, joka on kun pino alkaa kasvaa suureksi, lopulta se valuu kasaan ja sitten saat segfaults koska muisti alkaa törmätä. Joten sen sijaan tehdä oma pino runko, se voi toteuttaa, Hei, en koskaan tarvitse palata tähän pinokehys, joten sen sijaan Otan vain korvata tämän väitteen kanssa 99 ja aloita baarin ympäri. Ja sitten se tekee sen uudelleen ja se saavuttaa tuotto bar (x - 1), ja sen sijaan tehdä uuden pinon kehys, se vain korvaa nykyisen väitteen kanssa 98 ja sitten hypätä takaisin alusta bar. Näihin toimiin, korvattiin 1 arvon pinoon ja hyppää takaisin alkuun, ovat melko tehokkaita. Joten ei vain tämä sama muistin käyttö erillisenä toimintona, joka on iteratiivinen koska olet vain käyttämällä 1 pinokehys, mutta et ole kärsimystä varjopuolia ottaa soittaa toimintoja. Soittaminen toiminnot voivat olla hieman kallis, koska se on tekemistä kaiken tämän setup ja purkamisen ja kaikki tätä kamaa. Joten tämä häntä rekursion on hyvä. [Opiskelija] Miksi se ei luo uusia askelia? Koska se ymmärtää, se ei tarvitse. Kutsu baari on juuri palaamassa rekursiivinen puhelun. Joten se ei tarvitse tehdä mitään paluuarvon. Se vain tulee heti palauttaa sitä. Joten se vain tulee korvata oman lausumansa ja aloittaa alusta. Ja myös, jos sinulla ei ole häntää rekursiivinen versio, niin saat kaikki nämä baareja, joissa kun tämä palkki palaa sen on palautettava sen arvo tämän yhden, niin että tanko välittömästi palauttaa ja se palaa sen arvo tämän yhden, niin se vain menee välittömästi palata ja palauttaa sen arvon tähän. Joten olet tallentanut tämän popping kaikki nämä asiat pois pinosta koska paluuarvo on juuri menossa välitetään aina takaisin ylös muutenkin. Joten miksi ei vain korvata meidän väitteen kanssa päivitetyt väitteen ja aloittaa alusta? Jos toiminto ei ole häntää rekursiivinen, jos teet jotain - [Opiskelija] jos bar (x + 1). >> Joo. Joten jos laitat sen kunnossa, niin teet jotain tuottoarvo. Tai vaikka vain tehdä paluu 2 * bar (x - 1). Joten nyt bar (x - 1) tarvitsee palauttaa, jotta se voisi laskea 2 kertaa, että arvo, joten nyt se tarvitsee oman erillisen pinokehys, ja nyt, ei väliä kuinka kovaa yrität, olet menossa tarvitse - Tämä ei ole häntää rekursiivinen. [Opiskelija] Olisiko yritän tuoda rekursion pyrkiä hännän rekursion - [Bowden] Ihanteellisessa maailmassa, mutta CS50 sinun ei tarvitse. Saadakseen hännän rekursio, yleensä asetat lisäperustelun jossa palkki ottaa int x huomioon y ja y vastaa perimmäinen asia, jonka haluat palauttaa. Joten tämä aiot olla palaamassa bar (x - 1), 2 * y. Joten se on vain korkean tason miten muuttaa asioita olla häntää rekursiivinen. Mutta ylimääräinen argumentti - Ja sitten lopulta kun olet saavuttanut pohjan tapauksessa juuri palata y koska olet ollut kertynyt koko ajan paluuta haluamasi arvo. Olet tavallaan ovat tehneet sitä iteratiivisesti mutta käyttäen rekursiivinen puhelut. Kysymyksiä? [Opiskelija] Ehkä noin osoitin aritmeettinen, kuten käytettäessä merkkijonoja. >> Toki. Pointer aritmeettinen. Käytettäessä jouset on helppoa, koska jouset ovat char tähdet, merkkiä ovat ikuisesti ja aina yhden tavun, ja näin osoitin aritmeettinen vastaa säännöllistä aritmeettinen kun olet tekemisissä jouset. Sanotaan vain char * s = "Hello". Joten meillä on lohkon muistiin. Se tarvitsee 6 tavua, koska aina on null terminaattori. Ja char * s on menossa osoittamaan alussa array. Joten S-pisteitä siellä. Nyt, tämä on periaatteessa miten tahansa array toimii, riippumatta siitä, onko se tuottoa malloc vai onko se pinoon. Mikä tahansa matriisi on periaatteessa osoitin alkua array, ja sitten kaikki array toimintaa, mahdolliset indeksointi, on juuri menossa tuohon array tietty offset. Joten kun sanon jotain s [3], tämä tulee s ja laskenta 3 merkkiä tuumaa Joten s [3], meillä on 0, 1, 2, 3, joten s [3] tulee viitata tähän l. [Opiskelija] Ja voisimme saavuttaa sama arvo tekemällä s + 3 ja sulkeet tähti? Kyllä. Tämä vastaa * (s + 3); ja se on ikuisesti ja aina vastaa mitään väliä mitä teet. Sinun ei koskaan tarvitse käyttää kannattimen syntaksia. Voit aina käyttää * (s + 3) syntaksi. Ihmiset yleensä haluavat teline syntaksia, vaikka. [Opiskelija] Joten kaikki ryhmät ovat oikeastaan ​​vain viitteitä. On hieman eroa, kun sanon int x [4]; >> [opiskelija] Onko jotka luovat muisti? [Bowden] Tämä tulee luomaan 4 ints pinoon, joten 16 tavua yleistä. Se tulee luomaan 16 tavua pinoon. x ei tallenneta mihinkään. Se on vain symboli viittaa alkua asia. Koska olet ilmoittanut joukko sisällä tätä toimintoa, mitä kääntäjä aikoo tehdä, on vain korvata kaikki esiintymät muuttujan x kanssa, jossa se tapahtui valita laittaa nämä 16 tavua. Se ei voi tehdä, että char * s, koska s on todellinen osoitin. Se on ilmaista valitse sitten muita asioita. x on vakio. Et voi olla se osoita eri joukko. >> [Opiskelija] Okei. Mutta tämä ajatus, tämä indeksointi on sama riippumatta siitä, onko se perinteinen array tai jos se osoittimen jotain tai jos se osoittimen malloced array. Ja itse asiassa se on niin vastaavaa että on myös sama asia. Se oikeastaan ​​vain kääntää mitä sisällä suluissa ja mitä on jäljellä suluissa, lisää ne yhteen, ja dereferences. Joten tämä on vain yhtä pätevä kuin * (s + 3) tai s [3]. [Opiskelija] Voitko olla osoittimia osoittaen 2-ulotteinen taulukot? Se on vaikeampaa. Perinteisesti ei ole. 2-ulotteinen taulukko on vain 1-ulotteinen taulukko joidenkin kätevä syntaksi koska kun sanon int x [3] [3], se on vain 1 array 9 arvoa. Ja niin kun indeksi, kääntäjä tietää mitä tarkoitan. Jos sanon x [1] [2], se tietää haluan mennä toiseen riviin, joten se tulee ohittaa ensimmäisen 3, ja sitten se haluaa toinen asia on, että niin se tulee saada tämä. Mutta se on edelleen vain yksi-ulotteinen taulukko. Ja niin jos halusin antaa osoitin että array, Sanoisin int * p = x; Tyyppi x on vain - Se on karkea sanonta tyyppi x koska se on vain symboli ja se ei ole todellinen muuttuja, mutta se on vain int *. x on vain osoitin alusta tämän. >> [Opiskelija] Okei. Joten en voi käyttää [1] [2]. Mielestäni on erityinen syntaksi julistamista osoitin, jotain naurettavaa kuten int (* p [- jotain täysin naurettavaa. en edes tiedä. Mutta on syntaksi julistamisesta viitteitä esimerkiksi sulkujen kanssa ja asioita. Se ei välttämättä edes anna sinun tehdä sitä. Voisin katsoa taaksepäin jotain, joka kertoisi minulle totuuden. Aion etsiä sen myöhemmin, jos on syntaksi pisteen. Mutta et koskaan näe sitä. Ja vaikka syntaksi on niin vanhanaikaista, että jos käytät sitä, ihmiset on hämmentynyt. Moniulotteinen paneelit ovat melko harvinaisia, koska se on. Voit melko paljon - No, jos teet matriisi asioita se ei tule olemaan harvinaisia, mutta C et harvoin tulee käyttää moniulotteisia taulukoita. Joo. >> [Opiskelijan] Sanotaan sinulla on todella pitkä array. Joten virtuaalimuistin näyttäisi olevan kaikki peräkkäin, kuten elementit vieressä toisiinsa, mutta fyysisen muistin, olisiko mahdollista, että voidaan jakaa? >> Kyllä. Miten virtuaalinen muisti toimii on se vain erottaa - Yksikkö jako on sivu, joka on yleensä 4 kilotavua, ja niin kun prosessi sanoo hei, haluan käyttää tätä muistia, käyttöjärjestelmä on menossa jaettava 4 kilotavua että pieni lohko muistia. Vaikka käytät vain yhtä vähän tavun koko korttelin muistia, käyttöjärjestelmä on menossa antaa sille täyden 4 kilotavua. Joten mitä tämä tarkoittaa on, että voisin olla - sanokaamme tämä on minun pino. Tämä pino voidaan erottaa. Oma pino voisi olla megatavua ja megatavua. Oma pino voisi olla valtava. Mutta pino on itse jakaa yksittäisiä sivuja, jotka, jos katsomme tänne sanokaamme tämä on meidän RAM, jos minulla on 2 gigatavua RAM-muistia, tämä on todellinen osoite 0 like nollas tavu minun RAM, ja tämä on 2 gigatavua kaikki alas tästä. Joten tämä sivu voisi vastata tähän lohkoon tänne. Tämä sivu voi vastata tähän lohkoon tänne. Tämä voi vastata tämä tänne. Joten käyttöjärjestelmä on ilmainen määrittää fyysistä muistia millekään yksittäiselle sivulle mielivaltaisesti. Ja se tarkoittaa, että jos tämä raja tapahtuu ulottuvat array, array sattuu jättää tämän ja oikeus tämän määräyksen sivusta, sitten, että matriisi tulee olemaan lopettivat fyysistä muistia. Ja sitten kun lopetat ohjelman, kun prosessi päättyy, Nämä kuvaukset saavat poistetaan ja sitten se on ilmainen käyttää näitä pikku lohkoja muita asioita. Lisää kysymyksiä? [Opiskelija] osoitin aritmeettinen. >> Ai joo. Jouset oli helpompi, mutta katsot jotain ints, Joten takaisin int x [4]; Onko tämä matriisi tai onko se osoittimen malloced joukko 4 kokonaislukuja, se tulee kohdella samalla tavalla. [Opiskelija] Joten paneelit ovat kasaan? [Bowden] Arrays eivät kasaan. >> [Opiskelija] Oh. [Bowden] Tämän tyyppinen array taipumus olla pinoon ellet julisti sitä - piittaamatta globaaleja muuttujia. Älä käytä globaaleja muuttujia. Sisältä funktion sanon int x [4]; Se tulee luoda 4-kokonaisluku lohko pinoon tämän array. Mutta tämä malloc (4 * sizeof (int)); aikoo mennä kasaan. Mutta kun tässä vaiheessa voin käyttää x ja p melko paljon samalla tavoin, muu kuin poikkeuksia sanoin sinusta voi siirtää s.. Teknisesti niiden koot ovat hieman erilaisia, mutta se on täysin merkityksetön. Et koskaan todella käyttää niiden kokoa. P Voisin sanoa s. [3] = 2 tai x [3] = 2; Voit käyttää niitä täsmälleen samalla tavalla. Joten osoitin aritmeettinen nyt - Kyllä. [Opiskelija] Ettekö tarvitse tehdä p * jos sinulla on suluissa? Suluissa ovat implisiittisiä dereference. >> Okei. Oikeastaan ​​myös mitä sanot kanssa voit saada moniulotteinen array osoittimet, mitä voit tehdä, on jotain, sanokaamme, int ** pp = malloc (sizeof (int *) * 5); Minä vain kirjoitan sen kaiken ensin. En halua, että yksi. Okei. Mitä tein tässä - Sen pitäisi olla yks [i]. Joten pp on osoitin osoitin. Olet mallocing PP viitata joukko 5 int tähteä. Joten muistiin sinulla on pino s. Se tulee osoittamaan joukko 5 korttelin jotka ovat kaikki itse osoittimia. Ja sitten kun minä malloc tänne, olen malloc että kunkin yksittäisen osoittimia tulisi osoittaa erillinen lohko 4 tavua kasaan. Joten tämä viittaa 4 tavua. Ja tämä viittaa eri 4 tavua. Ja ne kaikki osoittavat oman 4 tavua. Tämä antaa minulle tapa tehdä moniulotteisen asioita. Voisin sanoa pp [3] [4], mutta nyt tämä ei ole sama asia kuin moniulotteinen array koska moniulotteinen array se käännetty [3] [4] yhdeksi poikkeaman x array. Tämän dereferences p, pääsee kolmannen indeksin, sitten dereferences että ja sisäänkäyntien - 4 olisi pätemätön - toinen indeksi. Taas kun meillä oli int x [3] [4] ennen kuin moniulotteinen array ja kun kaksinkertainen kiinnike se oikeastaan ​​vain yhden dereference, olet kerta-osoittimen ja sitten offset, Tämä on todella 2D viittauksia. Seuraat 2 erillistä osoittimia. Joten tämä myös teknisesti voit olla moniulotteinen paneelit jossa kukin ryhmä on eri kokoja. Joten mielestäni rosoiset moniulotteinen array on mitä se on nimeltään koska oikeastaan ​​ensimmäinen asia voisi viitata jotain, joka on 10 elementtiä, toinen asia voisi viitata jotain, joka on 100 alkiota. [Opiskelija] Onko mitään rajaa määrä viitteitä voi olla osoittaen muita viitteitä? >> No Sinulla voi olla int ***** s.. Takaisin osoitin aritmeettinen - >> [opiskelija] Oh. >> Joo. [Opiskelija] Jos minulla on int *** p ja sitten teen dereferencing ja sanon p * on sama kuin tämä arvo, on se vain aikoo tehdä 1 tason dereferencing? >> Kyllä. Joten jos haluan päästä asia viimeinen osoitin on suunnattu - Sitten teet *** s.. >> Okei. Joten tämä on p pistettä 1 lohko, kohdat toiseen lohkoon, viittaa toiseen lohkoon. Sitten jos et * p = jotain muuta, niin muutat tätä nyt olevan eri lohkoon. >> Okei. [Bowden] ja jos ne eivät malloced, niin olet nyt vuotanut muistia jos sinulla sattuu olemaan eri viittaukset kyseisiin koska et voi saada takaisin nuo äsken heitti pois. Pointer aritmeettinen. int x [4], on menossa kohdentaa joukko 4 kokonaislukujen jossa x on menossa osoittamaan alkua jono. Joten kun sanon jotain x [1], haluan sen tarkoittavan mennä toisen kokonaisluvun array, mikä olisi tämä. Mutta oikeasti, se on 4 tavua osaksi array koska kokonaisluku vie 4 tavua. Joten offset on 1 todella tarkoittaa offset 1 kertaa koko lajista riippumatta joukko on. Tämä on matriisi kokonaislukuja, niin se tietää, tehdä 1 kertaa koko int, kun se haluaa korvata. Muiden syntaksi. Muista, että tämä on sama kuin * (x + 1); Kun sanon osoitin + 1, mikä se palaa on osoite osoitin on varastointi plus 1 kertaa koko tyypin osoittimen. Joten jos x = ox100, niin x + 1 = ox104. Ja voit väärin tämän ja sanoa jotain char * c = (char *) x; ja nyt c tulee olemaan sama osoite kuin x. c tulee olemaan yhtä suuri kuin ox100, mutta c + 1 tulee olemaan yhtä suuri kuin ox101 koska osoitin aritmeettinen riippuu osoittimen että lisäät sen. Joten C + 1, se katsoo C, se char osoitin, joten se tulee lisätä 1 kertaa koko char, joka on aina olemaan 1, niin saat 101, ottaa huomioon, että jos teen x, joka on myös edelleen 100, x + 1 tulee olemaan 104. [Opiskelija] Voitko käyttää C + + edistääkseen osoittimen mukaan 1? Kyllä voit. Et voi tehdä, että x koska x on vain symboli, se on vakio, et voi muuttaa x. Mutta C sattuu vain olemaan osoitin, joten C + + on täysin pätevä ja se suurenevat 1. Jos C olivat vain int *, niin c + + olisi 104. + + Ei osoitin aritmeettinen kuten C + 1 olisi tehnyt osoitin aritmeettinen. Tämä on oikeastaan ​​kuinka paljon asioita, kuten merge sort - Luomisen sijasta kopioita asioita, voit sen sijaan kulkea - Kuten jos halusin välittää puolet array - Mennään poistaa joitakin tämän. Sanotaan Halusin välittää tämän puolen array osaksi toimintoa. Mitä kuljen tuon toiminnan? Jos kuljen x, olen ohimennen tähän osoitteeseen. Mutta haluan välittää tietty osoite. Joten mitä minun pitäisi välittää? [Opiskelija] Pointer + 2? [Bowden] So x + 2. Kyllä. Tämä tulee olemaan tähän osoitteeseen. Näet myös hyvin usein nähdä se x [2] ja sitten osoitteeksi. Joten sinun täytyy ottaa osoitteen, koska kiinnike on implisiittinen dereference. x [2] viittaa arvoon, joka on tähän ruutuun ja haluat osoitteen että laatikko, niin sanot-x [2]. Niin, että miten jotain merge sort minne haluat siirtää puoli luettelon jotain te oikeastaan ​​vain kulkea ja x [2], ja nyt niin pitkälle kuin rekursiivinen puhelu tulee, my new Array alkaa siellä. Viime hetken kysymyksiä. [Opiskelija] Jos emme laita et-tai - mikä se nimi? >> Star? [Opiskelija] Star. >> Teknisesti dereference operaattori, mutta - >> [opiskelija] dereference. Jos emme laita tähti tai et-Mitä tapahtuu, jos olen vain sanoa y = x ja x on osoitin? Mikä on tyyppiä y? >> [Opiskelija] Otan vain sanoa sen osoitin 2. Joten jos vain sanoa y = x, nyt x ja y viittaavat sama asia. >> [Opiskelija] Pointin sama asia. Ja jos x on int osoitin? >> Se valittaa, koska et voi antaa viitteitä. [Opiskelija] Okei. Muista, että osoittimet, vaikka vedämme niitä nuolet, oikeastaan ​​kaikki ne myymälä - int * x - oikeastaan ​​kaikki x on varastointi on jotain ox100, jota tapahtuu edustaa viittaavat myös lohkon säilytettiin 100. Joten kun sanon int * y = x; olen vain kopioimalla ox100 osaksi y, jonka olemme juuri menossa edustamaan Y, myös osoittaa ox100. Ja jos sanon int i = (int) x; Sitten tulee säilyttää arvosta riippumatta ox100 on sen sisällä, mutta nyt se tulee tulkita kokonaisluku sijasta osoittimen. Mutta tarvitset valettu tai muuten se valittaa. [Opiskelija] Eli meinaat heittää - Onko se tulee olemaan valu int x tai valu int y? [Bowden] Mitä? [Opiskelija] Okei. Kun nämä suluissa on siellä olemaan x tai AY siellä? [Bowden] Joko. x ja y ovat vastaavat. >> [Opiskelija] Okei. Koska he molemmat osoittimia. >> Joo. [Opiskelija] Niin se tallentaa heksadesimaali 100 kokonaisluku muodossa? >> [Bowden] Joo. Mutta ei arvoa mitä se osoittaa. [Bowden] Joo. >> [Opiskelija] Joten vain osoitteen kokonaisluku muodossa. Okei. [Bowden] Jos halusi jostain outoa syystä, voisit yksinomaan käsitellä osoittimia ja koskaan käsitellä kokonaislukuja ja vain olla kuin int * x = 0. Sitten olet menossa todella sekaisin, kun osoitin aritmeettinen alkaa tapahtua. Niin numerot ne tallentavat ovat merkityksettömiä. Se on vain siitä, miten voit päätyä tulkitsemalla niitä. Joten olen vapaa kopioida ox100 alkaen int * ja int- ja olen vapaa luovuttaa - artikkeli on sinua todennäköisesti menossa huusi, ettei valu - Olen vapaa määrittää jotain (int *) ox1234 tähän mielivaltainen int *. Joten ox123 on yhtä pätevä muistin osoitteen on & y. & Y tapahtuu palauttaa jotain, joka on melko ox123. [Opiskelija] Olisiko se todella rento tapa mennä heksadesimaalinen desimaalimuotoon, kuten jos sinulla on osoittimen ja heität sen int? [Bowden] Voit oikeastaan ​​vain tulostaa kuten printf. Sanotaan Minulla on int y = 100. Joten printf (% d \ n - kuten pitäisi jo tietää - tulosta, että kokonaisluku,% x. Me vain tulostaa sen heksadesimaali. Joten osoitin ei ole tallennettu heksadesimaali, ja kokonaisluku ei tallenneta desimaalin. Kaikkea tallennetaan binary. Se on vain, että meillä on taipumus näyttää viitteitä heksadesimaali koska ajattelemme asioita näissä 4-tavun lohkoja, ja muistin osoitteet yleensä tuttuja. Olemme kuin, jos se alkaa isännän kanssa, sitten se sattuu olemaan pinoon. Joten se on vain meidän tulkinta osoittimia heksadesimaali. Okei. Mahdolliset viime kysyttävää? Olen täällä hieman jälkeen, jos sinulla on jotain muuta. Ja se päätteeksi. [Opiskelija] Yay! [Aplodit] [CS50.TV]