1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [4 jakso - More Comfortable] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvardin yliopisto] 3 00:00:04,850 --> 00:00:07,370 [Tämä on CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Meillä on tietokilpailu huomenna, jos te tiennyt että. 5 00:00:14,810 --> 00:00:20,970 Se on pohjimmiltaan kaikesta olisit nähnyt luokassa tai olisi pitänyt nähdä luokassa. 6 00:00:20,970 --> 00:00:26,360 Se sisältää viitteitä, vaikka he äskettäin aihe. 7 00:00:26,360 --> 00:00:29,860 Sinun pitäisi ainakin ymmärtää korkeita niistä. 8 00:00:29,860 --> 00:00:34,760 Mitään, oli mennyt ohi luokassa sinun pitäisi ymmärtää tietokilpailu. 9 00:00:34,760 --> 00:00:37,320 Joten jos sinulla on kysyttävää niitä, voit pyytää heitä nyt. 10 00:00:37,320 --> 00:00:43,280 Mutta tämä tulee olemaan hyvin opiskelija-johtoiseen istunto, jossa te kysyä kysymyksiä, 11 00:00:43,280 --> 00:00:45,060 niin toivottavasti ihmiset ovat kysymyksiä. 12 00:00:45,060 --> 00:00:48,020 Onko kellään kysyttävää? 13 00:00:49,770 --> 00:00:52,090 Kyllä. >> [Opiskelija] Voitko mennä yli osoittimia uudestaan? 14 00:00:52,090 --> 00:00:54,350 Menen aikana viitteitä. 15 00:00:54,350 --> 00:00:59,180 Kaikki muuttujat välttämättä asu muistiin, 16 00:00:59,180 --> 00:01:04,450 mutta yleensä et ole huolissasi siitä ja sanoit x + 2 ja y + 3 17 00:01:04,450 --> 00:01:07,080 ja kääntäjä selvittää missä asiat elävät sinua. 18 00:01:07,080 --> 00:01:12,990 Kun olet tekemisissä viitteitä, nyt olet täsmällinen näitä muisti osoitteita. 19 00:01:12,990 --> 00:01:19,800 Joten yhden muuttujan aina vain elää yhdessä osoitteessa milloin tahansa. 20 00:01:19,800 --> 00:01:24,040 Jos haluamme julistaa osoitin, mitä tyyppiä tulee näyttämään? 21 00:01:24,040 --> 00:01:26,210 >> Haluan julistaa osoitin p. Mitä tyyppiä näyttää? 22 00:01:26,210 --> 00:01:33,530 [Opiskelija] int * p. >> Joo. Joten int * p. 23 00:01:33,530 --> 00:01:38,030 Ja miten saan sen viitata x? >> [Opiskelija] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Eli et-on kirjaimellisesti kutsutaan osoite operaattorin. 25 00:01:45,300 --> 00:01:50,460 Joten kun sanon & x se alkaa muistin osoitteen muuttujan x. 26 00:01:50,460 --> 00:01:56,790 Joten nyt olen osoittimen p, ja missä minun koodia voin käyttää * p 27 00:01:56,790 --> 00:02:02,960 tai voisin käyttää x ja se on täsmälleen sama asia. 28 00:02:02,960 --> 00:02:09,520 (* P). Mitä tämä tekee? Mitä tuo tähti tarkoittaa? 29 00:02:09,520 --> 00:02:13,120 [Opiskelija] Se tarkoittaa arvoa, joka tässä vaiheessa. >> Joo. 30 00:02:13,120 --> 00:02:17,590 Joten jos katsomme sitä, se voi olla erittäin hyödyllistä vetää pois kaaviot 31 00:02:17,590 --> 00:02:22,230 jos tämä on pieni laatikko muistia x, joka sattuu on arvo 4, 32 00:02:22,230 --> 00:02:25,980 Sitten meillä on pieni laatikko muistia p, 33 00:02:25,980 --> 00:02:31,590 ja niin p pistettä x, niin vedämme nuoli P x. 34 00:02:31,590 --> 00:02:40,270 Joten kun sanomme * p sanomme mennä laatikko, joka on s.. 35 00:02:40,270 --> 00:02:46,480 Star on seurata nuolta ja sitten tehdä mitä haluat kanssa että laatikko tuolla. 36 00:02:46,480 --> 00:03:01,090 Voin siis sanoa * p = 7 ja että menee laatikko, joka on x ja muutos 7. 37 00:03:01,090 --> 00:03:13,540 Tai voisin sanoa int z = * p * 2; Tämä on hämmentävää, koska se on tähti, tähti. 38 00:03:13,540 --> 00:03:19,230 Yksi tähti on dereferencing p, muu tähti kertomalla 2. 39 00:03:19,230 --> 00:03:26,780 Ilmoitus voisin olla yhtä hyvin korvata * P x. 40 00:03:26,780 --> 00:03:29,430 Voit käyttää niitä samalla tavalla. 41 00:03:29,430 --> 00:03:38,000 Ja sitten myöhemmin voin olla p viittaavat aivan uusi asia. 42 00:03:38,000 --> 00:03:42,190 Voin vain sanoa p = &z; 43 00:03:42,190 --> 00:03:44,940 Joten nyt P ei enää viittaa x, se osoittaa z. 44 00:03:44,940 --> 00:03:50,510 Ja aina teen * p se on sama kuin tekemässä z. 45 00:03:50,510 --> 00:03:56,170 Joten hyödyllisiä asia tässä on, kun alamme päästä toimintoihin. 46 00:03:56,170 --> 00:03:59,790 >> Se on tavallaan turha julistaa osoitin, joka osoittaa jotakin 47 00:03:59,790 --> 00:04:03,140 ja sitten olet vain dereferencing se 48 00:04:03,140 --> 00:04:06,060 kun olet voinut käyttää alkuperäisen muuttujan aluksi. 49 00:04:06,060 --> 00:04:18,190 Mutta kun olet päässyt toimintoja - niin sanotaan meillä jokin funktio, int foo, 50 00:04:18,190 --> 00:04:32,810 , joka vie osoittimen ja vain ei * p = 6; 51 00:04:32,810 --> 00:04:39,990 Kuten näimme aiemmin swap, et voi tehdä tehokasta swap ja erillinen toiminto 52 00:04:39,990 --> 00:04:45,180 vain hieman ohi kokonaislukuja, koska kaikki C aina ohi arvon. 53 00:04:45,180 --> 00:04:48,360 Silloinkin kun olet ohimennen viitteitä olet ohimennen arvosta. 54 00:04:48,360 --> 00:04:51,940 Se vain on niin, että nämä arvot ovat muistissa osoitteita. 55 00:04:51,940 --> 00:05:00,770 Joten kun sanon foo (p), olen ohimennen osoitin funktion foo 56 00:05:00,770 --> 00:05:03,910 ja sitten foo tekee * p = 6; 57 00:05:03,910 --> 00:05:08,600 Niin sisällä, jotka toimivat, * p on edelleen vastaa x, 58 00:05:08,600 --> 00:05:12,720 mutta en voi käyttää x sisällä että funktion koska se ei ole scoped kyseisen toiminnon. 59 00:05:12,720 --> 00:05:19,510 Joten * p = 6 on ainoa tapa voin käyttää paikallisen muuttujan toisen toiminnon. 60 00:05:19,510 --> 00:05:23,600 Tai, no, osoittimet ovat ainoa tapa voin käyttää paikallisen muuttujan toisen toiminnon. 61 00:05:23,600 --> 00:05:31,600 [Opiskelijan] sanokaamme olet halunnut palata osoitin. Miten aiotte tehdä sen? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Palauta osoitin kuin jotain int y = 3; tuottoa & y? >> [Opiskelija] Joo. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okei. Sinun ei koskaan tulisi tehdä. Tämä on huono. 64 00:05:48,480 --> 00:05:59,480 Taisin nähdä näissä luentokalvot olet alkanut nähdä tämä koko kaavio muistin 65 00:05:59,480 --> 00:06:02,880 missä täällä sinulla muistiosoite 0 66 00:06:02,880 --> 00:06:09,550 ja tänne olet muistiosoite 4 gigan tai 2 32. 67 00:06:09,550 --> 00:06:15,120 Joten sinulla joitakin juttuja ja joitakin juttuja, ja sitten sinulla on pino 68 00:06:15,120 --> 00:06:21,780 ja olet saanut kasaan, joka juuri alkanut oppia, kasvaa. 69 00:06:21,780 --> 00:06:24,390 [Opiskelija] Eikö kasan yläpuolella pino? 70 00:06:24,390 --> 00:06:27,760 >> Joo. Keko päällä, eikö? >> [Opiskelija] No, hän laittoi 0 päälle. 71 00:06:27,760 --> 00:06:30,320 [Opiskelija] Oh, hän laittaa 0 päälle. >> [Opiskelija] Ai, okei. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: Anywhere kanssa CS50 aiot nähdä sen tällä tavalla. >> [Opiskelija] Okei. 73 00:06:36,060 --> 00:06:40,290 Se on vain, että kun olet ensimmäinen nähdä pinoja, 74 00:06:40,290 --> 00:06:45,000 kuten silloin ajattelet pinon luulet pinoaminen asioita päällekkäin. 75 00:06:45,000 --> 00:06:50,810 Joten meillä on tapana kääntää tämän ympäri niin pino kasvaa ylöspäin kuin pino normaaliin tapaan 76 00:06:50,810 --> 00:06:55,940 sijaan pinon roikkuu alaspäin. >> [Opiskelija] Älä kasaa teknisesti kasva liikaa, vaikka? 77 00:06:55,940 --> 00:07:01,100 Se riippuu mitä tarkoitat kasvaa. 78 00:07:01,100 --> 00:07:04,010 Pinoon ja pino kasvavat aina vastakkaisiin suuntiin. 79 00:07:04,010 --> 00:07:09,420 Pino on aina kasvaa siinä mielessä, että se kasvaa 80 00:07:09,420 --> 00:07:12,940 kohti korkeampia muisti osoitteita, ja kasa kasvaa alaspäin 81 00:07:12,940 --> 00:07:17,260 koska se kasvaa kohti alemman muistipaikan osoitetta. 82 00:07:17,260 --> 00:07:20,250 Niin alkuun on 0 ja pohja on suuri muisti osoitteita. 83 00:07:20,250 --> 00:07:26,390 He molemmat kasvavat, aivan vastakkaisiin suuntiin. 84 00:07:26,390 --> 00:07:29,230 [Opiskelija] Tarkoitin vain, että koska sanoit laittaa pinon pohjalle 85 00:07:29,230 --> 00:07:33,640 koska näyttää siltä, ​​intuitiivinen, sillä, että pino alkaa yläosassa kasaan, 86 00:07:33,640 --> 00:07:37,520 keko on itsensä päälle myös, joten that's - >> Joo. 87 00:07:37,520 --> 00:07:44,960 Voit myös ajatella kasan kuin kasvaa ja suurempi, mutta pino enemmän. 88 00:07:44,960 --> 00:07:50,280 Joten pino on joka me sellaista halua näyttää kasvaa. 89 00:07:50,280 --> 00:07:55,390 Mutta kaikkialla näytät muuten aikoo näyttää osoitteen 0 yläreunassa 90 00:07:55,390 --> 00:07:59,590 ja korkein muistin osoitteen alaosassa, joten tämä on tavanomaista näkymä muistia. 91 00:07:59,590 --> 00:08:02,100 >> Onko sinulla kysymys? 92 00:08:02,100 --> 00:08:04,270 [Opiskelija] Voisitko kertoa lisää kasaan? 93 00:08:04,270 --> 00:08:06,180 Joo. Saan siihen toisessa. 94 00:08:06,180 --> 00:08:12,220 Ensinnäkin, menee takaisin miksi palaamassa & Y on huono asia, 95 00:08:12,220 --> 00:08:18,470 pinoon sinulla nippu pino kehyksiä, jotka edustavat kaikkia toimintoja 96 00:08:18,470 --> 00:08:20,460 jotka on kutsuttu. 97 00:08:20,460 --> 00:08:27,990 Joten unohdetaan edellinen asioita, yläosassa pino on aina olemaan tärkein ominaisuus 98 00:08:27,990 --> 00:08:33,090 koska se on ensimmäinen tehtävä, joka on kutsutaan. 99 00:08:33,090 --> 00:08:37,130 Ja sitten kun soitat toisen toiminnon, pino tulee kasvamaan alaspäin. 100 00:08:37,130 --> 00:08:41,640 Joten jos pyydän jokin funktio, foo, ja se saa oman pinokehys, 101 00:08:41,640 --> 00:08:47,280 se voi kutsua joitakin toiminto, baari, se saa oman pinokehys. 102 00:08:47,280 --> 00:08:49,840 Ja baari voisi olla rekursiivinen, ja se voi kutsua itseään, 103 00:08:49,840 --> 00:08:54,150 ja niin tämä toinen puhelu bar on menossa oma pino runko. 104 00:08:54,150 --> 00:08:58,880 Ja niin, mitä tapahtuu näiden pino kehyksiä ovat kaikki paikalliset muuttujat 105 00:08:58,880 --> 00:09:03,450 ja kaikki funktion argumentteja, että - 106 00:09:03,450 --> 00:09:08,730 Jokainen asioita, jotka ovat paikallisesti scoped tämän toiminnon mennä näissä pino kehyksiä. 107 00:09:08,730 --> 00:09:21,520 Joten se tarkoittaa, kun sanoin jotain baari on funktio, 108 00:09:21,520 --> 00:09:29,270 Olen juuri menossa julistaa kokonaisluku ja palaa sitten osoitin että kokonaisluku. 109 00:09:29,270 --> 00:09:33,790 Joten mistä y elää? 110 00:09:33,790 --> 00:09:36,900 [Opiskelija] y asuu baarissa. >> [Bowden] Joo. 111 00:09:36,900 --> 00:09:45,010 Jossain tämä pieni neliö muistia on littler neliö, joka on y siinä. 112 00:09:45,010 --> 00:09:53,370 Kun palaan & Y, olen palaamassa osoittimen tämä pieni lohko muistia. 113 00:09:53,370 --> 00:09:58,400 Mutta sitten kun funktio palaa, sen pinokehys saa piipahti pinosta. 114 00:10:01,050 --> 00:10:03,530 Ja siksi sitä kutsutaan pino. 115 00:10:03,530 --> 00:10:06,570 Se on kuin pino tietorakenne, jos tiedät mitä se on. 116 00:10:06,570 --> 00:10:11,580 Tai edes pidä pino tarjottimia on aina esimerkiksi 117 00:10:11,580 --> 00:10:16,060 tärkein on menossa pohjalle, sitten ensimmäinen funktio soitat ei mene päälle, että 118 00:10:16,060 --> 00:10:20,400 ja et voi saada takaisin päävalikkoon kunnes palaat kaikki toiminnot, jotka on kutsuttu 119 00:10:20,400 --> 00:10:22,340 jotka on sijoitettu sen päälle. 120 00:10:22,340 --> 00:10:28,650 >> [Opiskelija] Joten jos teit palaavat & Y, että arvo voidaan muuttaa ilman erillistä ilmoitusta. 121 00:10:28,650 --> 00:10:31,290 Kyllä, Se on - >> [opiskelija] Voisi olla päälle. >> Joo. 122 00:10:31,290 --> 00:10:34,660 Se on täysin - Jos yrität ja - 123 00:10:34,660 --> 00:10:38,040 Tämä olisi myös int * bar koska se palaa osoitin, 124 00:10:38,040 --> 00:10:41,310 joten sen paluuarvon tyyppi on int *. 125 00:10:41,310 --> 00:10:46,500 Jos yrität käyttää paluuarvo tämän toiminnon, se on määrittelemätöntä käyttäytymistä 126 00:10:46,500 --> 00:10:51,770 koska osoitin osoittaa huono muisti. >> [Opiskelija] Okei. 127 00:10:51,770 --> 00:11:01,250 Joten mitä jos, esimerkiksi, sinun julisti int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Se on parempi. Kyllä. 129 00:11:03,740 --> 00:11:07,730 [Opiskelija] Puhuimme miten kun vedät asioita meidän roskakoriin 130 00:11:07,730 --> 00:11:11,750 he eivät oikeastaan ​​poistaa, me vain menettävät osoittimia. 131 00:11:11,750 --> 00:11:15,550 Eli tässä tapauksessa emme oikeastaan ​​poistaa arvo vai onko se vielä siellä muistissa? 132 00:11:15,550 --> 00:11:19,130 Suurimmaksi osaksi, se tulee yhä olemaan siellä. 133 00:11:19,130 --> 00:11:24,220 Mutta sanokaamme satumme soittaa jonkin muun toiminnon, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz on menossa oma pino runko täällä. 135 00:11:28,990 --> 00:11:31,470 Se tulee olemaan päälle kaikki tätä kamaa, 136 00:11:31,470 --> 00:11:34,180 ja sitten jos myöhemmin kokeilla ja käyttää osoitin että sinulla ennen, 137 00:11:34,180 --> 00:11:35,570 se ei tule olemaan sama arvo. 138 00:11:35,570 --> 00:11:38,150 Se tulee muuttuneen vain siksi soitit toiminnon Baz. 139 00:11:38,150 --> 00:11:43,080 [Opiskelija] Mutta ellemme olisi, voisimme silti 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Todennäköisesti olisit. 141 00:11:44,990 --> 00:11:49,670 Mutta et voi luottaa siihen. C sanoo vain määrittelemätöntä käyttäytymistä. 142 00:11:49,670 --> 00:11:51,920 >> [Opiskelija] Voi se. Okei. 143 00:11:51,920 --> 00:11:58,190 Joten kun haluat palauttaa osoittimen, tämä on silloin malloc tulee käyttöön. 144 00:12:00,930 --> 00:12:15,960 Kirjoitan oikeastaan ​​vain palata malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Menemme yli malloc enemmän toinen, mutta ajatus malloc on kaikki paikalliset muuttujat 146 00:12:24,050 --> 00:12:26,760 aina mennä pinoon. 147 00:12:26,760 --> 00:12:31,570 Mitään, mikä on malloced menee kasaan, ja se ikuisesti ja aina kasaan 148 00:12:31,570 --> 00:12:34,490 kunnes erikseen vapauttaa sitä. 149 00:12:34,490 --> 00:12:42,130 Joten tämä tarkoittaa, että kun malloc jotain, se tulee selviämään jälkeen toiminto palaa. 150 00:12:42,130 --> 00:12:46,800 [Opiskelija] Aikooko se selviäisi jälkeen ohjelma pysähtyy? >> No 151 00:12:46,800 --> 00:12:53,180 Okei, joten se tulee olemaan siellä kunnes ohjelma on aina valmis käynnissä. >> Kyllä. 152 00:12:53,180 --> 00:12:57,510 Voimme mennä yli yksityiskohtia siitä, mitä tapahtuu, kun ohjelma pysähtyy. 153 00:12:57,510 --> 00:13:02,150 Saatat joutua muistuttaa minua, mutta se on erillinen asia. 154 00:13:02,150 --> 00:13:04,190 [Opiskelija] Joten malloc luo osoittimen? >> Joo. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [opiskelija] Mielestäni malloc nimeää lohko muistin osoitin voi käyttää. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Haluan että kaavio uudestaan. >> [Opiskelija] Joten tämä toiminto toimii, vaikka? 157 00:13:19,610 --> 00:13:26,430 [Opiskelija] Joo, malloc nimeää lohko muistia, jota voit käyttää, 158 00:13:26,430 --> 00:13:30,470 ja sitten se palauttaa osoitteen ensimmäinen lohko, että muistia. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Joo. Joten kun malloc, olet tarttumalla joitakin lohko muistia 160 00:13:36,750 --> 00:13:38,260 joka on tällä hetkellä kasaan. 161 00:13:38,260 --> 00:13:43,040 Jos keko on liian pieni, niin kasa on juuri menossa kasvaa, ja se kasvaa tähän suuntaan. 162 00:13:43,040 --> 00:13:44,650 Joten sanokaamme keko on liian pieni. 163 00:13:44,650 --> 00:13:49,960 Sitten se on noin kasvavan hieman ja palata osoittimen tähän lohkoon että vain kasvoi. 164 00:13:49,960 --> 00:13:55,130 Kun ilmaista tavaraa, teet enemmän tilaa kasaan, 165 00:13:55,130 --> 00:14:00,030 niin sitten myöhemmin soittaa malloc voi käyttää uudelleen, että muistin että olet aiemmin vapautettu. 166 00:14:00,030 --> 00:14:09,950 Tärkeä asia malloc ja free on, että se antaa sinulle täydellisen hallinnan 167 00:14:09,950 --> 00:14:12,700 elinaikana näiden muistilohkoja. 168 00:14:12,700 --> 00:14:15,420 Globaalit muuttujat ovat aina elossa. 169 00:14:15,420 --> 00:14:18,500 Paikalliset muuttujat ovat elossa niiden soveltamisalaan. 170 00:14:18,500 --> 00:14:22,140 Heti mennä ohi kihara ahdin, paikalliset muuttujat ovat kuolleet. 171 00:14:22,140 --> 00:14:28,890 Malloced muisti on elossa, kun haluat sen olevan elossa 172 00:14:28,890 --> 00:14:33,480 ja sitten vapautuu, kun kerrot sen vapautetaan. 173 00:14:33,480 --> 00:14:38,420 Nämä ovat oikeastaan ​​vain 3 tyyppisiä muistia, todella. 174 00:14:38,420 --> 00:14:41,840 On automaattinen muistin hallinta, joka on pino. 175 00:14:41,840 --> 00:14:43,840 Asioita tapahtuu automaattisesti. 176 00:14:43,840 --> 00:14:46,910 Kun sanot int x, muistista on int x. 177 00:14:46,910 --> 00:14:51,630 Kun x sammuu soveltamisalasta, muisti talteen varten x. 178 00:14:51,630 --> 00:14:54,790 Sitten on dynaaminen muistin hallinta, joka on mitä malloc on, 179 00:14:54,790 --> 00:14:56,740 mikä on kun on ohjaus. 180 00:14:56,740 --> 00:15:01,290 Voit dynaamisesti päättää milloin muistia pitäisi ja ei pitäisi kohdentaa. 181 00:15:01,290 --> 00:15:05,050 Ja sitten on staattinen, mikä tarkoittaa vain sitä, että se elää ikuisesti, 182 00:15:05,050 --> 00:15:06,610 joka on mitä globaalien muuttujien ovat. 183 00:15:06,610 --> 00:15:10,240 He vain aina muistiin. 184 00:15:10,960 --> 00:15:12,760 >> Kysymyksiä? 185 00:15:14,490 --> 00:15:17,230 [Opiskelija] Voitteko määritellä lohkon vain käyttämällä aaltosulkeita 186 00:15:17,230 --> 00:15:21,220 mutta ei tarvitse olla, jos ilmoitus tai kun ilmoitus tai jotain sellaista? 187 00:15:21,220 --> 00:15:29,130 Voit määrittää lohkon kuin toiminto, mutta se on aaltosulkeita liikaa. 188 00:15:29,130 --> 00:15:32,100 [Opiskelija] Eli et voi vain olla kuin satunnaisesti pari aaltosulkeita koodissa 189 00:15:32,100 --> 00:15:35,680 että on paikallisia muuttujia? >> Kyllä voit. 190 00:15:35,680 --> 00:15:45,900 Sisällä int baarin voisimme {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Se pitäisi olla täällä. 192 00:15:48,440 --> 00:15:52,450 Mutta että täysin määritellään soveltamisala int y. 193 00:15:52,450 --> 00:15:57,320 Sen jälkeen, kun tämä toinen kihara ahdin, y ei voi enää käyttää. 194 00:15:57,910 --> 00:16:00,630 Et juuri koskaan tehdä, vaikka. 195 00:16:02,940 --> 00:16:07,370 Palatakseni mitä tapahtuu, kun ohjelma loppuu, 196 00:16:07,370 --> 00:16:18,760 siellä sellainen väärinkäsitys / puoli valhetta, että annamme sen vain helpottaa asioita. 197 00:16:18,760 --> 00:16:24,410 Kerromme teille, että kun jakaa muistia 198 00:16:24,410 --> 00:16:29,860 olet kohdistamalla osa kimpale RAM kyseisen muuttujan. 199 00:16:29,860 --> 00:16:34,190 Mutta et todellakaan kosketa RAM koskaan ohjelmat. 200 00:16:34,190 --> 00:16:37,490 Jos ajattelet sitä, kuinka piirsin - 201 00:16:37,490 --> 00:16:44,330 Ja itse asiassa, jos et mene läpi GDB näet saman asian. 202 00:16:51,120 --> 00:16:57,590 Riippumatta siitä, kuinka monta kertaa olet ajaa ohjelma tai mitä ohjelmaa käytät, 203 00:16:57,590 --> 00:16:59,950 pino on aina menossa aloittaa - 204 00:16:59,950 --> 00:17:06,510 olet aina menossa nähdä muuttujien ympäri osoite oxbffff jotain. 205 00:17:06,510 --> 00:17:09,470 Se on yleensä jossain tuolla alueella. 206 00:17:09,470 --> 00:17:18,760 Mutta miten 2-ohjelmien mahdollisesti on viitteitä samaan muistiin? 207 00:17:20,640 --> 00:17:27,650 [Opiskelija] On joitakin mielivaltainen nimeäminen jossa oxbfff on tarkoitus olla RAM 208 00:17:27,650 --> 00:17:31,320 todella voi olla eri paikoissa riippuen siitä, milloin toiminto nimeltään. 209 00:17:31,320 --> 00:17:35,920 Joo. Termi on virtuaalinen muisti. 210 00:17:35,920 --> 00:17:42,250 Ajatuksena on, että jokainen yksittäinen prosessi, joka ikinen ohjelma, joka on käynnissä tietokoneessa 211 00:17:42,250 --> 00:17:49,450 on oma - Oletetaan 32 bittiä - täysin riippumaton osoite tilaa. 212 00:17:49,450 --> 00:17:51,590 Tämä on osoite tilaa. 213 00:17:51,590 --> 00:17:56,220 Se on oma täysin itsenäinen 4 gigatavua käyttää. 214 00:17:56,220 --> 00:18:02,220 >> Joten jos suoritat 2 ohjelmia samanaikaisesti, tämä ohjelma pitää 4 gigatavua itselleen, 215 00:18:02,220 --> 00:18:04,870 Ohjelman näkee 4 gigatavua itselleen, 216 00:18:04,870 --> 00:18:07,720 ja se on mahdotonta tämän ohjelman dereference osoitin 217 00:18:07,720 --> 00:18:10,920 ja lopulta muistilla tästä ohjelmasta. 218 00:18:10,920 --> 00:18:18,200 Ja mitä virtuaalinen muisti on on kuvaus prosesseista osoitetilan 219 00:18:18,200 --> 00:18:20,470 todellisia asioita RAM. 220 00:18:20,470 --> 00:18:22,940 Joten se on jopa käyttöjärjestelmän tietää, että 221 00:18:22,940 --> 00:18:28,080 Hei, kun tämä kaveri dereferences osoitin oxbfff, joka todella merkitsee 222 00:18:28,080 --> 00:18:31,040 että hän haluaa RAM tavu 1000, 223 00:18:31,040 --> 00:18:38,150 katsoo, että jos tämä ohjelma dereferences oxbfff, hän todella haluaa RAM tavu 10000. 224 00:18:38,150 --> 00:18:41,590 Ne voivat olla mielivaltaisesti kaukana toisistaan. 225 00:18:41,590 --> 00:18:48,730 Tämä on jopa totta asioita yhden prosesseja osoiteavaruuteen. 226 00:18:48,730 --> 00:18:54,770 Niin kuin se näkee kaikki 4 gigatavua itselleen, mutta sanotaanko - 227 00:18:54,770 --> 00:18:57,290 [Opiskelija] Onko jokainen prosessi - 228 00:18:57,290 --> 00:19:01,350 Sanotaan sinulla on tietokone, jossa on vain 4 gigatavua muistia. 229 00:19:01,350 --> 00:19:06,430 Onko jokainen prosessin nähdä koko 4 gigatavua? >> Kyllä. 230 00:19:06,430 --> 00:19:13,060 Mutta 4 gigatavua se näkee on valhe. 231 00:19:13,060 --> 00:19:20,460 Se on vain sen mielestä on kaikki tämä muisti, koska se ei tiedä mitään muuta prosessia olemassa. 232 00:19:20,460 --> 00:19:28,140 Se käyttää vain niin paljon muistia kuin se todella tarvitsee. 233 00:19:28,140 --> 00:19:32,340 Käyttöjärjestelmä ei aio antaa RAM tähän prosessiin 234 00:19:32,340 --> 00:19:35,750 jos se ei käytä mitään muistia koko tällä alueella. 235 00:19:35,750 --> 00:19:39,300 Se ei aio antaa sen muistiin kyseiselle alueelle. 236 00:19:39,300 --> 00:19:54,780 Mutta ajatus on, että - Yritän ajatella - En voi ajatella analogisesti. 237 00:19:54,780 --> 00:19:56,780 Analogiat ovat kovia. 238 00:19:57,740 --> 00:20:02,700 Yksi kysymyksistä virtuaalimuistin tai yksi niistä asioista, se on ratkaista 239 00:20:02,700 --> 00:20:06,810 että prosessien tulisi olla täysin tietämättömiä toisistaan. 240 00:20:06,810 --> 00:20:12,140 Ja niin voit kirjoittaa minkä tahansa ohjelman, joka juuri dereferences tahansa osoitin, 241 00:20:12,140 --> 00:20:19,340 kuten vain kirjoittaa ohjelma, joka kertoo * (ox1234), 242 00:20:19,340 --> 00:20:22,890 ja että on dereferencing muistiosoite 1234. 243 00:20:22,890 --> 00:20:28,870 >> Mutta se on jopa käyttöjärjestelmä sitten kääntää mitä 1234 tarkoittaa. 244 00:20:28,870 --> 00:20:33,960 Joten jos 1234 sattuu olemaan voimassa muisti osoite tähän prosessiin, 245 00:20:33,960 --> 00:20:38,800 kuin se pinoon tai jotain, niin se palauttaa arvon että muistin osoitteen 246 00:20:38,800 --> 00:20:41,960 niin pitkälle kuin prosessi tietää. 247 00:20:41,960 --> 00:20:47,520 Mutta jos 1234 ei ole kelvollinen osoite, kuten se tapahtuu laskeutumaan 248 00:20:47,520 --> 00:20:52,910 Joissakin pieni pala muistia täällä, että on kuin pino ja sen jälkeen kasaan 249 00:20:52,910 --> 00:20:57,200 ja et ole oikeasti käyttänyt tätä, niin silloin saat asiat kuten segfaults 250 00:20:57,200 --> 00:21:00,260 koska olet koskettaa muistia, että sinun ei pitäisi koskettaa. 251 00:21:07,180 --> 00:21:09,340 Tämä pätee myös - 252 00:21:09,340 --> 00:21:15,440 32-bittinen järjestelmä, 32 bittiä tarkoittaa olet 32 ​​bittiä määrittää muistin osoite. 253 00:21:15,440 --> 00:21:22,970 Se, miksi osoittimet ovat 8 tavua, koska 32 bittiä on 8 tavua - tai 4 tavua. 254 00:21:22,970 --> 00:21:25,250 Osoittimet ovat 4 tavua. 255 00:21:25,250 --> 00:21:33,680 Joten kun näet osoittimen kuten oxbfffff, että on - 256 00:21:33,680 --> 00:21:40,080 Sisällä minkään ohjelman voit vain rakentaa mielivaltaiseen osoitin, 257 00:21:40,080 --> 00:21:46,330 missä tahansa ox0 ja ox 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Opiskelija] Etkö sanonut he 4 tavua? >> Joo. 259 00:21:49,180 --> 00:21:52,730 [Opiskelija] Sitten jokainen tavu on - >> [Bowden] Heksadesimaali. 260 00:21:52,730 --> 00:21:59,360 Heksadesimaali - 5, 6, 7, 8. Joten viitteitä aiot aina nähdä heksadesimaalimuodossa. 261 00:21:59,360 --> 00:22:01,710 Se on vain miten luokittelemme osoittimia. 262 00:22:01,710 --> 00:22:05,240 Joka 2 numeroa heksadesimaalinen on 1 tavu. 263 00:22:05,240 --> 00:22:09,600 Joten siellä tulee olemaan 8 heksadesimaalilukua 4 tavua. 264 00:22:09,600 --> 00:22:14,190 Joten jokainen osoittimen 32-bittinen järjestelmä tulee olemaan 4 tavua, 265 00:22:14,190 --> 00:22:18,550 mikä tarkoittaa, että sinun prosessi voi rakentaa mielivaltaiseen 4 tavua 266 00:22:18,550 --> 00:22:20,550 ja tehdä osoittimen pois, 267 00:22:20,550 --> 00:22:32,730 mikä tarkoittaa, että niin paljon kuin se on tietoinen siitä, se voi puuttua koko 2 32 tavua muistia. 268 00:22:32,730 --> 00:22:34,760 Vaikka se ei oikeastaan ​​ole pääsyä, että 269 00:22:34,760 --> 00:22:40,190 vaikka tietokoneessa on vain 512 megatavua, sen mielestä on niin paljon muistia. 270 00:22:40,190 --> 00:22:44,930 Ja käyttöjärjestelmä on fiksu, että se vain osoittaa, mitä todella tarvitset. 271 00:22:44,930 --> 00:22:49,630 Se ei vain mennä, oh, uusi prosessi: 4 keikkoja. 272 00:22:49,630 --> 00:22:51,930 >> Joo. >> [Opiskelija] Mitä härkä tarkoittaa? Miksi kirjoitat sen? 273 00:22:51,930 --> 00:22:54,980 Se on vain symboli heksadesimaali. 274 00:22:54,980 --> 00:22:59,590 Kun näet useita alkavat härkä, peräkkäiset asiat ovat heksadesimaalimuodossa. 275 00:23:01,930 --> 00:23:05,760 [Opiskelija] Olit selittää mitä tapahtuu, kun ohjelma loppuu. >> Kyllä. 276 00:23:05,760 --> 00:23:09,480 Mitä tapahtuu, kun ohjelma loppuu on käyttöjärjestelmä 277 00:23:09,480 --> 00:23:13,600 vain poistaa kuvaukset että se on nämä osoitteet, ja se on siinä. 278 00:23:13,600 --> 00:23:17,770 Käyttöjärjestelmä voi nyt vain antaa joka muisti toiseen ohjelma käyttää. 279 00:23:17,770 --> 00:23:19,490 [Opiskelija] Okei. 280 00:23:19,490 --> 00:23:24,800 Joten kun jakaa jotain kasaan tai pino-tai globaaleja muuttujia tai mitään, 281 00:23:24,800 --> 00:23:27,010 ne kaikki katoavat heti ohjelman päättymisen 282 00:23:27,010 --> 00:23:32,120 koska käyttöjärjestelmä on nyt vapaa antaa että muisti muille prosessiin. 283 00:23:32,120 --> 00:23:35,150 [Opiskelija] Vaikka on luultavasti vielä arvoja kirjoitettu? >> Joo. 284 00:23:35,150 --> 00:23:37,740 Arvot ovat todennäköisesti edelleen siellä. 285 00:23:37,740 --> 00:23:41,570 Se on vain se tulee olemaan vaikeaa saada niitä. 286 00:23:41,570 --> 00:23:45,230 Se on paljon vaikeampaa saada niitä kuin se on saada aikaa poistettu tiedosto 287 00:23:45,230 --> 00:23:51,450 koska poistetun tiedoston sellainen istuu siellä pitkään ja kiintolevy on paljon isompi. 288 00:23:51,450 --> 00:23:54,120 Joten se tulee korvata eri puolilla muistia 289 00:23:54,120 --> 00:23:58,640 ennen kuin se tapahtuu korvata kimpale muistin että tiedosto käyttää olevan. 290 00:23:58,640 --> 00:24:04,520 Mutta tärkein muistia, RAM, voit selata paljon nopeammin, 291 00:24:04,520 --> 00:24:08,040 joten se tulee hyvin nopeasti päälle. 292 00:24:10,300 --> 00:24:13,340 Kysymykset tämän tai jotain muuta? 293 00:24:13,340 --> 00:24:16,130 [Opiskelija] Minulla on kysyttävää eri aihe. >> Okei. 294 00:24:16,130 --> 00:24:19,060 Onko kellään kysyttävää tähän? 295 00:24:20,170 --> 00:24:23,120 >> Okei. Eri aihe. >> [Opiskelija] Okei. 296 00:24:23,120 --> 00:24:26,550 Olin menossa läpi joitakin käytännön testejä, 297 00:24:26,550 --> 00:24:30,480 ja yksi heistä se puhui sizeof 298 00:24:30,480 --> 00:24:35,630 ja arvo, että se palauttaa tai eri muuttujan tyyppiä. >> Kyllä. 299 00:24:35,630 --> 00:24:45,060 Ja sanoi, että sekä int ja pitkä sekä tuotto 4, joten he molemmat 4 tavua pitkä. 300 00:24:45,060 --> 00:24:48,070 Onko eroa int ja pitkä, vai onko se sama asia? 301 00:24:48,070 --> 00:24:50,380 Kyllä, on olemassa ero. 302 00:24:50,380 --> 00:24:52,960 C-standardi - 303 00:24:52,960 --> 00:24:54,950 Olen luultavasti menossa sotkea. 304 00:24:54,950 --> 00:24:58,800 C-standardi on aivan kuin mitä C on virallisiin asiakirjoihin C. 305 00:24:58,800 --> 00:25:00,340 Tämä on mitä se sanoo. 306 00:25:00,340 --> 00:25:08,650 Joten C standardi sanoo vain, että char ikuisesti ja aina 1 tavun. 307 00:25:10,470 --> 00:25:19,040 Kaiken sen jälkeen, että - lyhyen on aina vain määritelty niin, että suurempi tai yhtä suuri kuin char. 308 00:25:19,040 --> 00:25:23,010 Tämä saattaa olla ehdottomasti suurempi kuin, mutta ei positiivista. 309 00:25:23,010 --> 00:25:31,940 Int on juuri määritelty niin, että suurempi tai yhtä suuri kuin lyhyt. 310 00:25:31,940 --> 00:25:36,210 Ja pitkä on juuri määritelty niin, että suurempi tai yhtä suuri kuin int. 311 00:25:36,210 --> 00:25:41,600 Ja pitkään pitkään on suurempi tai yhtä suuri kuin pitkä. 312 00:25:41,600 --> 00:25:46,610 Joten ainoa asia C standardi määrittelee on suhteellinen tilaamista kaiken. 313 00:25:46,610 --> 00:25:54,880 Todellisen muistin määrä, että asiat vievät yleensä jopa täytäntöönpanoa, 314 00:25:54,880 --> 00:25:57,640 mutta se on aika hyvin määritelty tässä vaiheessa. >> [Opiskelija] Okei. 315 00:25:57,640 --> 00:26:02,490 Joten shortsit ovat lähes aina olemaan 2 tavua. 316 00:26:04,920 --> 00:26:09,950 Ints ovat lähes aina olemaan 4 tavua. 317 00:26:12,070 --> 00:26:15,340 Pitkät pitkät ovat lähes aina olemaan 8 tavua. 318 00:26:17,990 --> 00:26:23,160 Ja kaipaa, se riippuu siitä, käytät 32-bittinen tai 64-bittinen järjestelmä. 319 00:26:23,160 --> 00:26:27,450 Niin kauan on menossa vastaamaan järjestelmän tyyppiä. 320 00:26:27,450 --> 00:26:31,920 Jos käytät 32-bittinen järjestelmä kaltainen laite, se tulee olemaan 4 tavua. 321 00:26:34,530 --> 00:26:42,570 Jos käytät 64-bittistä kuin paljon viime tietokoneiden, se tulee olemaan 8 tavua. 322 00:26:42,570 --> 00:26:45,230 >> Ints ovat lähes aina 4 tavua tässä vaiheessa. 323 00:26:45,230 --> 00:26:47,140 Pitkä pitkät ovat lähes aina 8 tavua. 324 00:26:47,140 --> 00:26:50,300 Aikaisemmin, ints käytetään vain 2 tavua. 325 00:26:50,300 --> 00:26:56,840 Mutta huomaa, että tämä täysin täyttää kaikki nämä suhteet suurempi ja yhtä. 326 00:26:56,840 --> 00:27:01,280 Niin kauan on täydellisesti saa olla saman kokoinen kuin kokonaisluku, 327 00:27:01,280 --> 00:27:04,030 ja se on myös mahdollisuus olla saman kokoinen kuin pitkä pitkä. 328 00:27:04,030 --> 00:27:11,070 Ja se vain niin sattuu olemaan, että 99,999% järjestelmiä, se tulee olemaan yhtä suuri kuin 329 00:27:11,070 --> 00:27:15,800 joko int tai pitkään pitkään. Se vain riippuu 32-bittinen tai 64-bittinen. >> [Opiskelija] Okei. 330 00:27:15,800 --> 00:27:24,600 Vuonna kellukkeet, miten on desimaalipilkun nimetty bitteinä? 331 00:27:24,600 --> 00:27:27,160 Niinkuin binary? >> Joo. 332 00:27:27,160 --> 00:27:30,570 Sinun ei tarvitse tietää, että CS50. 333 00:27:30,570 --> 00:27:32,960 Et edes opi että 61. 334 00:27:32,960 --> 00:27:37,350 Et opi että oikeastaan ​​missään aikana. 335 00:27:37,350 --> 00:27:42,740 Se on vain edustus. 336 00:27:42,740 --> 00:27:45,440 Unohdan tarkka bitti siirtolapuutarhojen. 337 00:27:45,440 --> 00:27:53,380 Ajatus liukulukujen on, että te jakaa tietty määrä bittejä edustamaan - 338 00:27:53,380 --> 00:27:56,550 Periaatteessa kaikki on tieteellisessä muodossa. 339 00:27:56,550 --> 00:28:05,600 Joten te jakaa tietty määrä bittejä edustamaan itse numeroa, kuten 1.2345. 340 00:28:05,600 --> 00:28:10,200 En voi koskaan edustaa useita enemmän numeroita kuin 5. 341 00:28:12,200 --> 00:28:26,300 Sitten voit myös varata tietty määrä bittejä siten, että sillä on taipumus olla esimerkiksi 342 00:28:26,300 --> 00:28:32,810 voit vain mennä jopa tietty määrä, kuten se on suurin eksponentti voi olla, 343 00:28:32,810 --> 00:28:36,190 ja voit vain mennä alas tietty eksponentti, 344 00:28:36,190 --> 00:28:38,770 kuten se pienin eksponentti voi olla. 345 00:28:38,770 --> 00:28:44,410 >> En muista tarkkaa bitit jaetaan kaikkien näiden arvojen 346 00:28:44,410 --> 00:28:47,940 mutta tietty määrä bittejä on omistettu 1,2345, 347 00:28:47,940 --> 00:28:50,930 toinen tietty määrä bittejä on omistettu eksponentti 348 00:28:50,930 --> 00:28:55,670 ja se on mahdollista vain edustamaan eksponentti tietyn koon. 349 00:28:55,670 --> 00:29:01,100 [Opiskelija] Ja kaksinkertainen? Onko se kuin erikoispitkä float? >> Joo. 350 00:29:01,100 --> 00:29:07,940 Se on sama asia kuin float paitsi nyt käytät 8 tavua sijasta 4 tavua. 351 00:29:07,940 --> 00:29:11,960 Nyt voit käyttää 9 numeroa tai 10 numeroa, 352 00:29:11,960 --> 00:29:16,630 ja tämä voi mennä jopa 300 sijasta 100. >> [Opiskelija] Okei. 353 00:29:16,630 --> 00:29:21,550 Ja kelluu myös 4 tavua. >> Kyllä. 354 00:29:21,550 --> 00:29:27,520 No, jälleen, se luultavasti riippuu yleisestä yleistä täytäntöönpanoa, 355 00:29:27,520 --> 00:29:30,610 mutta kellukkeet ovat 4 tavua, kaksinkertaistuu ovat 8. 356 00:29:30,610 --> 00:29:33,440 Doubles kutsutaan kaksinkertainen, koska ne ovat kaksinkertaiset kelluu. 357 00:29:33,440 --> 00:29:38,380 [Opiskelija] Okei. Ja on siellä kaksinkertainen kaksinkertaistuu? >> Ei ole. 358 00:29:38,380 --> 00:29:43,660 Uskon - >> [opiskelija] Kuten pitkä pitkät? >> Joo. En usko. Kyllä. 359 00:29:43,660 --> 00:29:45,950 [Opiskelija] viime vuoden koe oli kysymys päätehtävä 360 00:29:45,950 --> 00:29:49,490 tarvitse olla osa ohjelmaa. 361 00:29:49,490 --> 00:29:52,310 Vastaus oli, että se ei tarvitse olla osa ohjelmaa. 362 00:29:52,310 --> 00:29:55,100 Missä tilanteessa? Se mitä olen nähnyt. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Vaikuttaa - >> [opiskelija] Mikä tilanne? 364 00:29:59,090 --> 00:30:02,880 Onko sinulla ongelmia? >> [Opiskelija] Joo, voin varmasti vetää sitä ylös. 365 00:30:02,880 --> 00:30:07,910 Sen ei tarvitse olla, teknisesti, mutta pohjimmiltaan se tulee olemaan. 366 00:30:07,910 --> 00:30:10,030 [Opiskelija] Näin yksi eri vuoden. 367 00:30:10,030 --> 00:30:16,220 Se oli kuin True tai False: kelvollinen - >> Voi. C-tiedoston? 368 00:30:16,220 --> 00:30:18,790 [Opiskelija] Kaikki. C tiedosto on oltava - [molemmat puhuvat yhtä aikaa - käsittämätön] 369 00:30:18,790 --> 00:30:21,120 Okei. Joten se erillinen. 370 00:30:21,120 --> 00:30:26,800 >> . C-tiedoston tarvitsee vain olla toimintoja. 371 00:30:26,800 --> 00:30:32,400 Voit koota tiedoston konekielelle, binary riippumatta, 372 00:30:32,400 --> 00:30:36,620 ilman että executable vielä. 373 00:30:36,620 --> 00:30:39,420 Voimassa executable oltava päätehtävä. 374 00:30:39,420 --> 00:30:45,460 Voit kirjoittaa 100 toimintoa 1 tiedosto, mutta ei tärkein 375 00:30:45,460 --> 00:30:48,800 ja sitten koota se alas binääri, 376 00:30:48,800 --> 00:30:54,460 sitten kirjoittaa toisen tiedoston, jossa on vain tärkeimmät mutta se vaatii kasan näitä toimintoja 377 00:30:54,460 --> 00:30:56,720 Tämän binääritiedoston tänne. 378 00:30:56,720 --> 00:31:01,240 Ja niin kun teet executable, että mitä linkkeri tekee 379 00:31:01,240 --> 00:31:05,960 on se yhdistää nämä 2 binääri tiedostoja executable. 380 00:31:05,960 --> 00:31:11,400 Niin. C tiedostoa ei tarvitse olla main toimi lainkaan. 381 00:31:11,400 --> 00:31:19,220 Ja iso koodi perustaa näet tuhansia. C tiedostojen ja 1 tärkein tiedosto. 382 00:31:23,960 --> 00:31:26,110 Lisää kysymyksiä? 383 00:31:29,310 --> 00:31:31,940 [Opiskelija] Oli toinen kysymys. 384 00:31:31,940 --> 00:31:36,710 Se sanoi tee on kääntäjä. Totta vai tarua? 385 00:31:36,710 --> 00:31:42,030 Ja vastaus oli väärä, ja ymmärsin, miksi se ei ole kuin clang. 386 00:31:42,030 --> 00:31:44,770 Mutta mitä me kutsumme tehdä, jos se ei ole? 387 00:31:44,770 --> 00:31:49,990 Make on pohjimmiltaan vain - Näen mitä se kutsuu. 388 00:31:49,990 --> 00:31:52,410 Mutta se vain toimii komentoja. 389 00:31:53,650 --> 00:31:55,650 Make. 390 00:31:58,240 --> 00:32:00,870 Voin vetää tämän ylös. Joo. 391 00:32:10,110 --> 00:32:13,180 Joo. Tee myös tekee sen. 392 00:32:13,180 --> 00:32:17,170 Tämä kertoo tarkoitus merkistä apuohjelma on määrittää automaattisesti 393 00:32:17,170 --> 00:32:19,610 mitkä osat suuresta ohjelmasta pitää kääntää uudelleen 394 00:32:19,610 --> 00:32:22,350 ja antaa komentoja kääntää niitä. 395 00:32:22,350 --> 00:32:27,690 Voit tehdä tehdä tiedostoja, jotka ovat aivan valtava. 396 00:32:27,690 --> 00:32:33,210 Tee tarkastellaan aikaleimat tiedostoja, ja kuten sanoin, 397 00:32:33,210 --> 00:32:36,930 voit kääntää yksittäisiä tiedostoja alas, ja se vasta saat linkittäjän 398 00:32:36,930 --> 00:32:39,270 että he laittaa yhteen executable. 399 00:32:39,270 --> 00:32:43,810 Joten jos sinulla on 10 eri tiedostoja ja teet muutoksen 1 niistä, 400 00:32:43,810 --> 00:32:47,870 niin mitä tehdä aikoo tehdä, on vain käännöksen että 1 tiedosto 401 00:32:47,870 --> 00:32:50,640 ja sitten linkittää kaiken yhdessä. 402 00:32:50,640 --> 00:32:53,020 Mutta se on paljon tyhmempi kuin. 403 00:32:53,020 --> 00:32:55,690 Se on jopa voit täysin määritellä, että mitä sen pitäisi tehdä. 404 00:32:55,690 --> 00:32:59,560 Sen oletuksena on kyky tunnistaa tämä aikaleima kamaa, 405 00:32:59,560 --> 00:33:03,220 mutta voit kirjoittaa merkki tiedosto tehdä mitään. 406 00:33:03,220 --> 00:33:09,150 Voit kirjoittaa tehdä tiedoston niin, että kun kirjoitat tehdä sen vain cd toiseen hakemistoon. 407 00:33:09,150 --> 00:33:15,560 Olin saada turhautuneita, koska en luovi kaiken sisällä minun Appliance 408 00:33:15,560 --> 00:33:21,740 ja sitten katsella PDF Mac. 409 00:33:21,740 --> 00:33:30,720 >> Joten menen Finder ja voin Go, Yhdistä palvelimeen, 410 00:33:30,720 --> 00:33:36,950 ja palvelimen Liityn on minun Appliance, ja sitten avata PDF 411 00:33:36,950 --> 00:33:40,190 että saa kokoamat LaTeX. 412 00:33:40,190 --> 00:33:49,320 Mutta olin saada turhautuneita, koska joka ikinen kerta minun piti päivittää PDF- 413 00:33:49,320 --> 00:33:53,900 Jouduin kopioida tietyn hakemiston että se voisi käyttää 414 00:33:53,900 --> 00:33:57,710 ja se oli tulossa ärsyttävää. 415 00:33:57,710 --> 00:34:02,650 Joten sen sijaan kirjoitin merkki tiedoston, jossa sinun täytyy määrittää, miten se tekee asioista. 416 00:34:02,650 --> 00:34:06,130 Miten teet tämän on PDF-LaTeX. 417 00:34:06,130 --> 00:34:10,090 Aivan kuten mikä tahansa muu merkki tiedoston - tai kai ole nähnyt merkki tiedostoja, 418 00:34:10,090 --> 00:34:13,510 mutta meillä Appliance maailmanlaajuinen merkki tiedosto vain sanoo, 419 00:34:13,510 --> 00:34:16,679 jos olet koota C tiedoston, käytä clang. 420 00:34:16,679 --> 00:34:20,960 Ja niin täällä minun tehdä tiedosto teen sanon, 421 00:34:20,960 --> 00:34:25,020 Tämä tiedosto aiot haluavat kääntää PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Ja niin se on PDF LaTeX että tekee kootaan. 423 00:34:27,889 --> 00:34:31,880 Tee ei koota. Se on juuri käynnissä nämä komennot järjestyksessä I määritelty. 424 00:34:31,880 --> 00:34:36,110 Niin se toimii PDF LaTeX, kopioi se hakemistoon haluan sen kopioidaan, 425 00:34:36,110 --> 00:34:38,270 se cd on hakemistoon ja tekee muita asioita, 426 00:34:38,270 --> 00:34:42,380 mutta kaikki se on tunnustettava, kun tiedosto muuttuu, 427 00:34:42,380 --> 00:34:45,489 ja jos se muuttuu, niin se ajaa komentoja että sen pitäisi ajaa 428 00:34:45,489 --> 00:34:48,760 kun tiedosto muuttuu. >> [Opiskelija] Okei. 429 00:34:50,510 --> 00:34:54,420 En tiedä missä globaali merkki tiedostot ovat minulle check it out. 430 00:34:57,210 --> 00:35:04,290 Muita kysymyksiä? Mitään menneisyyden tietokilpailuja? Jokainen osoitin asioita? 431 00:35:06,200 --> 00:35:08,730 On hienovaraisia ​​asioita viitteitä esimerkiksi - 432 00:35:08,730 --> 00:35:10,220 En aio pystyä löytämään tietovisa kysymys siitä - 433 00:35:10,220 --> 00:35:16,250 mutta aivan kuten näissä jutuissa. 434 00:35:19,680 --> 00:35:24,060 Varmista, että ymmärrät, että kun sanon int * x * y - 435 00:35:24,890 --> 00:35:28,130 Tämä ei ole täsmälleen mitään täällä, luulisin. 436 00:35:28,130 --> 00:35:32,140 Mutta kuten * x * y, jotka ovat 2 muuttujiin, jotka ovat pinoon. 437 00:35:32,140 --> 00:35:37,220 Kun sanon x = malloc (sizeof (int)), x on edelleen vaihteleva pinoon, 438 00:35:37,220 --> 00:35:41,180 malloc on jonkin lohkon ohi kasaan, ja emme ottaa x pisteen kasaan. 439 00:35:41,180 --> 00:35:43,900 >> Joten jotain pino osoittaa kasaan. 440 00:35:43,900 --> 00:35:48,100 Aina kun malloc mitään, olet väistämättä tallentamalla sen sisällä osoittimen. 441 00:35:48,100 --> 00:35:55,940 Siten, että osoitin on pinoon, malloced lohko on kasaan. 442 00:35:55,940 --> 00:36:01,240 Monet ihmiset hämmentyvät ja sanovat int * x = malloc, x on kasaan. 443 00:36:01,240 --> 00:36:04,100 No mitä x viittaa on kasaan. 444 00:36:04,100 --> 00:36:08,540 x itsessään on pino, ellei jostain syystä olet x olla globaali muuttuja, 445 00:36:08,540 --> 00:36:11,960 jolloin se sattuu olemaan toisella alueella muistia. 446 00:36:13,450 --> 00:36:20,820 Joten pitää kirjaa, nämä laatikko ja nuoli kaaviot ovat melko yleisiä ja tietokilpailu. 447 00:36:20,820 --> 00:36:25,740 Tai jos se ei tietovisa 0, se tulee olemaan Quiz 1. 448 00:36:27,570 --> 00:36:31,940 Sinun pitäisi tietää kaikki nämä vaiheet kokoamisessa 449 00:36:31,940 --> 00:36:35,740 koska sinulla oli vastata kysymyksiin näistä. Kyllä. 450 00:36:35,740 --> 00:36:38,940 [Opiskelija] Voisimmeko mennä yli nämä vaiheet - >> Toki. 451 00:36:48,340 --> 00:36:58,640 Ennen vaiheita ja koota olemme esikäsittely, 452 00:36:58,640 --> 00:37:16,750 laadinnassa, kokoonpano ja yhdistää. 453 00:37:16,750 --> 00:37:21,480 Esikäsittely. Mitä se tekee? 454 00:37:29,720 --> 00:37:32,290 Se on helpoin askel - hyvin, pidä - 455 00:37:32,290 --> 00:37:35,770 se ei tarkoita sitä pitäisi olla itsestään selvää, mutta se on helpoin vaihe. 456 00:37:35,770 --> 00:37:38,410 Te voisi toteuttaa sen itse. Joo. 457 00:37:38,410 --> 00:37:43,410 [Opiskelija] Ota mitä sinulla on myös näin, ja se kopioi ja sitten myös määrittelee. 458 00:37:43,410 --> 00:37:49,250 Näyttää asioita, kuten # include ja # define- 459 00:37:49,250 --> 00:37:53,800 ja se vain kopiot ja tahnoja mitä ne oikeastaan ​​tarkoittavat. 460 00:37:53,800 --> 00:37:59,240 Joten kun sanot # include cs50.h, esikäsittelijän on kopioimalla cs50.h 461 00:37:59,240 --> 00:38:01,030 tuohon viiva. 462 00:38:01,030 --> 00:38:06,640 Kun sanot # define x on 4, esikäsittelijä kulkee koko ohjelman 463 00:38:06,640 --> 00:38:10,400 ja korvaa kaikki esiintymät x 4. 464 00:38:10,400 --> 00:38:17,530 Joten esikäsittelijä vie kelvollista C-tiedoston ja tulostaa kelvollinen C tiedosto 465 00:38:17,530 --> 00:38:20,300 jossa asiat on kopioitu ja liitetty. 466 00:38:20,300 --> 00:38:24,230 Joten nyt kokoamisessa. Mitä se tekee? 467 00:38:25,940 --> 00:38:28,210 [Opiskelija] Se kulkee C binary. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Se ei mene aina binary. 469 00:38:30,970 --> 00:38:34,220 [Opiskelija] koneen koodi sitten? >> Se ei konekielelle. 470 00:38:34,220 --> 00:38:35,700 [Opiskelija] Assembly? >> Assembly. 471 00:38:35,700 --> 00:38:38,890 Se menee Assembly ennen kuin se menee aina C-koodia, 472 00:38:38,890 --> 00:38:45,010 ja useimmilla kielillä tehdä jotain tällaista. 473 00:38:47,740 --> 00:38:50,590 Valita minkä tahansa korkean tason kieli, ja jos aiot kääntää sitä, 474 00:38:50,590 --> 00:38:52,390 se on todennäköisesti kääntää portaittain. 475 00:38:52,390 --> 00:38:58,140 Ensin se tulee koota Python C, niin se tulee laatia C Assembly, 476 00:38:58,140 --> 00:39:01,600 ja sitten Assembly on menossa käännetty binääri. 477 00:39:01,600 --> 00:39:07,800 Joten kootaan aikoo tuoda sen C Assembly. 478 00:39:07,800 --> 00:39:12,130 Sana kootaan yleensä tarkoittaa tuo sitä korkeampi 479 00:39:12,130 --> 00:39:14,340 ja alemman tason ohjelmointikieli. 480 00:39:14,340 --> 00:39:19,190 Joten tämä on vain askel kokoelma jossa aloitat korkean tason kielellä 481 00:39:19,190 --> 00:39:23,270 ja päätyvät matalan tason kieli, ja siksi vaihetta kutsutaan laadinnassa. 482 00:39:25,280 --> 00:39:33,370 [Opiskelija] aikana kokoamiseen, sanotaan, että olet tehnyt # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Tulee kääntäjä käännöksen cs50.h, kuten toimintoja, jotka ovat olemassa, 484 00:39:42,190 --> 00:39:45,280 ja kääntää sen osaksi edustajakokous koodia samoin, 485 00:39:45,280 --> 00:39:50,830 tai se kopioi ja liitä jotain, joka on ollut pre-Assembly? 486 00:39:50,830 --> 00:39:56,910 cs50.h melko paljon koskaan päädy Assembly. 487 00:39:59,740 --> 00:40:03,680 Tavaraa kuten toiminta prototyyppejä ja asiat ovat sinua varten olla varovainen. 488 00:40:03,680 --> 00:40:09,270 Se takaa, että kääntäjä voi tarkistaa asioita, kuten soitat toiminnot 489 00:40:09,270 --> 00:40:12,910 oikealla palata tyypit ja oikean väitteitä ja juttuja. 490 00:40:12,910 --> 00:40:18,350 >> Joten cs50.h tullaan esikäsitellään osaksi tiedoston, ja sitten kun se kootaan 491 00:40:18,350 --> 00:40:22,310 Se on pohjimmiltaan heitetään pois, kun se varmistaa, että kaikki on kutsutaan oikein. 492 00:40:22,310 --> 00:40:29,410 Mutta toiminnot on määritelty CS50 kirjastossa, jotka ovat erillään cs50.h, 493 00:40:29,410 --> 00:40:33,610 näitä ei erikseen laadittuja. 494 00:40:33,610 --> 00:40:37,270 Se todella tulee alas yhdistää vaiheessa, joten saamme siihen toisessa. 495 00:40:37,270 --> 00:40:40,100 Mutta ensin, mitä on kokoonpano? 496 00:40:41,850 --> 00:40:44,500 [Opiskelija] yleiskokouksen binääri? >> Joo. 497 00:40:46,300 --> 00:40:48,190 Kokoaminen. 498 00:40:48,190 --> 00:40:54,710 Emme kutsu sitä kootaan koska Assembly on melko puhdas käännös binary. 499 00:40:54,710 --> 00:41:00,230 On hyvin vähän logiikkaa menee Assembly binary. 500 00:41:00,230 --> 00:41:03,180 Se on aivan kuin etsii taulukossa, oh, meillä on tämä ohje; 501 00:41:03,180 --> 00:41:06,290 , joka vastaa binäärinen 01110. 502 00:41:10,200 --> 00:41:15,230 Ja niin tiedostojen kokoaminen yleisesti ulostulot. O tiedostoja. 503 00:41:15,230 --> 00:41:19,020 Ja. O tiedostot ovat mitä sanoimme aiemmin, 504 00:41:19,020 --> 00:41:21,570 Näin tiedosto ei tarvitse olla tärkein ominaisuus. 505 00:41:21,570 --> 00:41:27,640 Jokainen tiedosto voidaan laatia alas. O tiedosto niin kauan kuin se on voimassa C tiedostoa. 506 00:41:27,640 --> 00:41:30,300 Se voidaan laatia alas. O. 507 00:41:30,300 --> 00:41:43,030 Nyt, yhdistää mitä oikeastaan ​​tuo kasan. O tiedostoja ja tuo ne executable. 508 00:41:43,030 --> 00:41:51,110 Ja niin, mitä yhdistäminen ei on voit ajatella CS50 kirjasto. O-tiedoston. 509 00:41:51,110 --> 00:41:56,980 Se on jo käännetty binaaritiedosto. 510 00:41:56,980 --> 00:42:03,530 Ja niin kun käännät tiedoston, sinun hello.c, jossa vaaditaan GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c saa käännetty alas hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o on nyt binary. 513 00:42:08,910 --> 00:42:12,830 Se käyttää GetString, joten se tarvitsee mennä yli cs50.o, 514 00:42:12,830 --> 00:42:16,390 ja linkkeri smooshes ne yhteen ja kopioi GetString tähän tiedostoon 515 00:42:16,390 --> 00:42:20,640 ja tulee ulos executable että on kaikki toiminnot, joita se tarvitsee. 516 00:42:20,640 --> 00:42:32,620 Joten cs50.o ei oikeastaan ​​O-tiedoston, mutta se on tarpeeksi lähellä, ettei mitään periaatteellista eroa. 517 00:42:32,620 --> 00:42:36,880 Joten yhdistää vain tuo kasan tiedostoja yhteen 518 00:42:36,880 --> 00:42:41,390 että erikseen sisältävät kaikki toiminnot Minun täytyy käyttää 519 00:42:41,390 --> 00:42:46,120 ja luo executable joka todella ajaa. 520 00:42:48,420 --> 00:42:50,780 >> Ja niin se on myös mitä sanoimme aiemmin 521 00:42:50,780 --> 00:42:55,970 jossa voit olla 1000. C-tiedostoja, käännät ne kaikki. O tiedostoja, 522 00:42:55,970 --> 00:43:00,040 joka todennäköisesti kestää jonkin aikaa, sitten muutat 1. C tiedosto. 523 00:43:00,040 --> 00:43:05,480 Sinun tarvitsee vain kääntää että 1. C tiedosto ja sitten Linkitä uudelleen kaiken muun, 524 00:43:05,480 --> 00:43:07,690 linkki kaiken takaisin yhteen. 525 00:43:09,580 --> 00:43:11,430 [Opiskelija] Kun Liitämme kirjoitamme lcs50? 526 00:43:11,430 --> 00:43:20,510 Joo, niin lcs50. Tämä lippu signaaleja linkittäjän että sinun pitäisi yhdistää kyseisessä kirjastossa. 527 00:43:26,680 --> 00:43:28,910 Kysymyksiä? 528 00:43:41,310 --> 00:43:46,860 Olemmeko menneet yli binary muihin kuin 5 sekuntia ensimmäisellä luennolla? 529 00:43:50,130 --> 00:43:53,010 En usko. 530 00:43:55,530 --> 00:43:58,820 Sinun pitäisi tietää kaikki suuret Os että olemme menneet ohi, 531 00:43:58,820 --> 00:44:02,670 ja sinun pitäisi pystyä, jos me annoimme teille toiminto, 532 00:44:02,670 --> 00:44:09,410 sinun pitäisi pystyä sanomaan se iso O, suunnilleen. Tai no, iso O on karkea. 533 00:44:09,410 --> 00:44:15,300 Joten jos näet sisäkkäisiä silmukoita silmukoiden yli sama määrä asioita, 534 00:44:15,300 --> 00:44:22,260 kuten int i, i > [opiskelija] n potenssiin. >> Sillä on taipumus olla n neliöön. 535 00:44:22,260 --> 00:44:25,280 Jos olet kolminkertainen sisäkkäin, se on yleensä n. kuutioitu. 536 00:44:25,280 --> 00:44:29,330 Niin, että sellainen asia, sinun pitäisi pystyä huomauttaa heti. 537 00:44:29,330 --> 00:44:33,890 Sinun täytyy tietää insertion sort ja kupla lajitella ja yhdistää lajitella ja kaikki nämä. 538 00:44:33,890 --> 00:44:41,420 On helpompi ymmärtää, miksi ne ovat n neliö ja n log n ja kaikki tämä 539 00:44:41,420 --> 00:44:47,810 koska mielestäni siellä oli tietovisa yksi vuosi me pohjimmiltaan annoimme teille 540 00:44:47,810 --> 00:44:55,050 täytäntöönpano kupla lajitella ja sanoi: "Mikä on ajoaika tämän toiminnon?" 541 00:44:55,050 --> 00:45:01,020 Joten jos tunnistaa sen kupla lajitella, voit heti sanoa n potenssiin. 542 00:45:01,020 --> 00:45:05,470 Mutta jos vain katsoa sitä, sinun ei tarvitse edes ymmärtää se kupla tavallaan; 543 00:45:05,470 --> 00:45:08,990 voit vain sanoa tämä tekee tätä ja tätä. Tämä on n potenssiin. 544 00:45:12,350 --> 00:45:14,710 [Opiskelija] Onko kova esimerkkejä voi keksiä, 545 00:45:14,710 --> 00:45:20,370 kuin samanlainen ajatus selvittämiseen? 546 00:45:20,370 --> 00:45:24,450 >> En usko, että antaisi sinulle kova esimerkkejä. 547 00:45:24,450 --> 00:45:30,180 Bubble sort asia on suunnilleen yhtä kova kuin me menisi, 548 00:45:30,180 --> 00:45:36,280 ja sekin, kunhan ymmärrät, että olet iteroimalla yli array 549 00:45:36,280 --> 00:45:41,670 kunkin alkio, joka tulee olemaan jotain, joka n: n potenssiin. 550 00:45:45,370 --> 00:45:49,940 On yleisiä kysymyksiä, kuten täällä meillä on - Oh. 551 00:45:55,290 --> 00:45:58,530 Aivan toinen päivä, Doug väitti, "olen keksinyt algoritmin, joka voi lajitella taulukon 552 00:45:58,530 --> 00:46:01,780 "N numeroita O (log n) ajan!" 553 00:46:01,780 --> 00:46:04,900 Joten miten me tiedämme, että on mahdotonta? 554 00:46:04,900 --> 00:46:08,850 [Äänetön opiskelija vastausta] >> Joo. 555 00:46:08,850 --> 00:46:13,710 Ainakin, sinun täytyy kosketa toisiaan alkio, 556 00:46:13,710 --> 00:46:16,210 joten on mahdotonta lajitella joukko - 557 00:46:16,210 --> 00:46:20,850 Jos kaikki on lajittelemattoman järjestyksessä, sitten olet menossa on koskettaa kaiken array, 558 00:46:20,850 --> 00:46:25,320 joten on mahdotonta tehdä se alle O n. 559 00:46:27,430 --> 00:46:30,340 [Opiskelija] Näytit meille, että esimerkiksi pysty tekemään sitä O n 560 00:46:30,340 --> 00:46:33,920 Jos käytät paljon muistia. >> Joo. 561 00:46:33,920 --> 00:46:37,970 Ja that's - Unohdan mitä that's - Onko se laskee tavallaan? 562 00:46:47,360 --> 00:46:51,330 Hmm. , Joka on kokonaisluvun lajittelu algoritmi. 563 00:46:59,850 --> 00:47:05,100 Etsin erityistä nimeä tälle, että en voinut muistaa viime viikolla. 564 00:47:05,100 --> 00:47:13,000 Joo. Nämä ovat eri lajittelee, jotka voivat toteuttaa asioita iso O n. 565 00:47:13,000 --> 00:47:18,430 Mutta on olemassa rajoituksia, kuten voit käyttää vain kokonaislukuja asti tietty määrä. 566 00:47:20,870 --> 00:47:24,560 Plus jos yrität lajitella jotain that's - 567 00:47:24,560 --> 00:47:30,750 Jos matriisi on 012, -12, 151, 4 miljoonaa euroa, 568 00:47:30,750 --> 00:47:35,120 Silloin yksittäinen elementti on menossa täysin pilata koko lajittelun. 569 00:47:42,060 --> 00:47:44,030 >> Kysymyksiä? 570 00:47:49,480 --> 00:47:58,870 [Opiskelija] Jos sinulla on rekursiivinen funktio, ja se vain tekee rekursiivinen puhelut 571 00:47:58,870 --> 00:48:02,230 sisällä return, että hännästä rekursiivinen 572 00:48:02,230 --> 00:48:07,360 ja niin se että saa käyttää enemmän muistia ajon aikana 573 00:48:07,360 --> 00:48:12,550 tai se ainakin käyttää vertailukelpoisia muistia kuin iteratiivinen ratkaisu? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Kyllä. 575 00:48:14,530 --> 00:48:19,840 Olisi todennäköisesti hieman hitaampi, mutta ei oikeastaan. 576 00:48:19,840 --> 00:48:23,290 Tail rekursiivinen on melko hyvä. 577 00:48:23,290 --> 00:48:32,640 Tarkasteltaessa jälleen pino kehyksiä, sanotaan meillä on pääasiallinen 578 00:48:32,640 --> 00:48:42,920 ja meillä on int bar (int x) tai jotain. 579 00:48:42,920 --> 00:48:52,310 Tämä ei ole täydellinen rekursiivinen funktio, mutta paluu bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Eli ilmeisesti tämä on virheellinen. Tarvitset pohja tapauksia ja juttuja. 581 00:48:57,620 --> 00:49:00,360 Mutta ajatus tässä on, että tämä on häntä rekursiivinen, 582 00:49:00,360 --> 00:49:06,020 mikä tarkoittaa kun tärkeimmät puhelut baarissa se tulee saamaan sen pinokehys. 583 00:49:09,550 --> 00:49:12,440 Tässä pinokehys siellä tulee olemaan hieman lohko muistia 584 00:49:12,440 --> 00:49:17,490 joka vastaa sen väitettä x. 585 00:49:17,490 --> 00:49:25,840 Ja niin sanokaamme tärkein sattuu soittamaan bar (100); 586 00:49:25,840 --> 00:49:30,050 Joten x aikoo aloittaa ulos 100. 587 00:49:30,050 --> 00:49:35,660 Jos kääntäjä myöntää, että tämä on häntä rekursiivinen funktio, 588 00:49:35,660 --> 00:49:38,540 Sitten kun palkki tekee rekursiivinen kutsu bar, 589 00:49:38,540 --> 00:49:45,490 sen sijaan, että uusi pino runko, joka on kun pino alkaa kasvaa suureksi, 590 00:49:45,490 --> 00:49:48,220 lopulta se valuu kasaan ja sitten saat segfaults 591 00:49:48,220 --> 00:49:51,590 koska muisti alkaa törmätä. 592 00:49:51,590 --> 00:49:54,830 >> Joten sen sijaan tehdä oma pino runko, se voi toteuttaa, 593 00:49:54,830 --> 00:49:59,080 Hei, en koskaan tarvitse palata tähän pinokehys, 594 00:49:59,080 --> 00:50:08,040 joten sen sijaan Otan vain korvata tämän väitteen kanssa 99 ja aloita baarin ympäri. 595 00:50:08,040 --> 00:50:11,810 Ja sitten se tekee sen uudelleen ja se saavuttaa tuotto bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 ja sen sijaan tehdä uuden pinon kehys, se vain korvaa nykyisen väitteen kanssa 98 597 00:50:17,320 --> 00:50:20,740 ja sitten hypätä takaisin alusta bar. 598 00:50:23,860 --> 00:50:30,430 Näihin toimiin, korvattiin 1 arvon pinoon ja hyppää takaisin alkuun, 599 00:50:30,430 --> 00:50:32,430 ovat melko tehokkaita. 600 00:50:32,430 --> 00:50:41,500 Joten ei vain tämä sama muistin käyttö erillisenä toimintona, joka on iteratiivinen 601 00:50:41,500 --> 00:50:45,390 koska olet vain käyttämällä 1 pinokehys, mutta et ole kärsimystä varjopuolia 602 00:50:45,390 --> 00:50:47,240 ottaa soittaa toimintoja. 603 00:50:47,240 --> 00:50:50,240 Soittaminen toiminnot voivat olla hieman kallis, koska se on tekemistä kaiken tämän setup 604 00:50:50,240 --> 00:50:52,470 ja purkamisen ja kaikki tätä kamaa. 605 00:50:52,470 --> 00:50:58,160 Joten tämä häntä rekursion on hyvä. 606 00:50:58,160 --> 00:51:01,170 [Opiskelija] Miksi se ei luo uusia askelia? 607 00:51:01,170 --> 00:51:02,980 Koska se ymmärtää, se ei tarvitse. 608 00:51:02,980 --> 00:51:07,800 Kutsu baari on juuri palaamassa rekursiivinen puhelun. 609 00:51:07,800 --> 00:51:12,220 Joten se ei tarvitse tehdä mitään paluuarvon. 610 00:51:12,220 --> 00:51:15,120 Se vain tulee heti palauttaa sitä. 611 00:51:15,120 --> 00:51:20,530 Joten se vain tulee korvata oman lausumansa ja aloittaa alusta. 612 00:51:20,530 --> 00:51:25,780 Ja myös, jos sinulla ei ole häntää rekursiivinen versio, 613 00:51:25,780 --> 00:51:31,460 niin saat kaikki nämä baareja, joissa kun tämä palkki palaa 614 00:51:31,460 --> 00:51:36,010 sen on palautettava sen arvo tämän yhden, niin että tanko välittömästi palauttaa 615 00:51:36,010 --> 00:51:39,620 ja se palaa sen arvo tämän yhden, niin se vain menee välittömästi palata 616 00:51:39,620 --> 00:51:41,350 ja palauttaa sen arvon tähän. 617 00:51:41,350 --> 00:51:45,350 Joten olet tallentanut tämän popping kaikki nämä asiat pois pinosta 618 00:51:45,350 --> 00:51:48,730 koska paluuarvo on juuri menossa välitetään aina takaisin ylös muutenkin. 619 00:51:48,730 --> 00:51:55,400 Joten miksi ei vain korvata meidän väitteen kanssa päivitetyt väitteen ja aloittaa alusta? 620 00:51:57,460 --> 00:52:01,150 Jos toiminto ei ole häntää rekursiivinen, jos teet jotain - 621 00:52:01,150 --> 00:52:07,530 [Opiskelija] jos bar (x + 1). >> Joo. 622 00:52:07,530 --> 00:52:11,770 >> Joten jos laitat sen kunnossa, niin teet jotain tuottoarvo. 623 00:52:11,770 --> 00:52:16,260 Tai vaikka vain tehdä paluu 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Joten nyt bar (x - 1) tarvitsee palauttaa, jotta se voisi laskea 2 kertaa, että arvo, 625 00:52:23,560 --> 00:52:26,140 joten nyt se tarvitsee oman erillisen pinokehys, 626 00:52:26,140 --> 00:52:31,180 ja nyt, ei väliä kuinka kovaa yrität, olet menossa tarvitse - 627 00:52:31,180 --> 00:52:34,410 Tämä ei ole häntää rekursiivinen. 628 00:52:34,410 --> 00:52:37,590 [Opiskelija] Olisiko yritän tuoda rekursion pyrkiä hännän rekursion - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Ihanteellisessa maailmassa, mutta CS50 sinun ei tarvitse. 630 00:52:43,780 --> 00:52:49,280 Saadakseen hännän rekursio, yleensä asetat lisäperustelun 631 00:52:49,280 --> 00:52:53,550 jossa palkki ottaa int x huomioon y 632 00:52:53,550 --> 00:52:56,990 ja y vastaa perimmäinen asia, jonka haluat palauttaa. 633 00:52:56,990 --> 00:53:03,650 Joten tämä aiot olla palaamassa bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Joten se on vain korkean tason miten muuttaa asioita olla häntää rekursiivinen. 635 00:53:09,810 --> 00:53:13,790 Mutta ylimääräinen argumentti - 636 00:53:13,790 --> 00:53:17,410 Ja sitten lopulta kun olet saavuttanut pohjan tapauksessa juuri palata y 637 00:53:17,410 --> 00:53:22,740 koska olet ollut kertynyt koko ajan paluuta haluamasi arvo. 638 00:53:22,740 --> 00:53:27,280 Olet tavallaan ovat tehneet sitä iteratiivisesti mutta käyttäen rekursiivinen puhelut. 639 00:53:32,510 --> 00:53:34,900 Kysymyksiä? 640 00:53:34,900 --> 00:53:39,890 [Opiskelija] Ehkä noin osoitin aritmeettinen, kuten käytettäessä merkkijonoja. >> Toki. 641 00:53:39,890 --> 00:53:43,610 Pointer aritmeettinen. 642 00:53:43,610 --> 00:53:48,440 Käytettäessä jouset on helppoa, koska jouset ovat char tähdet, 643 00:53:48,440 --> 00:53:51,860 merkkiä ovat ikuisesti ja aina yhden tavun, 644 00:53:51,860 --> 00:53:57,540 ja näin osoitin aritmeettinen vastaa säännöllistä aritmeettinen kun olet tekemisissä jouset. 645 00:53:57,540 --> 00:54:08,790 Sanotaan vain char * s = "Hello". 646 00:54:08,790 --> 00:54:11,430 Joten meillä on lohkon muistiin. 647 00:54:19,490 --> 00:54:22,380 Se tarvitsee 6 tavua, koska aina on null terminaattori. 648 00:54:22,380 --> 00:54:28,620 Ja char * s on menossa osoittamaan alussa array. 649 00:54:28,620 --> 00:54:32,830 Joten S-pisteitä siellä. 650 00:54:32,830 --> 00:54:36,710 Nyt, tämä on periaatteessa miten tahansa array toimii, 651 00:54:36,710 --> 00:54:40,780 riippumatta siitä, onko se tuottoa malloc vai onko se pinoon. 652 00:54:40,780 --> 00:54:47,110 Mikä tahansa matriisi on periaatteessa osoitin alkua array, 653 00:54:47,110 --> 00:54:53,640 ja sitten kaikki array toimintaa, mahdolliset indeksointi, on juuri menossa tuohon array tietty offset. 654 00:54:53,640 --> 00:55:05,360 >> Joten kun sanon jotain s [3], tämä tulee s ja laskenta 3 merkkiä tuumaa 655 00:55:05,360 --> 00:55:12,490 Joten s [3], meillä on 0, 1, 2, 3, joten s [3] tulee viitata tähän l. 656 00:55:12,490 --> 00:55:20,460 [Opiskelija] Ja voisimme saavuttaa sama arvo tekemällä s + 3 ja sulkeet tähti? 657 00:55:20,460 --> 00:55:22,570 Kyllä. 658 00:55:22,570 --> 00:55:26,010 Tämä vastaa * (s + 3); 659 00:55:26,010 --> 00:55:31,240 ja se on ikuisesti ja aina vastaa mitään väliä mitä teet. 660 00:55:31,240 --> 00:55:34,070 Sinun ei koskaan tarvitse käyttää kannattimen syntaksia. 661 00:55:34,070 --> 00:55:37,770 Voit aina käyttää * (s + 3) syntaksi. 662 00:55:37,770 --> 00:55:40,180 Ihmiset yleensä haluavat teline syntaksia, vaikka. 663 00:55:40,180 --> 00:55:43,860 [Opiskelija] Joten kaikki ryhmät ovat oikeastaan ​​vain viitteitä. 664 00:55:43,860 --> 00:55:53,630 On hieman eroa, kun sanon int x [4]; >> [opiskelija] Onko jotka luovat muisti? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Tämä tulee luomaan 4 ints pinoon, joten 16 tavua yleistä. 666 00:56:03,320 --> 00:56:05,700 Se tulee luomaan 16 tavua pinoon. 667 00:56:05,700 --> 00:56:09,190 x ei tallenneta mihinkään. 668 00:56:09,190 --> 00:56:13,420 Se on vain symboli viittaa alkua asia. 669 00:56:13,420 --> 00:56:17,680 Koska olet ilmoittanut joukko sisällä tätä toimintoa, 670 00:56:17,680 --> 00:56:22,340 mitä kääntäjä aikoo tehdä, on vain korvata kaikki esiintymät muuttujan x 671 00:56:22,340 --> 00:56:26,400 kanssa, jossa se tapahtui valita laittaa nämä 16 tavua. 672 00:56:26,400 --> 00:56:30,040 Se ei voi tehdä, että char * s, koska s on todellinen osoitin. 673 00:56:30,040 --> 00:56:32,380 Se on ilmaista valitse sitten muita asioita. 674 00:56:32,380 --> 00:56:36,140 x on vakio. Et voi olla se osoita eri joukko. >> [Opiskelija] Okei. 675 00:56:36,140 --> 00:56:43,420 Mutta tämä ajatus, tämä indeksointi on sama riippumatta siitä, onko se perinteinen array 676 00:56:43,420 --> 00:56:48,230 tai jos se osoittimen jotain tai jos se osoittimen malloced array. 677 00:56:48,230 --> 00:56:59,770 Ja itse asiassa se on niin vastaavaa että on myös sama asia. 678 00:56:59,770 --> 00:57:05,440 Se oikeastaan ​​vain kääntää mitä sisällä suluissa ja mitä on jäljellä suluissa, 679 00:57:05,440 --> 00:57:07,970 lisää ne yhteen, ja dereferences. 680 00:57:07,970 --> 00:57:14,710 Joten tämä on vain yhtä pätevä kuin * (s + 3) tai s [3]. 681 00:57:16,210 --> 00:57:22,090 [Opiskelija] Voitko olla osoittimia osoittaen 2-ulotteinen taulukot? 682 00:57:22,090 --> 00:57:27,380 >> Se on vaikeampaa. Perinteisesti ei ole. 683 00:57:27,380 --> 00:57:34,720 2-ulotteinen taulukko on vain 1-ulotteinen taulukko joidenkin kätevä syntaksi 684 00:57:34,720 --> 00:57:54,110 koska kun sanon int x [3] [3], se on vain 1 array 9 arvoa. 685 00:57:55,500 --> 00:58:03,000 Ja niin kun indeksi, kääntäjä tietää mitä tarkoitan. 686 00:58:03,000 --> 00:58:13,090 Jos sanon x [1] [2], se tietää haluan mennä toiseen riviin, joten se tulee ohittaa ensimmäisen 3, 687 00:58:13,090 --> 00:58:17,460 ja sitten se haluaa toinen asia on, että niin se tulee saada tämä. 688 00:58:17,460 --> 00:58:20,480 Mutta se on edelleen vain yksi-ulotteinen taulukko. 689 00:58:20,480 --> 00:58:23,660 Ja niin jos halusin antaa osoitin että array, 690 00:58:23,660 --> 00:58:29,770 Sanoisin int * p = x; 691 00:58:29,770 --> 00:58:33,220 Tyyppi x on vain - 692 00:58:33,220 --> 00:58:38,280 Se on karkea sanonta tyyppi x koska se on vain symboli ja se ei ole todellinen muuttuja, 693 00:58:38,280 --> 00:58:40,140 mutta se on vain int *. 694 00:58:40,140 --> 00:58:44,840 x on vain osoitin alusta tämän. >> [Opiskelija] Okei. 695 00:58:44,840 --> 00:58:52,560 Joten en voi käyttää [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Mielestäni on erityinen syntaksi julistamista osoitin, 697 00:58:58,370 --> 00:59:12,480 jotain naurettavaa kuten int (* p [- jotain täysin naurettavaa. en edes tiedä. 698 00:59:12,480 --> 00:59:17,090 Mutta on syntaksi julistamisesta viitteitä esimerkiksi sulkujen kanssa ja asioita. 699 00:59:17,090 --> 00:59:22,960 Se ei välttämättä edes anna sinun tehdä sitä. 700 00:59:22,960 --> 00:59:26,640 Voisin katsoa taaksepäin jotain, joka kertoisi minulle totuuden. 701 00:59:26,640 --> 00:59:34,160 Aion etsiä sen myöhemmin, jos on syntaksi pisteen. Mutta et koskaan näe sitä. 702 00:59:34,160 --> 00:59:39,670 Ja vaikka syntaksi on niin vanhanaikaista, että jos käytät sitä, ihmiset on hämmentynyt. 703 00:59:39,670 --> 00:59:43,540 Moniulotteinen paneelit ovat melko harvinaisia, koska se on. 704 00:59:43,540 --> 00:59:44,630 Voit melko paljon - 705 00:59:44,630 --> 00:59:48,490 No, jos teet matriisi asioita se ei tule olemaan harvinaisia, 706 00:59:48,490 --> 00:59:56,730 mutta C et harvoin tulee käyttää moniulotteisia taulukoita. 707 00:59:57,630 --> 01:00:00,470 Joo. >> [Opiskelijan] Sanotaan sinulla on todella pitkä array. 708 01:00:00,470 --> 01:00:03,900 >> Joten virtuaalimuistin näyttäisi olevan kaikki peräkkäin, 709 01:00:03,900 --> 01:00:05,640 kuten elementit vieressä toisiinsa, 710 01:00:05,640 --> 01:00:08,770 mutta fyysisen muistin, olisiko mahdollista, että voidaan jakaa? >> Kyllä. 711 01:00:08,770 --> 01:00:16,860 Miten virtuaalinen muisti toimii on se vain erottaa - 712 01:00:19,220 --> 01:00:24,860 Yksikkö jako on sivu, joka on yleensä 4 kilotavua, 713 01:00:24,860 --> 01:00:29,680 ja niin kun prosessi sanoo hei, haluan käyttää tätä muistia, 714 01:00:29,680 --> 01:00:35,970 käyttöjärjestelmä on menossa jaettava 4 kilotavua että pieni lohko muistia. 715 01:00:35,970 --> 01:00:39,100 Vaikka käytät vain yhtä vähän tavun koko korttelin muistia, 716 01:00:39,100 --> 01:00:42,850 käyttöjärjestelmä on menossa antaa sille täyden 4 kilotavua. 717 01:00:42,850 --> 01:00:49,410 Joten mitä tämä tarkoittaa on, että voisin olla - sanokaamme tämä on minun pino. 718 01:00:49,410 --> 01:00:53,180 Tämä pino voidaan erottaa. Oma pino voisi olla megatavua ja megatavua. 719 01:00:53,180 --> 01:00:55,020 Oma pino voisi olla valtava. 720 01:00:55,020 --> 01:01:00,220 Mutta pino on itse jakaa yksittäisiä sivuja, 721 01:01:00,220 --> 01:01:09,010 jotka, jos katsomme tänne sanokaamme tämä on meidän RAM, 722 01:01:09,010 --> 01:01:16,600 jos minulla on 2 gigatavua RAM-muistia, tämä on todellinen osoite 0 like nollas tavu minun RAM, 723 01:01:16,600 --> 01:01:22,210 ja tämä on 2 gigatavua kaikki alas tästä. 724 01:01:22,210 --> 01:01:27,230 Joten tämä sivu voisi vastata tähän lohkoon tänne. 725 01:01:27,230 --> 01:01:29,400 Tämä sivu voi vastata tähän lohkoon tänne. 726 01:01:29,400 --> 01:01:31,560 Tämä voi vastata tämä tänne. 727 01:01:31,560 --> 01:01:35,540 Joten käyttöjärjestelmä on ilmainen määrittää fyysistä muistia 728 01:01:35,540 --> 01:01:39,320 millekään yksittäiselle sivulle mielivaltaisesti. 729 01:01:39,320 --> 01:01:46,180 Ja se tarkoittaa, että jos tämä raja tapahtuu ulottuvat array, 730 01:01:46,180 --> 01:01:50,070 array sattuu jättää tämän ja oikeus tämän määräyksen sivusta, 731 01:01:50,070 --> 01:01:54,460 sitten, että matriisi tulee olemaan lopettivat fyysistä muistia. 732 01:01:54,460 --> 01:01:59,280 Ja sitten kun lopetat ohjelman, kun prosessi päättyy, 733 01:01:59,280 --> 01:02:05,690 Nämä kuvaukset saavat poistetaan ja sitten se on ilmainen käyttää näitä pikku lohkoja muita asioita. 734 01:02:14,730 --> 01:02:17,410 Lisää kysymyksiä? 735 01:02:17,410 --> 01:02:19,960 [Opiskelija] osoitin aritmeettinen. >> Ai joo. 736 01:02:19,960 --> 01:02:28,410 Jouset oli helpompi, mutta katsot jotain ints, 737 01:02:28,410 --> 01:02:35,000 Joten takaisin int x [4]; 738 01:02:35,000 --> 01:02:41,810 Onko tämä matriisi tai onko se osoittimen malloced joukko 4 kokonaislukuja, 739 01:02:41,810 --> 01:02:47,060 se tulee kohdella samalla tavalla. 740 01:02:50,590 --> 01:02:53,340 [Opiskelija] Joten paneelit ovat kasaan? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Arrays eivät kasaan. >> [Opiskelija] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Tämän tyyppinen array taipumus olla pinoon 743 01:03:08,320 --> 01:03:12,220 ellet julisti sitä - piittaamatta globaaleja muuttujia. Älä käytä globaaleja muuttujia. 744 01:03:12,220 --> 01:03:16,280 Sisältä funktion sanon int x [4]; 745 01:03:16,280 --> 01:03:22,520 Se tulee luoda 4-kokonaisluku lohko pinoon tämän array. 746 01:03:22,520 --> 01:03:26,960 Mutta tämä malloc (4 * sizeof (int)); aikoo mennä kasaan. 747 01:03:26,960 --> 01:03:31,870 Mutta kun tässä vaiheessa voin käyttää x ja p melko paljon samalla tavoin, 748 01:03:31,870 --> 01:03:36,140 muu kuin poikkeuksia sanoin sinusta voi siirtää s.. 749 01:03:36,140 --> 01:03:40,960 Teknisesti niiden koot ovat hieman erilaisia, mutta se on täysin merkityksetön. 750 01:03:40,960 --> 01:03:43,310 Et koskaan todella käyttää niiden kokoa. 751 01:03:48,020 --> 01:03:56,810 P Voisin sanoa s. [3] = 2 tai x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Voit käyttää niitä täsmälleen samalla tavalla. 753 01:03:59,680 --> 01:04:01,570 Joten osoitin aritmeettinen nyt - Kyllä. 754 01:04:01,570 --> 01:04:07,390 [Opiskelija] Ettekö tarvitse tehdä p * jos sinulla on suluissa? 755 01:04:07,390 --> 01:04:11,720 Suluissa ovat implisiittisiä dereference. >> Okei. 756 01:04:11,720 --> 01:04:20,200 Oikeastaan ​​myös mitä sanot kanssa voit saada moniulotteinen array 757 01:04:20,200 --> 01:05:02,650 osoittimet, mitä voit tehdä, on jotain, sanokaamme, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Minä vain kirjoitan sen kaiken ensin. 759 01:05:37,880 --> 01:05:41,020 En halua, että yksi. 760 01:05:41,020 --> 01:05:42,550 Okei. 761 01:05:42,550 --> 01:05:48,910 Mitä tein tässä - Sen pitäisi olla yks [i]. 762 01:05:48,910 --> 01:05:53,680 Joten pp on osoitin osoitin. 763 01:05:53,680 --> 01:06:02,420 Olet mallocing PP viitata joukko 5 int tähteä. 764 01:06:02,420 --> 01:06:10,950 Joten muistiin sinulla on pino s. 765 01:06:10,950 --> 01:06:20,150 Se tulee osoittamaan joukko 5 korttelin jotka ovat kaikki itse osoittimia. 766 01:06:20,150 --> 01:06:28,210 Ja sitten kun minä malloc tänne, olen malloc että kunkin yksittäisen osoittimia 767 01:06:28,210 --> 01:06:32,080 tulisi osoittaa erillinen lohko 4 tavua kasaan. 768 01:06:32,080 --> 01:06:35,870 Joten tämä viittaa 4 tavua. 769 01:06:37,940 --> 01:06:40,660 Ja tämä viittaa eri 4 tavua. 770 01:06:40,660 --> 01:06:43,200 >> Ja ne kaikki osoittavat oman 4 tavua. 771 01:06:43,200 --> 01:06:49,080 Tämä antaa minulle tapa tehdä moniulotteisen asioita. 772 01:06:49,080 --> 01:06:58,030 Voisin sanoa pp [3] [4], mutta nyt tämä ei ole sama asia kuin moniulotteinen array 773 01:06:58,030 --> 01:07:05,390 koska moniulotteinen array se käännetty [3] [4] yhdeksi poikkeaman x array. 774 01:07:05,390 --> 01:07:14,790 Tämän dereferences p, pääsee kolmannen indeksin, sitten dereferences että 775 01:07:14,790 --> 01:07:20,790 ja sisäänkäyntien - 4 olisi pätemätön - toinen indeksi. 776 01:07:24,770 --> 01:07:31,430 Taas kun meillä oli int x [3] [4] ennen kuin moniulotteinen array 777 01:07:31,430 --> 01:07:35,740 ja kun kaksinkertainen kiinnike se oikeastaan ​​vain yhden dereference, 778 01:07:35,740 --> 01:07:40,490 olet kerta-osoittimen ja sitten offset, 779 01:07:40,490 --> 01:07:42,850 Tämä on todella 2D viittauksia. 780 01:07:42,850 --> 01:07:45,840 Seuraat 2 erillistä osoittimia. 781 01:07:45,840 --> 01:07:50,420 Joten tämä myös teknisesti voit olla moniulotteinen paneelit 782 01:07:50,420 --> 01:07:53,550 jossa kukin ryhmä on eri kokoja. 783 01:07:53,550 --> 01:07:58,000 Joten mielestäni rosoiset moniulotteinen array on mitä se on nimeltään 784 01:07:58,000 --> 01:08:01,870 koska oikeastaan ​​ensimmäinen asia voisi viitata jotain, joka on 10 elementtiä, 785 01:08:01,870 --> 01:08:05,540 toinen asia voisi viitata jotain, joka on 100 alkiota. 786 01:08:05,540 --> 01:08:10,790 [Opiskelija] Onko mitään rajaa määrä viitteitä voi olla 787 01:08:10,790 --> 01:08:14,290 osoittaen muita viitteitä? >> No 788 01:08:14,290 --> 01:08:17,010 Sinulla voi olla int ***** s.. 789 01:08:18,050 --> 01:08:23,760 Takaisin osoitin aritmeettinen - >> [opiskelija] Oh. >> Joo. 790 01:08:23,760 --> 01:08:35,649 [Opiskelija] Jos minulla on int *** p ja sitten teen dereferencing ja sanon p * on sama kuin tämä arvo, 791 01:08:35,649 --> 01:08:39,560 on se vain aikoo tehdä 1 tason dereferencing? >> Kyllä. 792 01:08:39,560 --> 01:08:43,340 Joten jos haluan päästä asia viimeinen osoitin on suunnattu - 793 01:08:43,340 --> 01:08:46,210 Sitten teet *** s.. >> Okei. 794 01:08:46,210 --> 01:08:54,080 Joten tämä on p pistettä 1 lohko, kohdat toiseen lohkoon, viittaa toiseen lohkoon. 795 01:08:54,080 --> 01:09:02,010 Sitten jos et * p = jotain muuta, niin muutat tätä 796 01:09:02,010 --> 01:09:13,640 nyt olevan eri lohkoon. >> Okei. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] ja jos ne eivät malloced, niin olet nyt vuotanut muistia 798 01:09:17,649 --> 01:09:20,430 jos sinulla sattuu olemaan eri viittaukset kyseisiin 799 01:09:20,430 --> 01:09:25,270 koska et voi saada takaisin nuo äsken heitti pois. 800 01:09:25,270 --> 01:09:29,550 Pointer aritmeettinen. 801 01:09:29,550 --> 01:09:36,310 int x [4], on menossa kohdentaa joukko 4 kokonaislukujen 802 01:09:36,310 --> 01:09:40,670 jossa x on menossa osoittamaan alkua jono. 803 01:09:40,670 --> 01:09:50,420 Joten kun sanon jotain x [1], haluan sen tarkoittavan mennä toisen kokonaisluvun array, 804 01:09:50,420 --> 01:09:53,319 mikä olisi tämä. 805 01:09:53,319 --> 01:10:04,190 Mutta oikeasti, se on 4 tavua osaksi array koska kokonaisluku vie 4 tavua. 806 01:10:04,190 --> 01:10:08,470 Joten offset on 1 todella tarkoittaa offset 1 807 01:10:08,470 --> 01:10:12,030 kertaa koko lajista riippumatta joukko on. 808 01:10:12,030 --> 01:10:17,170 Tämä on matriisi kokonaislukuja, niin se tietää, tehdä 1 kertaa koko int, kun se haluaa korvata. 809 01:10:17,170 --> 01:10:25,260 Muiden syntaksi. Muista, että tämä on sama kuin * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kun sanon osoitin + 1, mikä se palaa on osoite osoitin on varastointi 811 01:10:35,250 --> 01:10:40,360 plus 1 kertaa koko tyypin osoittimen. 812 01:10:40,360 --> 01:10:59,510 Joten jos x = ox100, niin x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Ja voit väärin tämän ja sanoa jotain char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 ja nyt c tulee olemaan sama osoite kuin x. 815 01:11:23,050 --> 01:11:26,040 c tulee olemaan yhtä suuri kuin ox100, 816 01:11:26,040 --> 01:11:31,490 mutta c + 1 tulee olemaan yhtä suuri kuin ox101 817 01:11:31,490 --> 01:11:38,030 koska osoitin aritmeettinen riippuu osoittimen että lisäät sen. 818 01:11:38,030 --> 01:11:45,390 Joten C + 1, se katsoo C, se char osoitin, joten se tulee lisätä 1 kertaa koko char, 819 01:11:45,390 --> 01:11:48,110 joka on aina olemaan 1, niin saat 101, 820 01:11:48,110 --> 01:11:54,890 ottaa huomioon, että jos teen x, joka on myös edelleen 100, x + 1 tulee olemaan 104. 821 01:11:56,660 --> 01:12:06,340 [Opiskelija] Voitko käyttää C + + edistääkseen osoittimen mukaan 1? 822 01:12:06,340 --> 01:12:09,810 Kyllä voit. 823 01:12:09,810 --> 01:12:16,180 Et voi tehdä, että x koska x on vain symboli, se on vakio, et voi muuttaa x. 824 01:12:16,180 --> 01:12:22,610 >> Mutta C sattuu vain olemaan osoitin, joten C + + on täysin pätevä ja se suurenevat 1. 825 01:12:22,610 --> 01:12:32,440 Jos C olivat vain int *, niin c + + olisi 104. 826 01:12:32,440 --> 01:12:41,250 + + Ei osoitin aritmeettinen kuten C + 1 olisi tehnyt osoitin aritmeettinen. 827 01:12:43,000 --> 01:12:48,870 Tämä on oikeastaan ​​kuinka paljon asioita, kuten merge sort - 828 01:12:49,670 --> 01:12:55,710 Luomisen sijasta kopioita asioita, voit sen sijaan kulkea - 829 01:12:55,710 --> 01:13:02,400 Kuten jos halusin välittää puolet array - Mennään poistaa joitakin tämän. 830 01:13:04,770 --> 01:13:10,520 Sanotaan Halusin välittää tämän puolen array osaksi toimintoa. 831 01:13:10,520 --> 01:13:12,700 Mitä kuljen tuon toiminnan? 832 01:13:12,700 --> 01:13:17,050 Jos kuljen x, olen ohimennen tähän osoitteeseen. 833 01:13:17,050 --> 01:13:23,780 Mutta haluan välittää tietty osoite. Joten mitä minun pitäisi välittää? 834 01:13:23,780 --> 01:13:26,590 [Opiskelija] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] So x + 2. Kyllä. 836 01:13:29,350 --> 01:13:31,620 Tämä tulee olemaan tähän osoitteeseen. 837 01:13:31,620 --> 01:13:42,810 Näet myös hyvin usein nähdä se x [2] ja sitten osoitteeksi. 838 01:13:42,810 --> 01:13:47,850 Joten sinun täytyy ottaa osoitteen, koska kiinnike on implisiittinen dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] viittaa arvoon, joka on tähän ruutuun ja haluat osoitteen että laatikko, 840 01:13:53,250 --> 01:13:56,850 niin sanot-x [2]. 841 01:13:56,850 --> 01:14:02,880 Niin, että miten jotain merge sort minne haluat siirtää puoli luettelon jotain 842 01:14:02,880 --> 01:14:08,790 te oikeastaan ​​vain kulkea ja x [2], ja nyt niin pitkälle kuin rekursiivinen puhelu tulee, 843 01:14:08,790 --> 01:14:12,510 my new Array alkaa siellä. 844 01:14:12,510 --> 01:14:15,130 Viime hetken kysymyksiä. 845 01:14:15,130 --> 01:14:20,050 [Opiskelija] Jos emme laita et-tai - mikä se nimi? >> Star? 846 01:14:20,050 --> 01:14:23,200 [Opiskelija] Star. >> Teknisesti dereference operaattori, mutta - >> [opiskelija] dereference. 847 01:14:23,200 --> 01:14:29,310 >> Jos emme laita tähti tai et-Mitä tapahtuu, jos olen vain sanoa y = x ja x on osoitin? 848 01:14:29,310 --> 01:14:34,620 Mikä on tyyppiä y? >> [Opiskelija] Otan vain sanoa sen osoitin 2. 849 01:14:34,620 --> 01:14:38,270 Joten jos vain sanoa y = x, nyt x ja y viittaavat sama asia. >> [Opiskelija] Pointin sama asia. 850 01:14:38,270 --> 01:14:45,180 Ja jos x on int osoitin? >> Se valittaa, koska et voi antaa viitteitä. 851 01:14:45,180 --> 01:14:46,540 [Opiskelija] Okei. 852 01:14:46,540 --> 01:14:51,860 Muista, että osoittimet, vaikka vedämme niitä nuolet, 853 01:14:51,860 --> 01:15:02,010 oikeastaan ​​kaikki ne myymälä - int * x - oikeastaan ​​kaikki x on varastointi on jotain ox100, 854 01:15:02,010 --> 01:15:06,490 jota tapahtuu edustaa viittaavat myös lohkon säilytettiin 100. 855 01:15:06,490 --> 01:15:19,660 Joten kun sanon int * y = x; olen vain kopioimalla ox100 osaksi y, 856 01:15:19,660 --> 01:15:24,630 jonka olemme juuri menossa edustamaan Y, myös osoittaa ox100. 857 01:15:24,630 --> 01:15:39,810 Ja jos sanon int i = (int) x; Sitten tulee säilyttää arvosta riippumatta ox100 on 858 01:15:39,810 --> 01:15:45,100 sen sisällä, mutta nyt se tulee tulkita kokonaisluku sijasta osoittimen. 859 01:15:45,100 --> 01:15:49,310 Mutta tarvitset valettu tai muuten se valittaa. 860 01:15:49,310 --> 01:15:53,300 [Opiskelija] Eli meinaat heittää - 861 01:15:53,300 --> 01:16:00,290 Onko se tulee olemaan valu int x tai valu int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Mitä? 863 01:16:03,700 --> 01:16:07,690 [Opiskelija] Okei. Kun nämä suluissa on siellä olemaan x tai AY siellä? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Joko. x ja y ovat vastaavat. >> [Opiskelija] Okei. 865 01:16:11,500 --> 01:16:14,390 Koska he molemmat osoittimia. >> Joo. 866 01:16:14,390 --> 01:16:21,050 [Opiskelija] Niin se tallentaa heksadesimaali 100 kokonaisluku muodossa? >> [Bowden] Joo. 867 01:16:21,050 --> 01:16:23,620 Mutta ei arvoa mitä se osoittaa. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Joo. >> [Opiskelija] Joten vain osoitteen kokonaisluku muodossa. Okei. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Jos halusi jostain outoa syystä, 870 01:16:34,720 --> 01:16:38,900 voisit yksinomaan käsitellä osoittimia ja koskaan käsitellä kokonaislukuja 871 01:16:38,900 --> 01:16:49,240 ja vain olla kuin int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Sitten olet menossa todella sekaisin, kun osoitin aritmeettinen alkaa tapahtua. 873 01:16:53,000 --> 01:16:56,570 Niin numerot ne tallentavat ovat merkityksettömiä. 874 01:16:56,570 --> 01:16:58,940 Se on vain siitä, miten voit päätyä tulkitsemalla niitä. 875 01:16:58,940 --> 01:17:02,920 Joten olen vapaa kopioida ox100 alkaen int * ja int- 876 01:17:02,920 --> 01:17:07,790 ja olen vapaa luovuttaa - artikkeli on sinua todennäköisesti menossa huusi, ettei valu - 877 01:17:07,790 --> 01:17:18,160 Olen vapaa määrittää jotain (int *) ox1234 tähän mielivaltainen int *. 878 01:17:18,160 --> 01:17:25,480 Joten ox123 on yhtä pätevä muistin osoitteen on & y. 879 01:17:25,480 --> 01:17:32,060 & Y tapahtuu palauttaa jotain, joka on melko ox123. 880 01:17:32,060 --> 01:17:35,430 [Opiskelija] Olisiko se todella rento tapa mennä heksadesimaalinen desimaalimuotoon, 881 01:17:35,430 --> 01:17:39,230 kuten jos sinulla on osoittimen ja heität sen int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Voit oikeastaan ​​vain tulostaa kuten printf. 883 01:17:44,860 --> 01:17:50,300 Sanotaan Minulla on int y = 100. 884 01:17:50,300 --> 01:18:02,700 Joten printf (% d \ n - kuten pitäisi jo tietää - tulosta, että kokonaisluku,% x. 885 01:18:02,700 --> 01:18:05,190 Me vain tulostaa sen heksadesimaali. 886 01:18:05,190 --> 01:18:10,760 Joten osoitin ei ole tallennettu heksadesimaali, 887 01:18:10,760 --> 01:18:12,960 ja kokonaisluku ei tallenneta desimaalin. 888 01:18:12,960 --> 01:18:14,700 Kaikkea tallennetaan binary. 889 01:18:14,700 --> 01:18:17,950 Se on vain, että meillä on taipumus näyttää viitteitä heksadesimaali 890 01:18:17,950 --> 01:18:23,260 koska ajattelemme asioita näissä 4-tavun lohkoja, 891 01:18:23,260 --> 01:18:25,390 ja muistin osoitteet yleensä tuttuja. 892 01:18:25,390 --> 01:18:28,890 Olemme kuin, jos se alkaa isännän kanssa, sitten se sattuu olemaan pinoon. 893 01:18:28,890 --> 01:18:35,560 Joten se on vain meidän tulkinta osoittimia heksadesimaali. 894 01:18:35,560 --> 01:18:39,200 Okei. Mahdolliset viime kysyttävää? 895 01:18:39,200 --> 01:18:41,700 >> Olen täällä hieman jälkeen, jos sinulla on jotain muuta. 896 01:18:41,700 --> 01:18:46,070 Ja se päätteeksi. 897 01:18:46,070 --> 01:18:48,360 >> [Opiskelija] Yay! [Aplodit] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]