1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [4. jagu - mugavam] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvardi Ülikool] 3 00:00:04,850 --> 00:00:07,370 [See on CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Meil on viktoriin homme, juhul kui te poisid ei tea seda. 5 00:00:14,810 --> 00:00:20,970 See on põhimõtteliselt kõike, mida võis näha klassi või oleks pidanud klassis. 6 00:00:20,970 --> 00:00:26,360 See sisaldab viiteid, kuigi nad on väga hiljutine teema. 7 00:00:26,360 --> 00:00:29,860 Sa peaksid vähemalt mõistavad kõrge neist. 8 00:00:29,860 --> 00:00:34,760 Midagi, mis oli läinud üle klassis sa peaksid mõistma, et viktoriini. 9 00:00:34,760 --> 00:00:37,320 Nii et kui teil on küsimusi nende kohta, võite paluda neil nüüd. 10 00:00:37,320 --> 00:00:43,280 Aga see saab olema väga üliõpilane juhitud istungil, kus te esitada küsimusi, 11 00:00:43,280 --> 00:00:45,060 nii et loodetavasti inimesed on küsimusi. 12 00:00:45,060 --> 00:00:48,020 Kas kellelgi on küsimusi? 13 00:00:49,770 --> 00:00:52,090 Jah. >> [Üliõpilane] Kas te lähete üle osuti jälle? 14 00:00:52,090 --> 00:00:54,350 Ma lähen üle suunanäitajaks. 15 00:00:54,350 --> 00:00:59,180 Kõik teie muutujate korral elada mälu, 16 00:00:59,180 --> 00:01:04,450 kuid tavaliselt sa ei muretse, et ja sa ütlesid x + 2 ja y + 3 17 00:01:04,450 --> 00:01:07,080 ja kompilaator aru saada, kus asjad elavad teile. 18 00:01:07,080 --> 00:01:12,990 Kui olete tegelevad suunanäitajaks, nüüd sa selgesõnaliselt kasutades nende mälu aadresse. 19 00:01:12,990 --> 00:01:19,800 Nii et ühe muutuja aitab ainult elada ühes aadress igal ajahetkel. 20 00:01:19,800 --> 00:01:24,040 Kui me tahame tunnistada osuti, mis tüüpi hakkab välja nägema? 21 00:01:24,040 --> 00:01:26,210 >> Ma tahan kuulutada osuti lk. Mis tüüpi välja näeb? 22 00:01:26,210 --> 00:01:33,530 [Üliõpilane] int * lk. >> Jah. Nii int * lk. 23 00:01:33,530 --> 00:01:38,030 Ja kuidas ma saan teha seda osutada x? >> [Üliõpilane] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Nii ampersand on sõna otseses mõttes nimetatakse aadress operaator. 25 00:01:45,300 --> 00:01:50,460 Nii et kui ma ütlen & x Läheb mälu aadress muutuja x. 26 00:01:50,460 --> 00:01:56,790 Nii et nüüd on mul pointer p ja kõikjal minu koodi saan kasutada * p 27 00:01:56,790 --> 00:02:02,960 või ma võiks kasutada x ja see on täpselt sama asi. 28 00:02:02,960 --> 00:02:09,520 (* P). Mis on selle teed? Mida see täht tähendab? 29 00:02:09,520 --> 00:02:13,120 [Üliõpilane] See tähendab väärtus selles punktis. >> Jah. 30 00:02:13,120 --> 00:02:17,590 Nii et kui me vaatame seda, see võib olla väga kasulik töötada välja skeemid 31 00:02:17,590 --> 00:02:22,230 kui see on väike kast mälu x, mis juhtub olema väärtus 4, 32 00:02:22,230 --> 00:02:25,980 siis on meil vähe kasti mälu p, 33 00:02:25,980 --> 00:02:31,590 ja nii p punktid x, nii et me joonistada noole p x. 34 00:02:31,590 --> 00:02:40,270 Nii et kui me ütleme, * p me ütleme minna kast, mis on p. 35 00:02:40,270 --> 00:02:46,480 Star on Järgige noolt ja siis mida iganes sa tahad, et kast seal. 36 00:02:46,480 --> 00:03:01,090 Nii et võin öelda * p = 7; ja mis läheb kasti, mis on x ja muutustele, mis kuni 7. 37 00:03:01,090 --> 00:03:13,540 Või ma võiks öelda, int z = * p * 2; See on segadusse ajav, sest see on täht, täht. 38 00:03:13,540 --> 00:03:19,230 Üks täht on viite mahavõtmine p, teine ​​täht on korrutades 2-ga. 39 00:03:19,230 --> 00:03:26,780 Teade ma oleks võinud sama hästi asendada * p x. 40 00:03:26,780 --> 00:03:29,430 Võite kasutada neid samal viisil. 41 00:03:29,430 --> 00:03:38,000 Ja siis hiljem saan lk punkt on täiesti uus asi. 42 00:03:38,000 --> 00:03:42,190 Võin vaid öelda, p = &z; 43 00:03:42,190 --> 00:03:44,940 Nii et nüüd p enam punkte x; osutab ta z. 44 00:03:44,940 --> 00:03:50,510 Ja iga kord, kui ma * p see on sama nagu teed z. 45 00:03:50,510 --> 00:03:56,170 Nii et kasulik asi on see, kui hakkame sattumist funktsioone. 46 00:03:56,170 --> 00:03:59,790 >> See on selline mõttetu kuulutada osuti, mis näitab, et midagi 47 00:03:59,790 --> 00:04:03,140 ja siis sa oled lihtsalt viite mahavõtmine see 48 00:04:03,140 --> 00:04:06,060 kui sa oleks võinud kasutada originaal muutuja alustada. 49 00:04:06,060 --> 00:04:18,190 Aga kui sa sattuda funktsioonid - nii oletame meil on mõned funktsiooni, int suva, 50 00:04:18,190 --> 00:04:32,810 mis võtab osuti ja lihtsalt ei * p = 6; 51 00:04:32,810 --> 00:04:39,990 Nagu me nägime enne koos swap, sa ei saa tõhus swap ja eraldi funktsioon 52 00:04:39,990 --> 00:04:45,180 poolt sõidame täisarvud, sest kõik C on alati möödub väärtus. 53 00:04:45,180 --> 00:04:48,360 Isegi kui sa möödaminnes suunanäitajaks sa möödub väärtus. 54 00:04:48,360 --> 00:04:51,940 See lihtsalt nii juhtub, et need väärtused on mälu aadresse. 55 00:04:51,940 --> 00:05:00,770 Nii et kui ma ütlen foo (p); Ma panen osuti sisse funktsioon foo 56 00:05:00,770 --> 00:05:03,910 ja siis suva teeb * p = 6; 57 00:05:03,910 --> 00:05:08,600 Nii seest, et funktsioon, * p on ikka võrdne x, 58 00:05:08,600 --> 00:05:12,720 aga ma ei saa kasutada x sees, et funktsioon, kuna see ei ole scoped jooksul seda funktsiooni. 59 00:05:12,720 --> 00:05:19,510 Nii * p = 6 on ainus viis võin juurdepääs kohaliku muutuja teise funktsiooni. 60 00:05:19,510 --> 00:05:23,600 Või, noh, osuti on ainus viis võin juurdepääs kohaliku muutuja teise funktsiooni. 61 00:05:23,600 --> 00:05:31,600 [Üliõpilane] Oletame, et sa tahad tagasi pointer. Kuidas täpselt sa seda tegid? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Tagasi osuti nagu midagi int y = 3; tagastamine & y? >> [Üliõpilane] Jah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okei. Te ei tohiks kunagi teha. See on halb. 64 00:05:48,480 --> 00:05:59,480 Ma arvan, et ma nägin neid loeng slaidid sa hakkasid nägema kogu see skeem mälu 65 00:05:59,480 --> 00:06:02,880 kus siin sul mälu aadress 0 66 00:06:02,880 --> 00:06:09,550 ja siin all teil on mälu aadress 4 kontserti või 2 32. 67 00:06:09,550 --> 00:06:15,120 Siis sul on mõned asjad ja mõned asjad ja siis sa pead oma korstnat 68 00:06:15,120 --> 00:06:21,780 ja sul on oma hunnik, mis sa just alustanud õppida, kasvab. 69 00:06:21,780 --> 00:06:24,390 [Üliõpilane] ei ole hunnik eespool korstnat? 70 00:06:24,390 --> 00:06:27,760 >> Jah. Hunnik on peal, kas pole? >> [Üliõpilane] Noh, ta pani 0 peal. 71 00:06:27,760 --> 00:06:30,320 [Üliõpilane] Oh, ta pani 0 peal. >> [Üliõpilane] Oh, okei. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: kusagil CS50 sa lähed, et näha selle nii. >> [Üliõpilane] Okei. 73 00:06:36,060 --> 00:06:40,290 See on lihtsalt, et kui sa oled esimene nägemine korstnad, 74 00:06:40,290 --> 00:06:45,000 meeldib, kui te arvate korstnat te arvate virnastamine asjad peal üksteist. 75 00:06:45,000 --> 00:06:50,810 Nii et meil on kombeks klapp selle ümber nii korstna kasvab nagu pinu tavaliselt, 76 00:06:50,810 --> 00:06:55,940 asemel virna ripub alla. >> [Üliõpilane] Ärge hunnikutes tehniliselt kasvada liiga, kuigi? 77 00:06:55,940 --> 00:07:01,100 See sõltub sellest, mida te mõtlete kasvada. 78 00:07:01,100 --> 00:07:04,010 Korstnat ja hunnik alati kasvab vastupidises suunas. 79 00:07:04,010 --> 00:07:09,420 Pinu on alati kasvab selles mõttes, et see kasvab üles 80 00:07:09,420 --> 00:07:12,940 Suuremat mälu aadresse ja hunnik kasvab alla 81 00:07:12,940 --> 00:07:17,260 aastal, et see kasvab poole väiksema mälu aadresse. 82 00:07:17,260 --> 00:07:20,250 Nii et üleval on 0 ja alt on kõrge mälu aadresse. 83 00:07:20,250 --> 00:07:26,390 Nad mõlemad kasvab, lihtsalt eri suundades. 84 00:07:26,390 --> 00:07:29,230 [Üliõpilane] Ma lihtsalt mõtlesin, et kuna sa ütlesid paned virna alaosas 85 00:07:29,230 --> 00:07:33,640 sest tundub, intuitiivsem sest korstnat alustada ülaosas hunnik, 86 00:07:33,640 --> 00:07:37,520 hunnik on peal ise ka, et see on - >> Jah. 87 00:07:37,520 --> 00:07:44,960 Sa mõtlema ka hunnik nagu kasvab ja suurem, kuid korstna rohkem. 88 00:07:44,960 --> 00:07:50,280 Nii et korstnat on see, et me nagu tahaks näidata kasvab. 89 00:07:50,280 --> 00:07:55,390 Aga kõikjal vaatad muidu läheb näidata aadress 0 ülaosas 90 00:07:55,390 --> 00:07:59,590 ja kõrgeima mälu aadress allosas, nii et see on teie tavaline vaade mälu. 91 00:07:59,590 --> 00:08:02,100 >> Kas teil on küsimus? 92 00:08:02,100 --> 00:08:04,270 [Üliõpilane] Kas sa sellest lähemalt rääkida hunnik? 93 00:08:04,270 --> 00:08:06,180 Jah. Ma toon selle kohe tagasi. 94 00:08:06,180 --> 00:08:12,220 Esiteks, naastes miks tagastamise ja y on halb, 95 00:08:12,220 --> 00:08:18,470 kohta virna teil on hunnik Stack raamid, mis esindavad kõiki funktsioone 96 00:08:18,470 --> 00:08:20,460 mida on kutsutud. 97 00:08:20,460 --> 00:08:27,990 Nii eiramine eelmine asjad, peal oma virna on alati saab olema peamine funktsioon 98 00:08:27,990 --> 00:08:33,090 kuna see on esimene ülesanne, mis kuramuse nimetatakse. 99 00:08:33,090 --> 00:08:37,130 Ja siis kui sa helistasid teise funktsiooni, korstnat läheb kasvama alla. 100 00:08:37,130 --> 00:08:41,640 Nii et kui ma kutsun mõne funktsiooni, suva, ja ta saab oma freimi, 101 00:08:41,640 --> 00:08:47,280 see võib helistada mõni funktsioon, baar, see saab oma freimi. 102 00:08:47,280 --> 00:08:49,840 Ja baar võiks olla rekursiivne ja see võib helistada ise, 103 00:08:49,840 --> 00:08:54,150 ja nii, et teine ​​kõne, et baar ei hakka oma freimi. 104 00:08:54,150 --> 00:08:58,880 Ja mis siis läheb nende korstnat raamid on kõik kohalikud muutujad 105 00:08:58,880 --> 00:09:03,450 ja kõik funktsiooni argumendid, et - 106 00:09:03,450 --> 00:09:08,730 Kõik asjad, mis on kohapeal scoped et seda funktsiooni minna need virna raame. 107 00:09:08,730 --> 00:09:21,520 Nii et see tähendab, kui ma ütlesin midagi baar on funktsioon, 108 00:09:21,520 --> 00:09:29,270 Ma lihtsalt kuulutada täisarv ja siis tagasi pointer et täisarv. 109 00:09:29,270 --> 00:09:33,790 Nii et kui ei y elada? 110 00:09:33,790 --> 00:09:36,900 [Üliõpilane] y elab baar. >> [Bowden] Jah. 111 00:09:36,900 --> 00:09:45,010 Kuskil see väike ruut mälu on littler ruudul y ta. 112 00:09:45,010 --> 00:09:53,370 Kui ma tagasi tulen ja y, ma tagastab viida, mis see väike ploki mälu. 113 00:09:53,370 --> 00:09:58,400 Aga siis, kui funktsioon tagastab selle freimi saab ilmus välja pinu. 114 00:10:01,050 --> 00:10:03,530 Ja sellepärast nimetatakse seda pinu. 115 00:10:03,530 --> 00:10:06,570 See on nagu pinu andmestruktuur, kui sa tead, mis see on. 116 00:10:06,570 --> 00:10:11,580 Või lausa virna plaate on alati näiteks 117 00:10:11,580 --> 00:10:16,060 peamine on minemas põhjale, siis esimene ülesanne helistate on minemas peal, et 118 00:10:16,060 --> 00:10:20,400 ja sa ei saa tagasi Otse kuni naasete kõik funktsioonid, mida on kutsutud 119 00:10:20,400 --> 00:10:22,340 mis on asetatud ta. 120 00:10:22,340 --> 00:10:28,650 >> [Üliõpilane] Nii et kui sa tegid seda tagasi ja y, et väärtus võib muutuda ilma ette teatamata. 121 00:10:28,650 --> 00:10:31,290 Jah, see on - >> [üliõpilane] See võiks olla kirjutada. >> Jah. 122 00:10:31,290 --> 00:10:34,660 See on täiesti - kui te proovida ja - 123 00:10:34,660 --> 00:10:38,040 See oleks ka int * baar sest see tagasi pointer, 124 00:10:38,040 --> 00:10:41,310 nii selle tasuvus tüüp on int *. 125 00:10:41,310 --> 00:10:46,500 Kui üritate kasutada tagastatav väärtus selle funktsiooni, see on määratlemata käitumine 126 00:10:46,500 --> 00:10:51,770 sest et osuti osutab halb mälu. >> [Üliõpilane] Okei. 127 00:10:51,770 --> 00:11:01,250 Mis siis, kui näiteks teie deklareeritud int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Nii on parem. Jah. 129 00:11:03,740 --> 00:11:07,730 [Üliõpilane] Me rääkisime sellest, kuidas, kui me tõmmata asju meie prügikasti 130 00:11:07,730 --> 00:11:11,750 nad ole tegelikult kustutada, me lihtsalt kaotavad oma suunanäitajaks. 131 00:11:11,750 --> 00:11:15,550 Nii et sel juhul me tegelikult kustutada väärtus või on see ikka seal mälu? 132 00:11:15,550 --> 00:11:19,130 Enamasti, see läheb siiski olemas. 133 00:11:19,130 --> 00:11:24,220 Aga oletame, et me juhtuda, et helistada mõnda muud funktsiooni, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz ei hakka oma freimi siin. 135 00:11:28,990 --> 00:11:31,470 See saab olema kirjutades üle kõik see kraam, 136 00:11:31,470 --> 00:11:34,180 ja siis kui sa hiljem proovida ja kasutada pointer et sul enne, 137 00:11:34,180 --> 00:11:35,570 ta ei kavatse olla sama väärtusega. 138 00:11:35,570 --> 00:11:38,150 See läheb muutnud lihtsalt sellepärast, et sa helistasid funktsioon Baz. 139 00:11:38,150 --> 00:11:43,080 [Üliõpilane] Aga kui me ei oleks, oleks me ikka 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Suure tõenäosusega sa oleks. 141 00:11:44,990 --> 00:11:49,670 Aga sa ei saa tugineda sellele. C lihtsalt ütleb undefined käitumist. 142 00:11:49,670 --> 00:11:51,920 >> [Üliõpilane] Oh, see teeb. Okei. 143 00:11:51,920 --> 00:11:58,190 Nii et kui sa tahad tagasi pointer, see on koht, kus malloc on kasutusel. 144 00:12:00,930 --> 00:12:15,960 Ma kirjutan tegelikult lihtsalt tagasi malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Me läheme üle malloc rohkem teine, kuid ideele malloc on kõik oma kohalike muutujate 146 00:12:24,050 --> 00:12:26,760 alati minna korstnat. 147 00:12:26,760 --> 00:12:31,570 Midagi, mis on malloced läheb hunnik, ja see igavesti ja alati on hunnik 148 00:12:31,570 --> 00:12:34,490 kuni sa selgesõnaliselt vabastab ta. 149 00:12:34,490 --> 00:12:42,130 Nii et see tähendab, et kui sa malloc midagi, see saab ellu jääda pärast tagastab funktsioon. 150 00:12:42,130 --> 00:12:46,800 [Üliõpilane] Kas see jääda ka peale programmi peatub? >> Ei 151 00:12:46,800 --> 00:12:53,180 Okei, nii et see saab olema seal, kuni programm on täiesti valmis näitama. >> Jah. 152 00:12:53,180 --> 00:12:57,510 Me võime minna üle üksikasjad, mis juhtub siis, kui programm peatub. 153 00:12:57,510 --> 00:13:02,150 Võib-olla peate mind meelde, kuid see on eraldi asi täiesti. 154 00:13:02,150 --> 00:13:04,190 [Üliõpilane] Nii malloc loob pointer? >> Jah. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [üliõpilane] Ma arvan malloc tähistab ploki mälu, et osuti saab kasutada. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Ma tahan, et skeem uuesti. >> [Üliõpilane] Nii et see toimib, kuigi? 157 00:13:19,610 --> 00:13:26,430 [Üliõpilane] Jah, malloc tähistab ploki mälu, mida saab kasutada, 158 00:13:26,430 --> 00:13:30,470 ja siis tagastab aadress esimese ploki et mälu. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Jah. Nii et kui te malloc, sa haarata mõned ploki mälu 160 00:13:36,750 --> 00:13:38,260 see on praegu hunnik. 161 00:13:38,260 --> 00:13:43,040 Kui hunnik on liiga väike, siis hunnik lihtsalt läheb kasvama, ja see kasvab selles suunas. 162 00:13:43,040 --> 00:13:44,650 Ütleme hunnik on liiga väike. 163 00:13:44,650 --> 00:13:49,960 Siis on umbes kasvada natuke ja tagasi pointer see plokk, mis lihtsalt kasvas. 164 00:13:49,960 --> 00:13:55,130 Kui tasuta asju, sa üritad rohkem ruumi hunnik, 165 00:13:55,130 --> 00:14:00,030 nii siis hiljem helistada malloc saab taaskasutada, et mälu, mis te varem vabastada. 166 00:14:00,030 --> 00:14:09,950 Tähtsam malloc ja vaba on, et see annab teile täieliku kontrolli 167 00:14:09,950 --> 00:14:12,700 eluea jooksul nende mälu plokki. 168 00:14:12,700 --> 00:14:15,420 Globaalsed muutujad on alati elus. 169 00:14:15,420 --> 00:14:18,500 Kohalik muutujad elus kuulub nende reguleerimisalasse. 170 00:14:18,500 --> 00:14:22,140 Niipea, kui te minna varem lokkis traksidega, kohalikud muutujad on surnud. 171 00:14:22,140 --> 00:14:28,890 Malloced mälu on elus kui sa tahad seda olla elus 172 00:14:28,890 --> 00:14:33,480 ja siis vabaneb, kui ütlete see vabastatakse. 173 00:14:33,480 --> 00:14:38,420 Need on tegelikult ainult 3 tüüpi mälu, tõesti. 174 00:14:38,420 --> 00:14:41,840 Seal on automaatne mälu haldamine, mis on pinu. 175 00:14:41,840 --> 00:14:43,840 Asjad juhtuvad automaatselt. 176 00:14:43,840 --> 00:14:46,910 Kui sa ütled int x, mälu eraldatakse int x. 177 00:14:46,910 --> 00:14:51,630 Kui x läheb välja ulatus, mälu on taastatud x. 178 00:14:51,630 --> 00:14:54,790 Siis on dünaamiline mälu haldamine, mis on see, mida malloc on, 179 00:14:54,790 --> 00:14:56,740 mis on siis, kui teil on kontroll. 180 00:14:56,740 --> 00:15:01,290 Sa dünaamiliselt otsustada, kui mälu peaks ja ei tohiks määrata. 181 00:15:01,290 --> 00:15:05,050 Ja siis on staatiline, mis tähendab lihtsalt, et ta elab igavesti, 182 00:15:05,050 --> 00:15:06,610 mis on see, mis globaalsed muutujad on. 183 00:15:06,610 --> 00:15:10,240 Nad on lihtsalt alati mällu. 184 00:15:10,960 --> 00:15:12,760 >> Küsimused? 185 00:15:14,490 --> 00:15:17,230 [Üliõpilane] Kas sa define plokk lihtsalt kasutades looksulg 186 00:15:17,230 --> 00:15:21,220 kuid ei pea olema, kui avaldus või kui avaldus või midagi sellist? 187 00:15:21,220 --> 00:15:29,130 Saate määrata ploki nagu funktsioon, kuid mis on looksulg liiga. 188 00:15:29,130 --> 00:15:32,100 [Üliõpilane] Nii et sa ei saa lihtsalt olla nagu juhuslikult paari looksulg oma koodi 189 00:15:32,100 --> 00:15:35,680 mis on lokaalsete muutujate? >> Jah, saab küll. 190 00:15:35,680 --> 00:15:45,900 Toas int baar oleksime võinud {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 See peaks olema siin. 192 00:15:48,440 --> 00:15:52,450 Aga see täiesti piiritletakse int y. 193 00:15:52,450 --> 00:15:57,320 Pärast seda teist lokkis traksidega, y ei saa enam kasutada. 194 00:15:57,910 --> 00:16:00,630 Sa peaaegu kunagi seda teha, kuigi. 195 00:16:02,940 --> 00:16:07,370 Getting tagasi mis juhtub, kui programm lõpeb, 196 00:16:07,370 --> 00:16:18,760 seal on selline väärarusaam / pool vale, et me anname, et lihtsalt teha asju lihtsamaks. 197 00:16:18,760 --> 00:16:24,410 Me ütleme teile, et kui te mälu eraldada 198 00:16:24,410 --> 00:16:29,860 sa jaotada osa patakas RAM selle muutuja. 199 00:16:29,860 --> 00:16:34,190 Aga sa ei ole tõesti otseselt puudutamata RAM kunagi oma programmides. 200 00:16:34,190 --> 00:16:37,490 Kui sa arvad, et see, kuidas ma joonistasin - 201 00:16:37,490 --> 00:16:44,330 Ja tegelikult, kui sa lähed läbi GDB näete sama asja. 202 00:16:51,120 --> 00:16:57,590 Sõltumata sellest, mitu korda sa käivitada oma programmi või millist programmi sa kasutad, 203 00:16:57,590 --> 00:16:59,950 korstnat alati saab alustada - 204 00:16:59,950 --> 00:17:06,510 sa oled alati näeme muutujad ümber aadress oxbffff midagi. 205 00:17:06,510 --> 00:17:09,470 See on tavaliselt kuskil selles piirkonnas. 206 00:17:09,470 --> 00:17:18,760 Aga kuidas 2 programmide olla on viiteid, et sama mälu? 207 00:17:20,640 --> 00:17:27,650 [Üliõpilane] Seal on mõned meelevaldne määramine, kus oxbfff peaks olema RAM 208 00:17:27,650 --> 00:17:31,320 mis võib tegelikult olla erinevates kohtades, sõltuvalt kui funktsioon kutsuti. 209 00:17:31,320 --> 00:17:35,920 Jah. Mõiste on virtuaalmälu. 210 00:17:35,920 --> 00:17:42,250 Idee on selles, et iga protsess, iga programm, mis töötab arvutis 211 00:17:42,250 --> 00:17:49,450 on oma - oletame 32 bitti - täiesti sõltumatu aadress ruumi. 212 00:17:49,450 --> 00:17:51,590 See on aadress ruumi. 213 00:17:51,590 --> 00:17:56,220 Tal on oma täiesti sõltumatu 4 gigabaiti kasutada. 214 00:17:56,220 --> 00:18:02,220 >> Nii et kui sa jooksed 2 programmide üheaegselt, see programm näeb 4 GB endale, 215 00:18:02,220 --> 00:18:04,870 Selle programmi näeb 4 GB endale, 216 00:18:04,870 --> 00:18:07,720 ja see on võimatu seda programmi dereference pointer 217 00:18:07,720 --> 00:18:10,920 ja lõpuks mälu selle programmi. 218 00:18:10,920 --> 00:18:18,200 Ja mis virtuaalmälu on on teisendamisprotsessi protsesside aadress ruumi 219 00:18:18,200 --> 00:18:20,470 tegelikult asju RAM. 220 00:18:20,470 --> 00:18:22,940 Nii et see on kuni opsüsteemi teada, et 221 00:18:22,940 --> 00:18:28,080 hei, kui see kutt dereferences osuti oxbfff, et tegelikult tähendab 222 00:18:28,080 --> 00:18:31,040 et ta tahab RAM bait 1000, 223 00:18:31,040 --> 00:18:38,150 arvestades, et kui see programm dereferences oxbfff, ta tõesti tahab RAM bait 10000. 224 00:18:38,150 --> 00:18:41,590 Nad võivad olla meelevaldselt kaugel. 225 00:18:41,590 --> 00:18:48,730 See kehtib isegi asju ühes protsesside aadress ruumi. 226 00:18:48,730 --> 00:18:54,770 Nii nagu ta näeb kõiki 4 GB endale, kuid oletame - 227 00:18:54,770 --> 00:18:57,290 [Üliõpilane] Kas iga protsess - 228 00:18:57,290 --> 00:19:01,350 Oletame, et teil on arvuti koos ainult 4 GB RAM. 229 00:19:01,350 --> 00:19:06,430 Kas iga protsessi näha kogu 4 GB? >> Jah. 230 00:19:06,430 --> 00:19:13,060 Aga 4 GB ta näeb, on vale. 231 00:19:13,060 --> 00:19:20,460 See on lihtsalt see arvab, et see on kõik see mälu, sest ta ei tea ühtegi teist protsessi ei ole. 232 00:19:20,460 --> 00:19:28,140 See ainult kasutada rohkem mälu kui ta tegelikult vajab. 233 00:19:28,140 --> 00:19:32,340 Operatsioonisüsteem ei kavatse anda RAM sellele protsessile 234 00:19:32,340 --> 00:19:35,750 kui see ei kasuta mälu selle kogu piirkonnas. 235 00:19:35,750 --> 00:19:39,300 Ta ei kavatse anda seda mälu sellesse piirkonda. 236 00:19:39,300 --> 00:19:54,780 Aga mõte on selles, et - ma üritan välja mõelda - ma ei saa mõelda analoogia põhjal. 237 00:19:54,780 --> 00:19:56,780 Analoogiaid on raske. 238 00:19:57,740 --> 00:20:02,700 Üks küsimusi virtuaalmälu või üks neist asjadest see lahendada 239 00:20:02,700 --> 00:20:06,810 on see, et protsessid oleksid täiesti teadlikud üksteise vastu. 240 00:20:06,810 --> 00:20:12,140 Ja nii saab kirjutada iga programmi, mis lihtsalt dereferences tahes pointer, 241 00:20:12,140 --> 00:20:19,340 meeldib lihtsalt kirjutada programm, mis ütleb * (ox1234) 242 00:20:19,340 --> 00:20:22,890 ja see on viite mahavõtmine mälu aadress 1234. 243 00:20:22,890 --> 00:20:28,870 >> Aga see on kuni operatsioonisüsteemi seejärel tõlkida mida 1234 tähendab. 244 00:20:28,870 --> 00:20:33,960 Nii et kui 1234 juhtub olema kehtiv mälu aadressi selle protsessi, 245 00:20:33,960 --> 00:20:38,800 nagu see siis korstna või midagi, siis see tagastab väärtuse, et mälu aadress 246 00:20:38,800 --> 00:20:41,960 niipalju kui protsess teab. 247 00:20:41,960 --> 00:20:47,520 Aga kui 1234 pole kehtiv aadress, nagu see juhtub maa 248 00:20:47,520 --> 00:20:52,910 mõnel tükike mälu siin, mis on väljaspool korstnat ja pärast hunnik 249 00:20:52,910 --> 00:20:57,200 ja sa ei ole tegelikult kasutas seda, siis see on, kui saad asjad segfaults 250 00:20:57,200 --> 00:21:00,260 sest sa oled liigutav mälu, et sa ei tohiks liigutav. 251 00:21:07,180 --> 00:21:09,340 See on ka tõsi - 252 00:21:09,340 --> 00:21:15,440 32-bitine süsteem, 32 bitti tähendab, et olete 32 bitti määratleda mälu aadressi. 253 00:21:15,440 --> 00:21:22,970 See on põhjus, miks osuti on 8 baiti, sest 32 bitti on 8 baiti - või 4 baiti. 254 00:21:22,970 --> 00:21:25,250 Näiturid on 4 baiti. 255 00:21:25,250 --> 00:21:33,680 Nii et kui näed osuti nagu oxbfffff, mis on - 256 00:21:33,680 --> 00:21:40,080 Jooksul igas konkreetses programmis saab lihtsalt ehitada suvalises pointer, 257 00:21:40,080 --> 00:21:46,330 kuskil ox0 et härg 8 f's - FFFFFFFF. 258 00:21:46,330 --> 00:21:49,180 [Üliõpilane] Kas sa ei arva nad on 4 baiti? >> Jah. 259 00:21:49,180 --> 00:21:52,730 [Üliõpilane] Siis iga bait on - >> [Bowden] Hexadecimal. 260 00:21:52,730 --> 00:21:59,360 Hexadecimal - 5, 6, 7, 8. Nii suunanäitajaks sa lähed alati näha kuueteistkümnendsüsteemis. 261 00:21:59,360 --> 00:22:01,710 See on lihtsalt kuidas me liigitada suunanäitajaks. 262 00:22:01,710 --> 00:22:05,240 Iga 2 numbrit kuueteistkümnendsüsteemis on 1 bait. 263 00:22:05,240 --> 00:22:09,600 Nii et seal saab olema 8 kuueteistkümnendarvudega 4 baiti. 264 00:22:09,600 --> 00:22:14,190 Nii et iga noolena 32-bitine süsteem saab olema 4 baiti, 265 00:22:14,190 --> 00:22:18,550 mis tähendab, et teie protsessi saab ehitada suvalises 4 baiti 266 00:22:18,550 --> 00:22:20,550 ja teha kursor välja, 267 00:22:20,550 --> 00:22:32,730 mis tähendab, et nii palju kui see on teada, siis saab tegeleda kogu 2 32 baiti mälu. 268 00:22:32,730 --> 00:22:34,760 Kuigi see ei ole tegelikult juurdepääs sellele, 269 00:22:34,760 --> 00:22:40,190 isegi kui arvuti on ainult 512 megabaiti, siis arvab, et see on, et palju mälu. 270 00:22:40,190 --> 00:22:44,930 Ja operatsioonisüsteem on piisavalt targad, et see ainult eraldada mida sa tegelikult vajad. 271 00:22:44,930 --> 00:22:49,630 See ei saa lihtsalt minna, oh, uus protsess: 4 kontserti. 272 00:22:49,630 --> 00:22:51,930 >> Jah. >> [Üliõpilane] Mis härg tähendab? Miks sa kirjutad siis? 273 00:22:51,930 --> 00:22:54,980 See on lihtsalt sümbol kuueteistkümnendsüsteemis. 274 00:22:54,980 --> 00:22:59,590 Kui näed number algab härg, hilisemad asjad on kuueteistkümnendsüsteemis. 275 00:23:01,930 --> 00:23:05,760 [Üliõpilane] Sa selgitab, mis juhtub, kui programm lõpeb. >> Jah. 276 00:23:05,760 --> 00:23:09,480 Mis juhtub, kui programm lõpeb on operatsioonisüsteem 277 00:23:09,480 --> 00:23:13,600 lihtsalt kustutab kaardistamisel, et see on nende aadressid, ja ongi kõik. 278 00:23:13,600 --> 00:23:17,770 Operatsioonisüsteemi saab nüüd lihtsalt anda, et mälust teise programmi kasutada. 279 00:23:17,770 --> 00:23:19,490 [Üliõpilane] Okei. 280 00:23:19,490 --> 00:23:24,800 Nii et kui te eraldada midagi hunnik või korstna või globaalsed muutujad või midagi, 281 00:23:24,800 --> 00:23:27,010 nad kõik lihtsalt kaovad niipea, kui programmi lõppemist 282 00:23:27,010 --> 00:23:32,120 sest operatsioonisüsteem on nüüd tasuta anda, et mälu tahes muul viisil. 283 00:23:32,120 --> 00:23:35,150 [Üliõpilane] Kuigi seal on ilmselt veel väärtusi kirjutatud? >> Jah. 284 00:23:35,150 --> 00:23:37,740 Väärtused on tõenäoliselt ikka veel seal. 285 00:23:37,740 --> 00:23:41,570 See on lihtsalt see saab olema raske saada neid. 286 00:23:41,570 --> 00:23:45,230 See on palju raskem saada neid, kui see on nöökima kustutatud faili 287 00:23:45,230 --> 00:23:51,450 sest kustutatud faili tüüpi istub seal pikka aega ja kõvaketas on palju suurem. 288 00:23:51,450 --> 00:23:54,120 Nii et see läheb üle kirjutada erinevates osades mälu 289 00:23:54,120 --> 00:23:58,640 enne kui see juhtub üle kirjutada patakas mälu, et see fail kasutada olevat. 290 00:23:58,640 --> 00:24:04,520 Aga põhimälu, RAM, siis tsükkel läbi palju kiiremini, 291 00:24:04,520 --> 00:24:08,040 nii see läheb väga kiiresti üle kirjutada. 292 00:24:10,300 --> 00:24:13,340 Küsimused see või midagi muud? 293 00:24:13,340 --> 00:24:16,130 [Üliõpilane] Mul on küsimusi eri teema. >> Okei. 294 00:24:16,130 --> 00:24:19,060 Kas kellelgi on küsimusi selle kohta? 295 00:24:20,170 --> 00:24:23,120 >> Okei. Teine teema. >> [Üliõpilane] Okei. 296 00:24:23,120 --> 00:24:26,550 Olin läbimas mõned praktikas katseid, 297 00:24:26,550 --> 00:24:30,480 ja üks neist see rääkis sizeof 298 00:24:30,480 --> 00:24:35,630 ja väärtus, et ta naaseb või erineva muutuja tüüpi. >> Jah. 299 00:24:35,630 --> 00:24:45,060 Ja ta ütles, et nii int ja pikk nii tulu 4, nii et nad on nii 4 baiti pikk. 300 00:24:45,060 --> 00:24:48,070 Kas on olemas vahe int ja pikk, või on see sama asi? 301 00:24:48,070 --> 00:24:50,380 Jah, seal on erinevus. 302 00:24:50,380 --> 00:24:52,960 C standard - 303 00:24:52,960 --> 00:24:54,950 Ma olen ilmselt läheb segi ajama. 304 00:24:54,950 --> 00:24:58,800 C standard on just nagu C on ametlikel dokumentidel C. 305 00:24:58,800 --> 00:25:00,340 See on see, mida ta ütleb. 306 00:25:00,340 --> 00:25:08,650 Nii C standardi lihtsalt ütleb, et char igavesti ja alati 1 bait. 307 00:25:10,470 --> 00:25:19,040 Peale seda - lühike on alati lihtsalt määratleda kui suurem või võrdne char. 308 00:25:19,040 --> 00:25:23,010 See võib olla rangelt suurem, kuid mitte positiivne. 309 00:25:23,010 --> 00:25:31,940 Väravavahi on lihtsalt määratleda kui suurem või võrdne lühike. 310 00:25:31,940 --> 00:25:36,210 Ja pikk on lihtsalt määratleda kui suurem või võrdne int. 311 00:25:36,210 --> 00:25:41,600 Ja pikka on suurem või võrdne pikk. 312 00:25:41,600 --> 00:25:46,610 Nii et ainus asi C standard defineerib on suhteline tellimine kõike. 313 00:25:46,610 --> 00:25:54,880 Tegelik mälu, et asjad võtavad tavaliselt kuni rakendamise, 314 00:25:54,880 --> 00:25:57,640 aga see on päris täpselt määratletud selles punktis. >> [Üliõpilane] Okei. 315 00:25:57,640 --> 00:26:02,490 Nii et püksid on peaaegu alati saab olema 2 baiti. 316 00:26:04,920 --> 00:26:09,950 Ints on peaaegu alati saab olema 4 baiti. 317 00:26:12,070 --> 00:26:15,340 Pikad Pikad on peaaegu alati saab olema 8 baiti. 318 00:26:17,990 --> 00:26:23,160 Ja igatseb, see sõltub sellest, kas te kasutate 32-bitist või 64-bitist süsteemi. 319 00:26:23,160 --> 00:26:27,450 Nii kaua läheb vastavad süsteemi tüübist. 320 00:26:27,450 --> 00:26:31,920 Kui te kasutate 32-bitist süsteemi nagu Appliance, see saab olema 4 baiti. 321 00:26:34,530 --> 00:26:42,570 Kui te kasutate 64-bit nagu paljud viimastel arvutid, see saab olema 8 baiti. 322 00:26:42,570 --> 00:26:45,230 >> Ints on peaaegu alati 4 baiti selles punktis. 323 00:26:45,230 --> 00:26:47,140 Pikad pikad on peaaegu alati 8 baiti. 324 00:26:47,140 --> 00:26:50,300 In the past, ints kasutada ainult 2 baiti. 325 00:26:50,300 --> 00:26:56,840 Aga teate, et see täielikult rahuldab kõik nende suhete üle ja võrdne. 326 00:26:56,840 --> 00:27:01,280 Nii kaua on täiesti lubatud olla sama suur kui täisarv, 327 00:27:01,280 --> 00:27:04,030 ja see on ka lubatud olla sama suur kui kaua kaua. 328 00:27:04,030 --> 00:27:11,070 Ja see lihtsalt nii juhtub olema, et 99,999% süsteemid, see saab olema võrdne 329 00:27:11,070 --> 00:27:15,800 kas int või kaua kaua. See lihtsalt sõltub 32-bitine või 64-bitine. >> [Üliõpilane] Okei. 330 00:27:15,800 --> 00:27:24,600 Murdarvuna, kuidas on koma määratud poolest bitti? 331 00:27:24,600 --> 00:27:27,160 Nagu näiteks binaarne? >> Jah. 332 00:27:27,160 --> 00:27:30,570 Sa ei pea teadma, et CS50. 333 00:27:30,570 --> 00:27:32,960 Sa ei pea isegi teada, et 61. 334 00:27:32,960 --> 00:27:37,350 Sa ei õpi, et tõesti mingil muidugi. 335 00:27:37,350 --> 00:27:42,740 See on lihtsalt esindatuse. 336 00:27:42,740 --> 00:27:45,440 Ma unustan täpne natuke kattealad. 337 00:27:45,440 --> 00:27:53,380 Idee ujukoma on see, et sa eraldama teatud arvu bitti esindama - 338 00:27:53,380 --> 00:27:56,550 Põhimõtteliselt kõik on teaduslik kuju. 339 00:27:56,550 --> 00:28:05,600 Nii et sa eraldama teatud arvu bittide esindama arvu ise, nagu 1,2345. 340 00:28:05,600 --> 00:28:10,200 Ma ei saa kunagi enamate rohkem numbreid kui 5. 341 00:28:12,200 --> 00:28:26,300 Siis ka eraldama teatud arvu bittide nii et see kipub nii olema 342 00:28:26,300 --> 00:28:32,810 saad vaid kuni teatud number, nagu see on suurim eksponent saab olla, 343 00:28:32,810 --> 00:28:36,190 ja te saate ainult minna teatud eksponent 344 00:28:36,190 --> 00:28:38,770 meeldib, mis on väikseim eksponent saab olema. 345 00:28:38,770 --> 00:28:44,410 >> Ma ei mäleta täpselt nii bitti on määratud kõik need väärtused, 346 00:28:44,410 --> 00:28:47,940 kuid teatud bittide arv on pühendatud 1,2345, 347 00:28:47,940 --> 00:28:50,930 teise teatud bittide arv on pühendatud eksponent 348 00:28:50,930 --> 00:28:55,670 ja see on võimalik ainult esindama eksponent teatud suurusest. 349 00:28:55,670 --> 00:29:01,100 [Üliõpilane] Ja topelt? Kas see on nagu eriti pika float? >> Jah. 350 00:29:01,100 --> 00:29:07,940 See on sama asi nagu ujuk välja arvatud nüüd sa kasutad 8 baiti asemel 4 baiti. 351 00:29:07,940 --> 00:29:11,960 Nüüd on sul võimalik kasutada 9 numbrit või 10 numbrit, 352 00:29:11,960 --> 00:29:16,630 ja see saab minna kuni 300 asemel 100. >> [Üliõpilane] Okei. 353 00:29:16,630 --> 00:29:21,550 Ja ujukid on ka 4 baiti. >> Jah. 354 00:29:21,550 --> 00:29:27,520 Noh, jälle, see sõltub pigem üldine üldise rakendamise, 355 00:29:27,520 --> 00:29:30,610 kuid ujukid on 4 baiti, kahekordistab on 8. 356 00:29:30,610 --> 00:29:33,440 Paarismängud nimetatakse topelt, sest nad on kahekordistada ujukite. 357 00:29:33,440 --> 00:29:38,380 [Üliõpilane] Okei. Ja on seal topelt kahekordistab? >> Seal ei ole. 358 00:29:38,380 --> 00:29:43,660 Ma arvan - >> [üliõpilane] Nagu kaua pikad? >> Jah. Ma ei arva nii. Jah. 359 00:29:43,660 --> 00:29:45,950 [Üliõpilane] eelmise aasta test oli küsimus põhiülesanne 360 00:29:45,950 --> 00:29:49,490 võttes olla osa teie programmi. 361 00:29:49,490 --> 00:29:52,310 Vastus oli, et see ei pea olema osa teie programmi. 362 00:29:52,310 --> 00:29:55,100 Millises olukorras? Seda ma nägin. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Tundub - >> [üliõpilane] Mis olukorras? 364 00:29:59,090 --> 00:30:02,880 Kas teil on probleem? >> [Üliõpilane] Jah, võin kindlasti tõmmake see üles. 365 00:30:02,880 --> 00:30:07,910 See ei pea olema tehniliselt, kuid põhimõtteliselt see saab olema. 366 00:30:07,910 --> 00:30:10,030 [Üliõpilane] Ma nägin üks teistsugune aasta. 367 00:30:10,030 --> 00:30:16,220 See oli nagu Õige või vale: kehtiv - >> Oh,. C faili? 368 00:30:16,220 --> 00:30:18,790 [Üliõpilane] Igasugune. C fail peab olema - [nii keelt korraga - arusaamatu] 369 00:30:18,790 --> 00:30:21,120 Okei. Nii et eraldi. 370 00:30:21,120 --> 00:30:26,800 >> . C faili lihtsalt peab sisaldama funktsioone. 371 00:30:26,800 --> 00:30:32,400 Võite koostada faili masinkoodidena, binaarne, mis iganes, 372 00:30:32,400 --> 00:30:36,620 ilma et oleks käivitatav veel. 373 00:30:36,620 --> 00:30:39,420 Kehtiv käivitatava peab olema peamine ülesanne. 374 00:30:39,420 --> 00:30:45,460 Võite kirjutada 100 Funktsioonid 1 faili, kuid ei peamised 375 00:30:45,460 --> 00:30:48,800 ja seejärel kompileerida, et näha binaarne, 376 00:30:48,800 --> 00:30:54,460 siis kirjutada teise faili, mis on ainult peamised kuid see nõuab hunniku neid funktsioone 377 00:30:54,460 --> 00:30:56,720 Selles binaarfaili siin. 378 00:30:56,720 --> 00:31:01,240 Ja nii kui sa üritad käivitatava, seda linker ei 379 00:31:01,240 --> 00:31:05,960 on see ühendab neid 2 binaarfailidega käivitatava. 380 00:31:05,960 --> 00:31:11,400 Nii. C fail ei pea olema peamine ülesanne üldse. 381 00:31:11,400 --> 00:31:19,220 Ja suur kood alused näete tuhandeid. C failid ja 1 peamine fail. 382 00:31:23,960 --> 00:31:26,110 Veel küsimusi? 383 00:31:29,310 --> 00:31:31,940 [Üliõpilane] Oli teine ​​küsimus. 384 00:31:31,940 --> 00:31:36,710 Ta ütles, teha on kompilaator. Õige või vale? 385 00:31:36,710 --> 00:31:42,030 Ja vastus oli vale, ja sain aru, miks see ei ole nagu rõkkama. 386 00:31:42,030 --> 00:31:44,770 Aga mida me nimetame teha, kui see ei ole? 387 00:31:44,770 --> 00:31:49,990 Tee on põhimõtteliselt lihtsalt - ma näen täpselt, mida ta nimetab seda. 388 00:31:49,990 --> 00:31:52,410 Aga see lihtsalt jookseb käske. 389 00:31:53,650 --> 00:31:55,650 Tee. 390 00:31:58,240 --> 00:32:00,870 Ma ei tõmba see üles. Jah. 391 00:32:10,110 --> 00:32:13,180 Oh, jah. Tee ka ei tee seda. 392 00:32:13,180 --> 00:32:17,170 See ütleb eesmärgil mark utiliit on määrata automaatselt 393 00:32:17,170 --> 00:32:19,610 mis tükid suur programm tuleb recompiled 394 00:32:19,610 --> 00:32:22,350 ja anda käske kompileeri neid. 395 00:32:22,350 --> 00:32:27,690 Võite teha teha faile, mis on absoluutselt tohutu. 396 00:32:27,690 --> 00:32:33,210 Tee vaatab ajatemplite failide ja, nagu me varem öelnud, 397 00:32:33,210 --> 00:32:36,930 saate koostada üksikuid faile alla ja see ei ole kuni jõuad linker 398 00:32:36,930 --> 00:32:39,270 et nad pannakse kokku on käivitatav. 399 00:32:39,270 --> 00:32:43,810 Nii et kui sul on 10 erinevat faili ja te muudate 1 neist, 400 00:32:43,810 --> 00:32:47,870 siis mida teha kavatseb teha on lihtsalt kompileeri et 1 fail 401 00:32:47,870 --> 00:32:50,640 ja uuesti linkida kõike koos. 402 00:32:50,640 --> 00:32:53,020 Aga see on palju rumalam kui see. 403 00:32:53,020 --> 00:32:55,690 See on kuni teil täielikult määratleda, et see, mida ta peaks tegema. 404 00:32:55,690 --> 00:32:59,560 See vaikimisi on võime tunda see ajatempel kraami, 405 00:32:59,560 --> 00:33:03,220 kuid võite kirjutada margi faili midagi teha. 406 00:33:03,220 --> 00:33:09,150 Võite kirjutada tegema faili nii, et kui kirjutad oleks lihtsalt cd teise kataloogi. 407 00:33:09,150 --> 00:33:15,560 Olin saada pettunud, sest ma tack kõik sees minu Appliance 408 00:33:15,560 --> 00:33:21,740 ja siis saan vaadata PDF Mac. 409 00:33:21,740 --> 00:33:30,720 >> Nii et ma lähen Finder ja ma ei ei lähe, Ühendu serveriga, 410 00:33:30,720 --> 00:33:36,950 ja server Ma võtan on minu Appliance, ja siis ma avada PDF 411 00:33:36,950 --> 00:33:40,190 et saab koostatud LaTeX. 412 00:33:40,190 --> 00:33:49,320 Aga ma imestasin pettunud, sest iga kord, mul on vaja värskendada PDF, 413 00:33:49,320 --> 00:33:53,900 Ma pidin kopeeri see konkreetse kataloogi, et see võiks pääseda 414 00:33:53,900 --> 00:33:57,710 ja see oli saada tüütu. 415 00:33:57,710 --> 00:34:02,650 Nii et selle asemel ma kirjutasin margi fail, mis teil on määratleda, kuidas ta teeb asju. 416 00:34:02,650 --> 00:34:06,130 Kuidas sa teed seda PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Just nagu iga teine ​​mark faili - või ma arvan, et sa ei ole näinud mark faili, 418 00:34:10,090 --> 00:34:13,510 kuid meil Appliance globaalse margi faili lihtsalt ütleb, 419 00:34:13,510 --> 00:34:16,679 kui teil on koostamisel C faili, kasutage rõkkama. 420 00:34:16,679 --> 00:34:20,960 Ja nii siin minu teha faili et ma ütlen, 421 00:34:20,960 --> 00:34:25,020 Faili sa lähed soovid kompileerida PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Ja nii see on PDF lateks, mis teeb koostamisel. 423 00:34:27,889 --> 00:34:31,880 Tee ei ole koostamisel. See on lihtsalt neid käske järjekorras ma täpsustada. 424 00:34:31,880 --> 00:34:36,110 Nii et see töötab PDF LaTeX, see kopeerib selle kataloogi ma tahan seda, mida soovid kopeerida, 425 00:34:36,110 --> 00:34:38,270 see cd kataloog, ja teeb muid asju, 426 00:34:38,270 --> 00:34:42,380 kuid kõik see on tunda, kui faili muudatusi, 427 00:34:42,380 --> 00:34:45,489 ja kui see muutub, siis see kestab käske, mis ta pidi jooksma 428 00:34:45,489 --> 00:34:48,760 kui faili muudatusi. >> [Üliõpilane] Okei. 429 00:34:50,510 --> 00:34:54,420 Ma ei tea, kui kasutatakse globaalse margi failid on minu jaoks seda kontrollida. 430 00:34:57,210 --> 00:35:04,290 Muud küsimused? Midagi varasemast viktoriinid? Iga kursor asju? 431 00:35:06,200 --> 00:35:08,730 On peent asju osuti nagu - 432 00:35:08,730 --> 00:35:10,220 Ma ei kavatse olla võimalik leida viktoriini küsimus selle kohta - 433 00:35:10,220 --> 00:35:16,250 Aga nagu selline asi. 434 00:35:19,680 --> 00:35:24,060 Veenduge, et te mõistate, et kui ma ütlen, int * x * y - 435 00:35:24,890 --> 00:35:28,130 See ei ole täpselt siin midagi, ma arvan. 436 00:35:28,130 --> 00:35:32,140 Aga nagu * x * y, need on 2 muutujad, mis on ära pinu. 437 00:35:32,140 --> 00:35:37,220 Kui ma ütlen x = malloc (sizeof (int)), x on ikka muutuja korstnat 438 00:35:37,220 --> 00:35:41,180 malloc on mõned plokk üle hunnik, ja meil oli x käsk hunnik. 439 00:35:41,180 --> 00:35:43,900 >> Nii et midagi virna punkte hunnik. 440 00:35:43,900 --> 00:35:48,100 Kui sa malloc midagi, sa paratamatult säilitamist sees osuti. 441 00:35:48,100 --> 00:35:55,940 Nii et osuti on virnas, malloced plokk on hunnik. 442 00:35:55,940 --> 00:36:01,240 Paljud inimesed saavad segaduses ja öelda, int * x = malloc; x on hunnik. 443 00:36:01,240 --> 00:36:04,100 No Mida x osutab on hunnik. 444 00:36:04,100 --> 00:36:08,540 x ise on virnas, kui mingil põhjusel olete x olla globaalne muutuja, 445 00:36:08,540 --> 00:36:11,960 millisel juhul ta juhtub olema mõnes muus piirkonnas mälu. 446 00:36:13,450 --> 00:36:20,820 Nii et jälgida, need kasti ja nool diagrammid on päris tavaline, et viktoriini. 447 00:36:20,820 --> 00:36:25,740 Või kui see ei ole kohta viktoriini 0, siis toimub viktoriin 1. 448 00:36:27,570 --> 00:36:31,940 Sa peaksid teadma kõik need, sammud koostamisel 449 00:36:31,940 --> 00:36:35,740 kuna siis tuli vastata küsimustele nimetatud. Jah. 450 00:36:35,740 --> 00:36:38,940 [Üliõpilane] Kas me läheme üle need sammud - >> Muidugi. 451 00:36:48,340 --> 00:36:58,640 Enne samme ja koostamise meil preprocessing 452 00:36:58,640 --> 00:37:16,750 koostamise, montaaž ja sidumine. 453 00:37:16,750 --> 00:37:21,480 Eeltöötlus. Mida see teeb? 454 00:37:29,720 --> 00:37:32,290 See on lihtsaim samm - hästi, mitte nagu - 455 00:37:32,290 --> 00:37:35,770 see ei tähenda, et peaks olema selge, kuid see on kõige lihtsam samm. 456 00:37:35,770 --> 00:37:38,410 Te võiks rakendada seda ise. Jah. 457 00:37:38,410 --> 00:37:43,410 [Üliõpilane] Võtta mida on teie sisaldab niimoodi ja see kopeerib ja siis määratletakse ka. 458 00:37:43,410 --> 00:37:49,250 Tundub asjad # include ja # define, 459 00:37:49,250 --> 00:37:53,800 ja see lihtsalt koopiad ja pastad mida need tegelikult tähendavad. 460 00:37:53,800 --> 00:37:59,240 Nii et kui te ütlete # include cs50.h, eeltöötluse on kopeerimine ja kleepimine cs50.h 461 00:37:59,240 --> 00:38:01,030 arvesse, et liin. 462 00:38:01,030 --> 00:38:06,640 Kui sa ütled # define x on 4, eeltöötluse läbib kogu programmi 463 00:38:06,640 --> 00:38:10,400 ning asendab kõik juhtumid x 4. 464 00:38:10,400 --> 00:38:17,530 Nii eeltöötluse võtab kehtiv C fail ja väljundid kehtiv C fail 465 00:38:17,530 --> 00:38:20,300 kus asjad on kopeeritud ja kleebitud. 466 00:38:20,300 --> 00:38:24,230 Nüüd koostamiseks. Mida see teeb? 467 00:38:25,940 --> 00:38:28,210 [Üliõpilane] See läheb C kahekomponentsete. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] See ei lähe kõik nii binaarne. 469 00:38:30,970 --> 00:38:34,220 [Üliõpilane] Et masin koodi siis? >> See ei ole masina koodi. 470 00:38:34,220 --> 00:38:35,700 [Üliõpilane] assamblee? >> Assamblee. 471 00:38:35,700 --> 00:38:38,890 See läheb Assamblee enne läheb kõik viis C-koodi, 472 00:38:38,890 --> 00:38:45,010 ja kõige keeles midagi sellist teha. 473 00:38:47,740 --> 00:38:50,590 Vali kõik kõrgetasemelised keel, ja kui sa lähed kompileerida, 474 00:38:50,590 --> 00:38:52,390 on tõenäoline, et koostada sammudega. 475 00:38:52,390 --> 00:38:58,140 Esiteks see saab koostada Pythoni C, siis see saab kompileerida C kuni assamblee 476 00:38:58,140 --> 00:39:01,600 ja siis assamblee ei hakka ümber binaarne. 477 00:39:01,600 --> 00:39:07,800 Nii koostamise läheb toob see C kuni assamblee. 478 00:39:07,800 --> 00:39:12,130 Sõna koostamise tähendab tavaliselt toob see kõrgem tase 479 00:39:12,130 --> 00:39:14,340 madalamale tasemele programmeerimiskeelt. 480 00:39:14,340 --> 00:39:19,190 Nii et see on ainult samm koostamise kus hakkate koos kõrgetasemelise keeles 481 00:39:19,190 --> 00:39:23,270 ja lõpuks madala keeles, ja sellepärast etappi nimetatakse koostamisel. 482 00:39:25,280 --> 00:39:33,370 [Üliõpilane] Ajal koostamise oletame, et sa oled teinud # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Kas tõlkija kompileeri cs50.h, nagu funktsioonid, mis on seal, 484 00:39:42,190 --> 00:39:45,280 ja moodustavad sellest Assamblee kood samuti, 485 00:39:45,280 --> 00:39:50,830 või on see kopeerida ja kleepida midagi, mis on olnud eelnevalt assamblee? 486 00:39:50,830 --> 00:39:56,910 cs50.h päris palju kunagi sattuda assamblee. 487 00:39:59,740 --> 00:40:03,680 Asju funktsiooni prototüüpe ja asjad on just teie jaoks olema ettevaatlik. 488 00:40:03,680 --> 00:40:09,270 See tagab, et tõlkija on võimalik vaadata asju, nagu olete helistaja funktsioone 489 00:40:09,270 --> 00:40:12,910 kellel on õigus tagasi liigid ja õigus argumendid ja värki. 490 00:40:12,910 --> 00:40:18,350 >> Nii cs50.h on eeltöödeldud sisse faili ja siis, kui ta on koostamisel 491 00:40:18,350 --> 00:40:22,310 See on põhimõtteliselt ära visata pärast jälgib, et kõik on kutsutud õigesti. 492 00:40:22,310 --> 00:40:29,410 Aga funktsioonid määratletud CS50 raamatukogu, mis on eraldi cs50.h, 493 00:40:29,410 --> 00:40:33,610 need ei eraldi koostatud. 494 00:40:33,610 --> 00:40:37,270 See on tegelikult langenud ühendab samm, nii me jõuame, et teises. 495 00:40:37,270 --> 00:40:40,100 Aga kõigepealt, mida kokkupanek? 496 00:40:41,850 --> 00:40:44,500 [Üliõpilane] Assamblee binaarne? >> Jah. 497 00:40:46,300 --> 00:40:48,190 Kokkupanek. 498 00:40:48,190 --> 00:40:54,710 Me ei kutsu seda koostamisel sest Assamblee on päris palju puhast tõlge binaarne. 499 00:40:54,710 --> 00:41:00,230 On väga vähe loogikat läheb Assamblee binaarne. 500 00:41:00,230 --> 00:41:03,180 See on nagu soojaks tabelis, oh, meil on see õpetus; 501 00:41:03,180 --> 00:41:06,290 mis vastab binaarne 01110. 502 00:41:10,200 --> 00:41:15,230 Ja nii faile, kokkupanek üldiselt väljundid. O faile. 503 00:41:15,230 --> 00:41:19,020 Ja. O failid on, mida me ütlesime enne, 504 00:41:19,020 --> 00:41:21,570 kuidas fail ei pea olema peamine ülesanne. 505 00:41:21,570 --> 00:41:27,640 Iga faili saab koostada alla. O faili nii kaua, kui see on sobilik C-faili. 506 00:41:27,640 --> 00:41:30,300 See võib koostada alla. O. 507 00:41:30,300 --> 00:41:43,030 Nüüd ühendab on see, mis tegelikult toob kamp. O failid ja toob need täidetavad. 508 00:41:43,030 --> 00:41:51,110 Ja mis ühendab ei ole sa ei mõtle CS50 raamatukogu. O faili. 509 00:41:51,110 --> 00:41:56,980 See on juba koostatud binaarne fail. 510 00:41:56,980 --> 00:42:03,530 Ja nii kui sa kompileerida faili oma hello.c, mis nõuab getString, 511 00:42:03,530 --> 00:42:06,360 hello.c saab koostada alla hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o on nüüd binaarne. 513 00:42:08,910 --> 00:42:12,830 Ta kasutab getString, nii et see peab minema üle cs50.o, 514 00:42:12,830 --> 00:42:16,390 ja linker smooshes need kokku ja kopeerib getString sellesse faili 515 00:42:16,390 --> 00:42:20,640 ja väljub käivitatava, mis on kõik funktsioonid, mida ta vajab. 516 00:42:20,640 --> 00:42:32,620 Nii cs50.o ei ole tegelikult O faili, aga see on piisavalt lähedal, et ei ole põhimõttelist erinevust. 517 00:42:32,620 --> 00:42:36,880 Nii ühendab vaid toob hunnik faile kokku 518 00:42:36,880 --> 00:42:41,390 et eraldi sisaldavad kõiki funktsioone mul on vaja kasutada 519 00:42:41,390 --> 00:42:46,120 ja loob käivitatava vormi, mis on reaalselt sõita. 520 00:42:48,420 --> 00:42:50,780 >> Ja nii see on ka see, mida me ütlesime enne 521 00:42:50,780 --> 00:42:55,970 kus saab olema 1000. c failide koguda neid kõiki. o faili, 522 00:42:55,970 --> 00:43:00,040 mis võtab tõenäoliselt aega, siis muudad 1. c faili. 523 00:43:00,040 --> 00:43:05,480 Teil on vaja ainult kompileeri, et 1. C fail ja uuesti linkida kõike muud, 524 00:43:05,480 --> 00:43:07,690 siduda kõik tagasi kokku. 525 00:43:09,580 --> 00:43:11,430 [Üliõpilane] Kui Me seostame me kirjutame lcs50? 526 00:43:11,430 --> 00:43:20,510 Jah, nii-lcs50. See lipp signaale linker, et sa tuleks siduda selle raamatukogu. 527 00:43:26,680 --> 00:43:28,910 Küsimused? 528 00:43:41,310 --> 00:43:46,860 Kas me oleme läinud üle binaarne muu kui 5 sekundit esimeses loengus? 529 00:43:50,130 --> 00:43:53,010 Ma ei arva nii. 530 00:43:55,530 --> 00:43:58,820 Sa peaksid teadma kõik suured Os, et oleme läinud üle, 531 00:43:58,820 --> 00:44:02,670 ja sa peaksid saama, kui me andsime teile funktsiooni, 532 00:44:02,670 --> 00:44:09,410 siis peaks olema võimalik öelda, et see on suur O, jämedalt. Või noh, suur O on karm. 533 00:44:09,410 --> 00:44:15,300 Nii et kui näete nested jaoks silmuseid silmuspõletamise üle sama palju asju, 534 00:44:15,300 --> 00:44:22,260 nagu int i, i > [üliõpilane] n ruudus. >> See kipub olema n ruudus. 535 00:44:22,260 --> 00:44:25,280 Kui teil on kolmekordne pesitses, see kipub olema n kuubis. 536 00:44:25,280 --> 00:44:29,330 Nii et selline asi siis peaks olema võimalik välja tuua kohe. 537 00:44:29,330 --> 00:44:33,890 Sa pead teadma sisestamise sorteerida ning mull sorteerida ning ühendada sorteerida ning kõik need. 538 00:44:33,890 --> 00:44:41,420 See on lihtsam mõista, miks nad on sellised n ruudus ja n log n ja kõik selle 539 00:44:41,420 --> 00:44:47,810 sest ma arvan, et seal oli viktoriin üks aasta, kus me põhimõtteliselt andsin sulle 540 00:44:47,810 --> 00:44:55,050 rakendamise mull sorteerida ning ütles: "Mis on töötamise aeg selle funktsiooni?" 541 00:44:55,050 --> 00:45:01,020 Nii et kui te tunnistate seda mull sorteerida, siis saate kohe öelda, n ruudus. 542 00:45:01,020 --> 00:45:05,470 Aga kui sa lihtsalt vaatad, sa ei pea isegi aru, et see on mull sorteerida; 543 00:45:05,470 --> 00:45:08,990 võid lihtsalt öelda seda teeb seda ja seda. See on n ruudus. 544 00:45:12,350 --> 00:45:14,710 [Üliõpilane] Kas on raske näiteid võite tulla, 545 00:45:14,710 --> 00:45:20,370 nagu sarnane idee figuring? 546 00:45:20,370 --> 00:45:24,450 >> Ma ei arva, et me annaks sulle raske näiteid. 547 00:45:24,450 --> 00:45:30,180 Mull sorteerida asi on umbes sama raske kui me läheks, 548 00:45:30,180 --> 00:45:36,280 ja isegi see, kui sa mõistad, et sa itereerimise üle massiivi 549 00:45:36,280 --> 00:45:41,670 iga element massiivi, mis saab olema midagi, mis on n ruudus. 550 00:45:45,370 --> 00:45:49,940 Seal on küsimused, nagu siin on meil - Oh. 551 00:45:55,290 --> 00:45:58,530 Lihtsalt ühel päeval, Doug väitis: "Ma olen leiutanud algoritm, mida saab sortida massiivi 552 00:45:58,530 --> 00:46:01,780 "N arvu O (log n) ajaga!" 553 00:46:01,780 --> 00:46:04,900 Niisiis, kuidas me teame, et on võimatu? 554 00:46:04,900 --> 00:46:08,850 [Kuuldamatu õpilase vastus] >> Jah. 555 00:46:08,850 --> 00:46:13,710 Vähemalt on, mida sa pead puudutada iga element massiivi 556 00:46:13,710 --> 00:46:16,210 nii et see on võimatu sorteeri massiiv - 557 00:46:16,210 --> 00:46:20,850 Kui kõik on sorteerimata järjekorras, siis sa lähed tuleb liigutav kõik massiivi, 558 00:46:20,850 --> 00:46:25,320 nii et see on võimatu seda teha vähem kui O n. 559 00:46:27,430 --> 00:46:30,340 [Üliõpilane] Sa näitasid meile, et näide on võimalik seda teha O n 560 00:46:30,340 --> 00:46:33,920 kui kasutad palju mälu. >> Jah. 561 00:46:33,920 --> 00:46:37,970 Ja see on - ma unustan Mis see on - Kas see lugedes sorteerida? 562 00:46:47,360 --> 00:46:51,330 Hmm. See on täisarv sortimise algoritm. 563 00:46:59,850 --> 00:47:05,100 Ma otsisin eriline nimi see, et ma ei mäleta eelmisel nädalal. 564 00:47:05,100 --> 00:47:13,000 Jah. Need liigid on kehvasti, et saab täita asju suur O n. 565 00:47:13,000 --> 00:47:18,430 Kuid on ka piiranguid, nagu saab kasutada ainult täisarvud kuni teatud number. 566 00:47:20,870 --> 00:47:24,560 Plus, kui sa üritad sortida midagi see on - 567 00:47:24,560 --> 00:47:30,750 Kui teie massiiv on 012, -12, 151, 4 miljonit 568 00:47:30,750 --> 00:47:35,120 siis, et ühe osa läheb täielikult hävitada kogu sorteerimist. 569 00:47:42,060 --> 00:47:44,030 >> Küsimused? 570 00:47:49,480 --> 00:47:58,870 [Üliõpilane] Kui teil on rekursiivne funktsioon ja see lihtsalt teeb rekursiivne kõne 571 00:47:58,870 --> 00:48:02,230 jooksul tulu avaldus, et on saba rekursiivne, 572 00:48:02,230 --> 00:48:07,360 ja nii oleks, et mitte kasutada rohkem mälu ajal runtime 573 00:48:07,360 --> 00:48:12,550 või et see oleks vähemalt kasutada võrreldavaid mälu iteratiivne lahendus? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Jah. 575 00:48:14,530 --> 00:48:19,840 See on tõenäoliselt mõnevõrra aeglasem, kuid tegelikult mitte. 576 00:48:19,840 --> 00:48:23,290 Saba rekursiivne on päris hea. 577 00:48:23,290 --> 00:48:32,640 Vaadates uuesti virna raamid, oletame, et meil on peamised 578 00:48:32,640 --> 00:48:42,920 ja meil on int baar (int x) või midagi. 579 00:48:42,920 --> 00:48:52,310 See ei ole täiuslik rekursiivne funktsioon, kuid tasuvus baar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Nii et ilmselt see on vigane. Sa pead baasi juhtudel ja värki. 581 00:48:57,620 --> 00:49:00,360 Aga mõte on selles, et see on saba rekursiivne, 582 00:49:00,360 --> 00:49:06,020 mis tähendab, kui peamised kõned baar see läheb aina oma freimi. 583 00:49:09,550 --> 00:49:12,440 Selles freimi seal saab olema vähe ploki mälu 584 00:49:12,440 --> 00:49:17,490 mis vastab selle argumendi x. 585 00:49:17,490 --> 00:49:25,840 Ja nii ütleme peamine juhtub helistada baar (100); 586 00:49:25,840 --> 00:49:30,050 Nii et x läheb alguses on 100. 587 00:49:30,050 --> 00:49:35,660 Kui tõlkija tunnistab, et see on saba rekursiivne funktsioon, 588 00:49:35,660 --> 00:49:38,540 siis, kui baar teeb selle rekursiivne kõne baar, 589 00:49:38,540 --> 00:49:45,490 tegemise asemel uue freimi, mis on kui pakk väljub suuresti, 590 00:49:45,490 --> 00:49:48,220 lõpuks ta tekib hunnik ja siis saad segfaults 591 00:49:48,220 --> 00:49:51,590 kuna mälu hakkab põrgata. 592 00:49:51,590 --> 00:49:54,830 >> Nii et selle asemel, et oma freimi, see saab aru, 593 00:49:54,830 --> 00:49:59,080 Hei, ma ei ole kunagi tõesti vaja tulla tagasi selle freimi, 594 00:49:59,080 --> 00:50:08,040 Nii et selle asemel ma lihtsalt asendada see argument on 99 ja seejärel alustada baar üle. 595 00:50:08,040 --> 00:50:11,810 Ja siis ta teeb seda uuesti ja see jõuab tagasi baari (x - 1), 596 00:50:11,810 --> 00:50:17,320 ja tegemise asemel uue freimi, siis lihtsalt asendada senine argument 98 597 00:50:17,320 --> 00:50:20,740 ja siis hüppa tagasi alguses baar. 598 00:50:23,860 --> 00:50:30,430 Need toimingud, asendades et 1 väärtus korstnat ja hüppas tagasi alguses, 599 00:50:30,430 --> 00:50:32,430 on üsna tõhus. 600 00:50:32,430 --> 00:50:41,500 Nii et mitte ainult see sama mälukasutust eraldi funktsioon, mis on iteratiivne 601 00:50:41,500 --> 00:50:45,390 sest sa oled ainult kasutades 1 freimi, aga sa ei põe varjuküljed 602 00:50:45,390 --> 00:50:47,240 võttes helistada funktsioone. 603 00:50:47,240 --> 00:50:50,240 Üleskutse funktsioonid võib veidi kallis, sest see on kõike seda teha setup 604 00:50:50,240 --> 00:50:52,470 ja teardown ja kõik see kraam. 605 00:50:52,470 --> 00:50:58,160 Nii et see saba rekursioon on hea. 606 00:50:58,160 --> 00:51:01,170 [Üliõpilane] Miks see ei loo uusi samme? 607 00:51:01,170 --> 00:51:02,980 Sest see mõistab, see ei pea. 608 00:51:02,980 --> 00:51:07,800 Kõne baar on lihtsalt tagasi rekursiivne kõne. 609 00:51:07,800 --> 00:51:12,220 Seega ei ole vaja midagi teha tagastatav väärtus. 610 00:51:12,220 --> 00:51:15,120 See lihtsalt läheb kohe tagastada. 611 00:51:15,120 --> 00:51:20,530 Nii see lihtsalt läheb asendada oma väidet ja alustada otsast peale. 612 00:51:20,530 --> 00:51:25,780 Ja ka siis, kui teil ei ole saba rekursiivne versioon, 613 00:51:25,780 --> 00:51:31,460 siis sa saad kõik need baari, kus millal see baar tagastab 614 00:51:31,460 --> 00:51:36,010 peab ta tagastama selle raha selle ühe, siis see baar kohe tagasi 615 00:51:36,010 --> 00:51:39,620 ja ta naaseb oma raha selle ühe, siis lihtsalt läheb kohe tagasi 616 00:51:39,620 --> 00:51:41,350 ja tagastab selle väärtuse siin. 617 00:51:41,350 --> 00:51:45,350 Nii et te säästes see popping kõik need asjad ära virna 618 00:51:45,350 --> 00:51:48,730 alates tagastatav väärtus on lihtsalt saab olema läbinud kogu tee tagasi üles niikuinii. 619 00:51:48,730 --> 00:51:55,400 Nii et miks mitte lihtsalt asendada meie argument uuendatud argument ja alustada otsast peale? 620 00:51:57,460 --> 00:52:01,150 Kui funktsioon ei ole saba rekursiivne, kui sa midagi sellist - 621 00:52:01,150 --> 00:52:07,530 [Üliõpilane] kui baar (x + 1). >> Jah. 622 00:52:07,530 --> 00:52:11,770 >> Nii et kui paned ta seisund, siis sa teed midagi tagastatav väärtus. 623 00:52:11,770 --> 00:52:16,260 Või isegi kui te just do tagasi 2 * baar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Nüüd baar (x - 1) peab tagastama, et see arvutada 2 korda see väärtus, 625 00:52:23,560 --> 00:52:26,140 nii et nüüd ta ei vaja oma eraldi freimi, 626 00:52:26,140 --> 00:52:31,180 ja nüüd, ükskõik kui kõvasti sa proovida, sa lähed vaja - 627 00:52:31,180 --> 00:52:34,410 See ei ole saba rekursiivne. 628 00:52:34,410 --> 00:52:37,590 [Üliõpilane] Kas ma püüa rekursioon eesmärgiks saba rekursioon - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Ideaalses maailmas, kuid CS50 sa ei pea. 630 00:52:43,780 --> 00:52:49,280 Selleks, et saada saba rekursioon, üldiselt, kui luua täiendav argument 631 00:52:49,280 --> 00:52:53,550 kus baaris võtab int x arvesse y 632 00:52:53,550 --> 00:52:56,990 ja y vastab ülim asi, mida soovite naasta. 633 00:52:56,990 --> 00:53:03,650 Nii siis sa lähed tuleb tagasi baari (x - 1) 2 * y. 634 00:53:03,650 --> 00:53:09,810 Nii et see on lihtsalt kõrgetasemeline kuidas muuta asjad olema saba rekursiivne. 635 00:53:09,810 --> 00:53:13,790 Aga pildi argument - 636 00:53:13,790 --> 00:53:17,410 Ja siis lõpuks, kui jõuad oma baasi nii, siis lihtsalt tagasi y 637 00:53:17,410 --> 00:53:22,740 sest sa kogunev kogu aeg tagastatav väärtus, mida soovite. 638 00:53:22,740 --> 00:53:27,280 Sa liiki on teinud seda korduvalt, kuid kasutades rekursiivne kõned. 639 00:53:32,510 --> 00:53:34,900 Küsimused? 640 00:53:34,900 --> 00:53:39,890 [Üliõpilane] Ehk umbes pointer aritmeetika, nagu kasutades stringid. >> Muidugi. 641 00:53:39,890 --> 00:53:43,610 Pointer aritmeetika. 642 00:53:43,610 --> 00:53:48,440 Kui kasutate stringid see on lihtne, sest stringid on char tähte, 643 00:53:48,440 --> 00:53:51,860 tähemärki on igavesti ja alati ühe baidi, 644 00:53:51,860 --> 00:53:57,540 ja nii pointer aritmeetika võrdub regulaarne aritmeetika, kui olete tegelevad stringid. 645 00:53:57,540 --> 00:54:08,790 Ütleme nii, et char * s = "tere". 646 00:54:08,790 --> 00:54:11,430 Nii et meil on ploki mälu. 647 00:54:19,490 --> 00:54:22,380 See vajab 6 baiti, sest sa alati vaja null terminaator. 648 00:54:22,380 --> 00:54:28,620 Ja char * s läheb osutada alguses massiivi. 649 00:54:28,620 --> 00:54:32,830 Nii s juhib seal. 650 00:54:32,830 --> 00:54:36,710 Nüüd on see põhiliselt kuidas tahes massiivi töötab, 651 00:54:36,710 --> 00:54:40,780 olenemata sellest, kas see oli deklaratsiooni malloc või kas see siis korstna. 652 00:54:40,780 --> 00:54:47,110 Iga massiiv on põhiliselt viit algust massiiv, 653 00:54:47,110 --> 00:54:53,640 ja siis mõni rida operatsiooni, mis tahes indekseerimine, lihtsalt läheb sinna massiivi teatud kompenseerida. 654 00:54:53,640 --> 00:55:05,360 >> Nii et kui ma ütlen midagi s [3]; seda läheb s ja loendamine 3 tähemärki sisse 655 00:55:05,360 --> 00:55:12,490 Nii s [3], on meil 0, 1, 2, 3, nii s [3] läheb viidatakse käesolevale l. 656 00:55:12,490 --> 00:55:20,460 [Üliõpilane] Ja me võiksime jõuda sama väärtusega tehes s + 3 ja seejärel sulgudes täht? 657 00:55:20,460 --> 00:55:22,570 Jah. 658 00:55:22,570 --> 00:55:26,010 See on samaväärne * (t + 3); 659 00:55:26,010 --> 00:55:31,240 ja see on igavesti ja alati samaväärne ükskõik, mida te teete. 660 00:55:31,240 --> 00:55:34,070 Sa ei pea kasutama sulg süntaks. 661 00:55:34,070 --> 00:55:37,770 Teil on alati võimalik kasutada * (id + 3) süntaks. 662 00:55:37,770 --> 00:55:40,180 Inimesed kipuvad nagu sulg süntaks, kuigi. 663 00:55:40,180 --> 00:55:43,860 [Üliõpilane] Nii et kõik massiivid on tegelikult lihtsalt suunanäitajaks. 664 00:55:43,860 --> 00:55:53,630 On väike erinevus, kui ütlen, int x [4]; >> [üliõpilane] Kas see luua mälu? 665 00:55:53,630 --> 00:56:03,320 [Bowden] See läheb luua 4 ints kohta virna, et 16 baiti üldine. 666 00:56:03,320 --> 00:56:05,700 See saab luua 16 baiti kohta virna. 667 00:56:05,700 --> 00:56:09,190 x ei salvestata kuhugi. 668 00:56:09,190 --> 00:56:13,420 See on lihtsalt sümbol viitab algust asi. 669 00:56:13,420 --> 00:56:17,680 Sest sa deklareeritud massiivi sees seda funktsiooni, 670 00:56:17,680 --> 00:56:22,340 mida tõlkija saab teha, on lihtsalt asendada kõik juhtumid muutuja x 671 00:56:22,340 --> 00:56:26,400 koos kus see juhtus otsustasime asetada need 16 baiti. 672 00:56:26,400 --> 00:56:30,040 Seda ei saa teha, et char * s, sest s on tegelik pointer. 673 00:56:30,040 --> 00:56:32,380 See on tasuta siis osutada muid asju. 674 00:56:32,380 --> 00:56:36,140 x on konstantne. Sul ei saa olla see punkt, et erinevad massiivi. >> [Üliõpilane] Okei. 675 00:56:36,140 --> 00:56:43,420 Aga see mõte, see indekseerimine, on sama sõltumata sellest, kas see on traditsiooniline massiivi 676 00:56:43,420 --> 00:56:48,230 või kui see on kursor midagi või kui see on kursor malloced massiivi. 677 00:56:48,230 --> 00:56:59,770 Ja tegelikult, see on nii samaväärsed, et see on ka sama asi. 678 00:56:59,770 --> 00:57:05,440 See tegelikult lihtsalt tõlgib, mis seal sees on sulgudes ja mis sellest järel sulgudes 679 00:57:05,440 --> 00:57:07,970 lisab need kokku ja dereferences. 680 00:57:07,970 --> 00:57:14,710 Nii et see on sama kehtib * (t + 3) või s [3]. 681 00:57:16,210 --> 00:57:22,090 [Üliõpilane] Kas teil on osuti osutab 2-mõõtmelise massiivi? 682 00:57:22,090 --> 00:57:27,380 >> See on raskem. Traditsiooniliselt ei ole. 683 00:57:27,380 --> 00:57:34,720 2-mõõtmeline massiiv on lihtsalt 1-mõõtmeline massiiv mõned mugav süntaks 684 00:57:34,720 --> 00:57:54,110 sest kui ma ütlen, int x [3] [3], see on tõesti vaid 1 rida koos 9 väärtused. 685 00:57:55,500 --> 00:58:03,000 Ja nii kui ma indeksi koostaja teab, mida ma mõtlen. 686 00:58:03,000 --> 00:58:13,090 Kui ma ütlen x [1] [2], see teab, et ma tahan minna teises reas, nii see läheb jäta esimesed 3, 687 00:58:13,090 --> 00:58:17,460 ja siis tahab teine ​​asi, et nii see läheb, et saada see üks. 688 00:58:17,460 --> 00:58:20,480 Aga see on ikkagi vaid ühe-mõõtmeline massiiv. 689 00:58:20,480 --> 00:58:23,660 Ja nii kui ma tahtsin anda osuti selle massiivi, 690 00:58:23,660 --> 00:58:29,770 Ütleksin int * p = x; 691 00:58:29,770 --> 00:58:33,220 Tüüpi x on lihtsalt - 692 00:58:33,220 --> 00:58:38,280 See on karm öelda tüüpi x kuna see on vaid sümbol ja see ei ole tegelik muutuja, 693 00:58:38,280 --> 00:58:40,140 kuid see on lihtsalt int *. 694 00:58:40,140 --> 00:58:44,840 x on lihtsalt kursor alguses seda. >> [Üliõpilane] Okei. 695 00:58:44,840 --> 00:58:52,560 Ja nii ma ei pääse [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Ma arvan, et tegemist on eriti süntaks tunnistamise pointer, 697 00:58:58,370 --> 00:59:12,480 midagi naeruväärne nagu int (* p [- midagi täiesti naeruväärne. Ma ei tea isegi. 698 00:59:12,480 --> 00:59:17,090 Aga seal on süntaks tunnistamise viiteid jms sulgudes ja asjad. 699 00:59:17,090 --> 00:59:22,960 See ei pruugi isegi lasta sul seda teha. 700 00:59:22,960 --> 00:59:26,640 Ma võiks tagasi vaadata midagi, mis ei ütle mulle tõtt. 701 00:59:26,640 --> 00:59:34,160 Ma vaatan seda hiljem, kui on süntaks punkti. Aga te ei näe seda. 702 00:59:34,160 --> 00:59:39,670 Ja isegi süntaks on nii arhailine, et kui te kasutate seda, inimesed on segaduses. 703 00:59:39,670 --> 00:59:43,540 Mitmemõõtmelise massiivi on päris haruldane, sest see on. 704 00:59:43,540 --> 00:59:44,630 Sa päris palju - 705 00:59:44,630 --> 00:59:48,490 Noh, kui sa teed maatriks asju ta ei kavatse olla haruldased, 706 00:59:48,490 --> 00:59:56,730 kuid C sa harva kavatsed kasutada mitmemõõtmelist massiivi. 707 00:59:57,630 --> 01:00:00,470 Jah. >> [Üliõpilane] Oletame, et teil on tõesti pikk massiiv. 708 01:00:00,470 --> 01:00:03,900 >> Nii et virtuaalne mälu tundub olevat kõik järjest, 709 01:00:03,900 --> 01:00:05,640 nagu elemente õigus teineteise kõrval, 710 01:00:05,640 --> 01:00:08,770 kuid füüsilist mälu, siis kas oleks võimalik, et tuleb lahku? >> Jah. 711 01:00:08,770 --> 01:00:16,860 Kuidas virtuaalmälu tööd on see lihtsalt eraldab - 712 01:00:19,220 --> 01:00:24,860 Ühiku jaotus on leht, mis kipub olema 4 kilobaiti, 713 01:00:24,860 --> 01:00:29,680 ja nii kui protsess ütleb, kuule, ma tahan kasutada seda mälu, 714 01:00:29,680 --> 01:00:35,970 operatsioonisüsteem läheb eraldada talle 4 kilobaiti selle väikese ploki mälu. 715 01:00:35,970 --> 01:00:39,100 Isegi kui kasutada ainult ühte vähe bait kogu ploki mälu, 716 01:00:39,100 --> 01:00:42,850 operatsioonisüsteem on annan ta täielikult 4 kilobaiti. 717 01:00:42,850 --> 01:00:49,410 Nii et mida see tähendab, ma oleks võinud - oletame, et see on minu stack. 718 01:00:49,410 --> 01:00:53,180 See virna võiks eraldada. Minu stack võiks olla megabaiti ja megabaiti. 719 01:00:53,180 --> 01:00:55,020 Minu stack võib olla tohutu. 720 01:00:55,020 --> 01:01:00,220 Aga korstnat ise tuleb jagada üksikuid lehti, 721 01:01:00,220 --> 01:01:09,010 mis siis, kui me vaatame siin oletame see on meie mälu, 722 01:01:09,010 --> 01:01:16,600 kui mul on 2 GB RAM, see on tegelik aadress 0 nagu 0. bait minu RAM, 723 01:01:16,600 --> 01:01:22,210 ja see on 2 gigabaiti kogu tee alla siit. 724 01:01:22,210 --> 01:01:27,230 Nii et see leht võib vastavad käesolevas lahtris siin. 725 01:01:27,230 --> 01:01:29,400 See leht võiks vastavad käesolevas lahtris siin. 726 01:01:29,400 --> 01:01:31,560 See võiks vastavad see siin. 727 01:01:31,560 --> 01:01:35,540 Nii et operatsioonisüsteem on vabalt määrata füüsilise mälu 728 01:01:35,540 --> 01:01:39,320 iga üksiku lehe meelevaldselt. 729 01:01:39,320 --> 01:01:46,180 Ja see tähendab, et kui see piir juhtub straddle massiiv, 730 01:01:46,180 --> 01:01:50,070 massiivi juhtub jätta selle ja õigus käesoleva järjekorras lehel 731 01:01:50,070 --> 01:01:54,460 siis massiivi saab olema jagatud füüsilist mälu. 732 01:01:54,460 --> 01:01:59,280 Ja siis kui sa väljud rakendusest, kui protsess lõpeb, 733 01:01:59,280 --> 01:02:05,690 Nende kaardistamisel saada kustutada ja siis on vabadus kasutada neid vähe plokid muid asju. 734 01:02:14,730 --> 01:02:17,410 Veel küsimusi? 735 01:02:17,410 --> 01:02:19,960 [Üliõpilane] pointer aritmeetika. >> Oh jah. 736 01:02:19,960 --> 01:02:28,410 Strings oli lihtsam, aga kui vaadata midagi ints, 737 01:02:28,410 --> 01:02:35,000 Nii tagasi int x [4]; 738 01:02:35,000 --> 01:02:41,810 Kas see on massiiv või kas see on kursor malloced massiivi 4 täisarvud, 739 01:02:41,810 --> 01:02:47,060 see saab ravida samamoodi. 740 01:02:50,590 --> 01:02:53,340 [Üliõpilane] Nii massiivid asuvad hunnik? 741 01:03:01,400 --> 01:03:05,270 [Bowden] massiivid on mitte hunnik. >> [Üliõpilane] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Seda tüüpi massiivi kipub olema korstnat 743 01:03:08,320 --> 01:03:12,220 kui sa tunnistada seda - ignoreerides globaalsed muutujad. Ärge kasutage globaalsed muutujad. 744 01:03:12,220 --> 01:03:16,280 Toas funktsioon ütlen int x [4]; 745 01:03:16,280 --> 01:03:22,520 See saab luua 4-täisarv blokeerida korstnat selle massiivi. 746 01:03:22,520 --> 01:03:26,960 Aga see malloc (4 * sizeof (int)); läheb minna laduma. 747 01:03:26,960 --> 01:03:31,870 Aga pärast seda punkti ma saan kasutada x ja p üsna sama viise, 748 01:03:31,870 --> 01:03:36,140 välja arvatud erandid ma enne ütlesin umbes võite ümber jaotada lk. 749 01:03:36,140 --> 01:03:40,960 Tehniliselt nende suurused on mõnevõrra erinevad, kuid see on täiesti ebaoluline. 750 01:03:40,960 --> 01:03:43,310 Sa ei kasuta tegelikult oma suurused. 751 01:03:48,020 --> 01:03:56,810 Lk võin öelda p [3] = 2 või x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Võite kasutada neid täpselt samal viisil. 753 01:03:59,680 --> 01:04:01,570 Nii pointer aritmeetika nüüd - Jah. 754 01:04:01,570 --> 01:04:07,390 [Üliõpilane] Kas sa ei pea tegema p * kui teil on sulgudes? 755 01:04:07,390 --> 01:04:11,720 Sulgudes on kaudne dereference. >> Okei. 756 01:04:11,720 --> 01:04:20,200 Tegelikult ka, mida sa räägid, kus sa saad mitmemõõtmelise massiivi 757 01:04:20,200 --> 01:05:02,650 koos suunanäitajaks, mida saate teha, on midagi sellist, ütleme, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Ma kirjutan selle kõik välja esimesena. 759 01:05:37,880 --> 01:05:41,020 Ma ei tahtnud, et üks. 760 01:05:41,020 --> 01:05:42,550 Okei. 761 01:05:42,550 --> 01:05:48,910 Mida ma tegin siin on - See peaks olema PP [i]. 762 01:05:48,910 --> 01:05:53,680 Nii et PP on viit kursor. 763 01:05:53,680 --> 01:06:02,420 Sa mallocing PP punkti massiivi 5 int tähte. 764 01:06:02,420 --> 01:06:10,950 Nii et mälu sul on stack lk 765 01:06:10,950 --> 01:06:20,150 See saab viidata massiivi 5 plokki, mis on kõik ise lähtekohtadeks. 766 01:06:20,150 --> 01:06:28,210 Ja siis kui ma malloc siia, ma malloc et iga üksik viiteid 767 01:06:28,210 --> 01:06:32,080 tuleks viidata eraldiseisva 4 baiti kohta hunnik. 768 01:06:32,080 --> 01:06:35,870 Nii viitab see 4 baiti. 769 01:06:37,940 --> 01:06:40,660 Ja see viitab eri 4 baiti. 770 01:06:40,660 --> 01:06:43,200 >> Ja kõik nad viitavad oma 4 baiti. 771 01:06:43,200 --> 01:06:49,080 See annab mulle viis seda mitmemõõtmelist asju. 772 01:06:49,080 --> 01:06:58,030 Võiksin öelda, PP, [3] [4], kuid nüüd see ei ole sama asi nagu mitmemõõtmelise massiivi 773 01:06:58,030 --> 01:07:05,390 sest mitmemõõtmelise massiivi see tõlgitud [3] [4] üheks paigutamisega x massiivi. 774 01:07:05,390 --> 01:07:14,790 See dereferences p, pöördub kolmanda indeks, siis dereferences et 775 01:07:14,790 --> 01:07:20,790 ja juurdepääsud - 4 oleks kehtetu - teine ​​indeks. 776 01:07:24,770 --> 01:07:31,430 Arvestades, et kui meil oli int x [3] [4] enne kui mitmemõõtmelise massiivi 777 01:07:31,430 --> 01:07:35,740 ja kui sa topelt sulg see on tõesti ainult üks dereference, 778 01:07:35,740 --> 01:07:40,490 sa pärast ühekordset kursor ja seejärel kompenseerida, 779 01:07:40,490 --> 01:07:42,850 see on tõesti 2D mudelit. 780 01:07:42,850 --> 01:07:45,840 Te järgite 2 eraldi suunanäitajaks. 781 01:07:45,840 --> 01:07:50,420 Nii see ka tehniliselt võimaldab teil on mitmemõõtmelise massiivi 782 01:07:50,420 --> 01:07:53,550 kus iga massiiv on erineva suurusega. 783 01:07:53,550 --> 01:07:58,000 Nii et ma arvan sakilised mitmemõõtmelise massiivi on, kuidas seda nimetatakse 784 01:07:58,000 --> 01:08:01,870 kuna tõesti esimene asi võiks anda midagi, millel on 10 elementi, 785 01:08:01,870 --> 01:08:05,540 Teine asi võiks anda midagi, mis on 100 elementi. 786 01:08:05,540 --> 01:08:10,790 [Üliõpilane] Kas on olemas piiratud hulk viiteid saab olema 787 01:08:10,790 --> 01:08:14,290 osutades muid viiteid? >> Ei 788 01:08:14,290 --> 01:08:17,010 Sul võib olla int ***** lk. 789 01:08:18,050 --> 01:08:23,760 Tagasi pointer aritmeetika - >> [üliõpilane] Oh. >> Jah. 790 01:08:23,760 --> 01:08:35,649 [Üliõpilane] Kui mul on int *** p ja siis ma teen viite mahavõtmine ja ma ütlen p * võrdub see väärtus, 791 01:08:35,649 --> 01:08:39,560 on see ainult kavatse teha 1 taseme viite mahavõtmine? >> Jah. 792 01:08:39,560 --> 01:08:43,340 Nii et kui ma tahan pääseda asi, mis viimase osuti osutab juures - 793 01:08:43,340 --> 01:08:46,210 Siis sa *** p. >> Okei. 794 01:08:46,210 --> 01:08:54,080 Nii et see on p punkti 1 blokk, punktide teise ploki, punktide teise blokeerida. 795 01:08:54,080 --> 01:09:02,010 Siis kui sa * p = midagi muud, siis muutuvad käesoleva 796 01:09:02,010 --> 01:09:13,640 Seni osutavad erinevad blokeerida. >> Okei. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Ja kui need olid malloced, siis on nüüd lekkinud mälu 798 01:09:17,649 --> 01:09:20,430 kui teil juhtub olema erinevaid viiteid nende 799 01:09:20,430 --> 01:09:25,270 kuna sa ei saa tagasi neid ka, et sa lihtsalt viskas ära. 800 01:09:25,270 --> 01:09:29,550 Pointer aritmeetika. 801 01:09:29,550 --> 01:09:36,310 int x [4]; läheb eraldada massiivi 4 täisarvud 802 01:09:36,310 --> 01:09:40,670 kus x läheb osutada alguses massiivi. 803 01:09:40,670 --> 01:09:50,420 Nii et kui ma ütlen midagi x [1]; ma tahan, et see tähendab minna teise täisarv massiivis, 804 01:09:50,420 --> 01:09:53,319 mis oleks see üks. 805 01:09:53,319 --> 01:10:04,190 Aga tõesti, see on 4 baiti arvesse array kuna see täisarv võtab kuni 4 baiti. 806 01:10:04,190 --> 01:10:08,470 Nii et korvata 1 tegelikult tähendab offset 1 807 01:10:08,470 --> 01:10:12,030 korda suurem tüübist olenemata massiiv on. 808 01:10:12,030 --> 01:10:17,170 See on hulga täisarvud, nii et ta teab, mida teha 1 korda suurus int, kui ta tahab korvata. 809 01:10:17,170 --> 01:10:25,260 Teine süntaks. Pea meeles, et see on samaväärne * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kui ma ütlen pointer + 1, mida see tulu on aadress, et osuti on hoidmiseks 811 01:10:35,250 --> 01:10:40,360 pluss 1 korda suurem tüüpi pointer. 812 01:10:40,360 --> 01:10:59,510 Nii et kui x = ox100, siis x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Ja saab kuritarvitada ja öelda midagi sellist char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 ja nüüd c saab olema sama aadress, kui x. 815 01:11:23,050 --> 01:11:26,040 c saab olema võrdne ox100, 816 01:11:26,040 --> 01:11:31,490 kuid c + 1 saab olema võrdne ox101 817 01:11:31,490 --> 01:11:38,030 alates pointer aritmeetika sõltub tüüpi pointer, et teil on lisades. 818 01:11:38,030 --> 01:11:45,390 Nii et c + 1, siis vaatab c, see char osuti, nii see läheb lisada 1 korda suurus char, 819 01:11:45,390 --> 01:11:48,110 mis on alati saab olema 1, nii saad 101, 820 01:11:48,110 --> 01:11:54,890 arvestades, et kui ma teen x, mis on endiselt 100, x + 1 saab olema 104. 821 01:11:56,660 --> 01:12:06,340 [Üliõpilane] Kas te kasutate c + +, et edendada oma pointer 1.? 822 01:12:06,340 --> 01:12:09,810 Jah, saab küll. 823 01:12:09,810 --> 01:12:16,180 Sa ei saa teha, et x, sest x on lihtsalt sümbol, see on pidev, sa ei saa muuta x. 824 01:12:16,180 --> 01:12:22,610 >> Aga c juhtub lihtsalt olema osuti, nii C + + on taiesti korraliult see juurdekasvu 1. 825 01:12:22,610 --> 01:12:32,440 Kui c olid lihtsalt int *, siis c + + oleks 104. 826 01:12:32,440 --> 01:12:41,250 + + Ei pointer aritmeetika nagu c + 1 oleks teinud pointer aritmeetika. 827 01:12:43,000 --> 01:12:48,870 See on tegelikult kuidas paljud asjad ühendamise omamoodi - 828 01:12:49,670 --> 01:12:55,710 Selle asemel, et luua koopiad asjad, võite selle asemel läbida - 829 01:12:55,710 --> 01:13:02,400 Nagu kui ma tahtsin taolist pool massiivi - Teeme kustutada osa sellest. 830 01:13:04,770 --> 01:13:10,520 Oletame, et ma tahtsin taolist pool massiivi sisse funktsioon. 831 01:13:10,520 --> 01:13:12,700 Mida ma edasi selle funktsiooni? 832 01:13:12,700 --> 01:13:17,050 Kui ma mööda x, olen möödaminnes sellele aadressile. 833 01:13:17,050 --> 01:13:23,780 Aga ma tahan taolist eelkõige aadress. Nii et mida ma peaksin edasi? 834 01:13:23,780 --> 01:13:26,590 [Üliõpilane] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Nii x + 2. Jah. 836 01:13:29,350 --> 01:13:31,620 See saab olema sellel aadressil. 837 01:13:31,620 --> 01:13:42,810 Sul ka väga sageli näen seda x [2] ja siis aadress, et. 838 01:13:42,810 --> 01:13:47,850 Nii et sa pead võtma aadress, sest sulg on kaudne dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] viitab väärtusele, mis on sellele kasti ja seejärel soovitud aadress, et kast, 840 01:13:53,250 --> 01:13:56,850 nii ütled ja x [2]. 841 01:13:56,850 --> 01:14:02,880 Nii et kuidas midagi Tarkvaraprojekteerimise kus soovid edastada pool nimekirja midagi 842 01:14:02,880 --> 01:14:08,790 sa tõesti lihtsalt liigu ja x [2], ja nüüd nii palju kui rekursiivne kõne puhul, 843 01:14:08,790 --> 01:14:12,510 minu uus massiiv hakkab seal. 844 01:14:12,510 --> 01:14:15,130 Viimase hetke küsimustele. 845 01:14:15,130 --> 01:14:20,050 [Üliõpilane] Kui me ei pane ampersand või - mis see pealkiri on? >> Star? 846 01:14:20,050 --> 01:14:23,200 [Üliõpilane] Star. >> Tehniliselt dereference operaator, kuid - >> [üliõpilane] dereference. 847 01:14:23,200 --> 01:14:29,310 >> Kui me ei pane täht või märk, mis juhtub, kui ma lihtsalt öelda y = x ja x on viit? 848 01:14:29,310 --> 01:14:34,620 Mis tüüpi on y? >> [Üliõpilane] ma lihtsalt öelda, et see on osuti 2. 849 01:14:34,620 --> 01:14:38,270 Nii et kui sa ütlesid y = x, nüüd x ja y viitavad sama asi. >> [Üliõpilane] punkti sama asi. 850 01:14:38,270 --> 01:14:45,180 Ja kui x on int pointer? >> Oleks kurta, sest sa ei saa määrata suunanäitajaks. 851 01:14:45,180 --> 01:14:46,540 [Üliõpilane] Okei. 852 01:14:46,540 --> 01:14:51,860 Pea meeles, et suunanäitajaks, kuigi me joonistame neid nooli, 853 01:14:51,860 --> 01:15:02,010 tegelikult kõik need poe - int * x - tegelikult kõik x on hoidmiseks on midagi ox100, 854 01:15:02,010 --> 01:15:06,490 mis me juhtuda esindama osutades blokk salvestatud 100. 855 01:15:06,490 --> 01:15:19,660 Nii et kui ma ütlen, int * y = x; Ma lihtsalt kopeerides ox100 arvesse y, 856 01:15:19,660 --> 01:15:24,630 mis me lihtsalt läheb esindama y, samuti osutades ox100. 857 01:15:24,630 --> 01:15:39,810 Ja kui ma ütlen int i = (int) x, siis ma ei kavatse salvestada mida iganes väärtus ox100 on 858 01:15:39,810 --> 01:15:45,100 sees, kuid nüüd läheb tuleb tõlgendada nii, täisarv asemel pointer. 859 01:15:45,100 --> 01:15:49,310 Aga sa pead valatud või muidu ta kurta. 860 01:15:49,310 --> 01:15:53,300 [Üliõpilane] Nii sa mõtled, et enamus - 861 01:15:53,300 --> 01:16:00,290 Kas see saab olema otsustav int x või valu int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Mida? 863 01:16:03,700 --> 01:16:07,690 [Üliõpilane] Okei. Pärast neid Sulgudes on seal saab olema x või ay seal? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] kas. x ja y on võrdsed. >> [Üliõpilane] Okei. 865 01:16:11,500 --> 01:16:14,390 Sest nad on nii suunanäitajaks. >> Jah. 866 01:16:14,390 --> 01:16:21,050 [Üliõpilane] Seega oleks salvestada kuueteistkümnendsüsteemis 100 täisarv vormi? >> [Bowden] Jah. 867 01:16:21,050 --> 01:16:23,620 Aga mitte väärtus iganes ta osutab. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Jah. >> [Üliõpilane] Nii lihtsalt aadressi täisarv vormi. Okei. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Kui sa tahad mõnda veider põhjus, 870 01:16:34,720 --> 01:16:38,900 võid ainult tegeleda viiteid ja kunagi tegelema täisarvud 871 01:16:38,900 --> 01:16:49,240 ja lihtsalt olla nagu int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Siis sa lähed, et saada tõesti segaduses kui pointer aritmeetika algab juhtub. 873 01:16:53,000 --> 01:16:56,570 Nii numbrid, et nad salvestada on mõttetu. 874 01:16:56,570 --> 01:16:58,940 See on lihtsalt, kuidas sa lõpuks tõlgendamisel. 875 01:16:58,940 --> 01:17:02,920 Nii et ma olen vaba kopeerida ox100 alates int * kuni keskmine, 876 01:17:02,920 --> 01:17:07,790 ja mina olen vaba määrata - Sa oled ilmselt hakka karjus jaoks ei casting - 877 01:17:07,790 --> 01:17:18,160 Ma olen vaba määrata midagi (int *) ox1234 sellesse suvaline int *. 878 01:17:18,160 --> 01:17:25,480 Nii ox123 on täpselt sama kehtib mälu aadressi on ja y. 879 01:17:25,480 --> 01:17:32,060 Ja y juhtub midagi tagastada, et on päris palju ox123. 880 01:17:32,060 --> 01:17:35,430 [Üliõpilane] Kas see oleks väga lahe viis minna kuueteistkümnendsüsteemis koma vormis, 881 01:17:35,430 --> 01:17:39,230 meeldib kui teil on osuti ja te enamus seda int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Te võite tõesti lihtsalt printida nagu printf. 883 01:17:44,860 --> 01:17:50,300 Oletame, et mul on int y = 100. 884 01:17:50,300 --> 01:18:02,700 Nii printf (% d \ n - kui sa peaksid juba teadma - printida, et kui täisarv,% x. 885 01:18:02,700 --> 01:18:05,190 Me lihtsalt printida nii kuueteistkümnendsüsteemis. 886 01:18:05,190 --> 01:18:10,760 Nii et osuti ei salvestatud kuueteistkümnendsüsteemi, 887 01:18:10,760 --> 01:18:12,960 ja täisarv ei salvestata kohaga. 888 01:18:12,960 --> 01:18:14,700 Kõik on salvestatud binaarne. 889 01:18:14,700 --> 01:18:17,950 See on lihtsalt, et meil on kombeks näidata osuti nagu kuueteistkümnendsüsteemis 890 01:18:17,950 --> 01:18:23,260 sest me mõtleme asjad need 4-ploki, 891 01:18:23,260 --> 01:18:25,390 ja mälu aadresse kipuvad olema tuttav. 892 01:18:25,390 --> 01:18:28,890 Me oleme nagu, kui see algab bf, siis see juhtub olema pinu. 893 01:18:28,890 --> 01:18:35,560 Nii et see on lihtsalt meie tõlgendus osuti nagu kuueteistkümnendsüsteemis. 894 01:18:35,560 --> 01:18:39,200 Okei. Kõik viimase küsimusi? 895 01:18:39,200 --> 01:18:41,700 >> Ma tulen siia natuke pärast, kui teil on midagi muud. 896 01:18:41,700 --> 01:18:46,070 Ja ongi lõpuks see. 897 01:18:46,070 --> 01:18:48,360 >> [Üliõpilane] Jee! [Aplaus] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]