1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [4 skirsnis - patogiau] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvardo universiteto] 3 00:00:04,850 --> 00:00:07,370 [Tai CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Mes turime Viktorina rytoj, tuo atveju, jei nežinojo, kad vaikinai. 5 00:00:14,810 --> 00:00:20,970 Tai iš esmės viską, ką galėjo matyti klasėje arba turėjo matyti klasėje. 6 00:00:20,970 --> 00:00:26,360 Tai apima nurodymus, nors jie yra labai neseniai tema. 7 00:00:26,360 --> 00:00:29,860 Jūs bent jau turėtų suprasti aukšto lygio. 8 00:00:29,860 --> 00:00:34,760 Nieko, kad praėjo per klasėje, jūs turite suprasti, kad viktorina. 9 00:00:34,760 --> 00:00:37,320 Taigi, jei turite klausimų dėl jų, jūs galite paprašyti juos dabar. 10 00:00:37,320 --> 00:00:43,280 Bet tai bus labai studentas vadovaujamos sesija, kur jus vaikinai užduoti klausimus, 11 00:00:43,280 --> 00:00:45,060 todėl tikiuosi, žmonės turi klausimų. 12 00:00:45,060 --> 00:00:48,020 Ar kas nors turite klausimų? 13 00:00:49,770 --> 00:00:52,090 Taip. >> [Studentas] Ar jūs einate per rodykles naujo? 14 00:00:52,090 --> 00:00:54,350 Aš eisiu per rodykles. 15 00:00:54,350 --> 00:00:59,180 Visi savo kintamiesiems nebūtinai gyvena atmintyje, 16 00:00:59,180 --> 00:01:04,450 bet paprastai jums nereikia nerimauti, kad ir jūs tiesiog pasakyti, x + 2 ir y + 3 17 00:01:04,450 --> 00:01:07,080 ir kompiliatorių bus išsiaiškinti, kur viskas gyvena už jus. 18 00:01:07,080 --> 00:01:12,990 Kai jūs susiduriame su rodyklės, dabar jūs aiškiai naudojant šias atminties adresus. 19 00:01:12,990 --> 00:01:19,800 Taigi vienas kintamasis bus tik kada nors gyvena vienu adresu, bet kuriuo metu. 20 00:01:19,800 --> 00:01:24,040 , Jei norime paskelbti žymeklį, kas tipo atrodys? 21 00:01:24,040 --> 00:01:26,210 >> Noriu paskelbti rodyklė p. Ką tipo atrodo? 22 00:01:26,210 --> 00:01:33,530 [Studentas] int * p. >> Taip. Taigi, int * p. 23 00:01:33,530 --> 00:01:38,030 Ir kaip padaryti, kad ji nurodo x? >> [Studentas] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Taigi Ampersand yra tiesiog vadinama operacijų vykdytojo adresas. 25 00:01:45,300 --> 00:01:50,460 Taigi, kai aš sakau, ir X tai vis kintamojo x atminties adresą. 26 00:01:50,460 --> 00:01:56,790 Taigi dabar turiu žymiklį P ir bet kur, mano kodas galiu naudoti * P 27 00:01:56,790 --> 00:02:02,960 arba aš galėtų naudoti x ir jis bus lygiai toks pats dalykas. 28 00:02:02,960 --> 00:02:09,520 (* P). Kas tai yra daro? Ką reiškia, kad žvaigždės? 29 00:02:09,520 --> 00:02:13,120 [Studentas] Tai reiškia, kad tuo momentu, vertę. >> Taip. 30 00:02:13,120 --> 00:02:17,590 Taigi, jei pažvelgsime į tai, jis gali būti labai naudinga atkreipti dėmesį į diagramas 31 00:02:17,590 --> 00:02:22,230 kur tai yra šiek tiek atminties dėžutė x, kuris atsitinka vertės 4, 32 00:02:22,230 --> 00:02:25,980 tada mes turime šiek tiek atminties dėžutę p, 33 00:02:25,980 --> 00:02:31,590 ir taip p-X, todėl mes nubrėžti strėlę iš p-X. 34 00:02:31,590 --> 00:02:40,270 Taigi, kai mes sakome, * p mes sakome eiti į langelį, kad yra p. 35 00:02:40,270 --> 00:02:46,480 Žvaigždė yra sekti rodyklę ir tada daryti ką nori su tame langelyje. 36 00:02:46,480 --> 00:03:01,090 Taigi, galiu pasakyti * p = 7 ir, kad eis į lauką, kad yra X ir pakeisti, kad iki 7. 37 00:03:01,090 --> 00:03:13,540 Ar galėčiau pasakyti, int z = * p * 2 Tai painu, nes tai žvaigždė, žvaigždė. 38 00:03:13,540 --> 00:03:19,230 Žvaigždė dereferencing p, kita žvaigždė padauginus iš 2. 39 00:03:19,230 --> 00:03:26,780 Atkreipkite dėmesį, aš galėjo lygiai taip pat pakeitė * P x. 40 00:03:26,780 --> 00:03:29,430 Jūs galite juos naudoti tokiu pačiu būdu. 41 00:03:29,430 --> 00:03:38,000 Ir vėliau į I psl tašką, gali turėti visiškai naujas dalykas. 42 00:03:38,000 --> 00:03:42,190 Aš galiu tik pasakyti, p = &z; 43 00:03:42,190 --> 00:03:44,940 Taigi, dabar p nebėra taškų-X, ji nurodo iki z. 44 00:03:44,940 --> 00:03:50,510 Ir bet kuriuo metu, kai aš * P, tai tas pats, kaip padaryti z. 45 00:03:50,510 --> 00:03:56,170 Taigi naudingas dalykas, apie tai, kai mes pradėti gauti į funkcijas. 46 00:03:56,170 --> 00:03:59,790 >> Tai koks nenaudingas deklaruoti rodyklę, kuri nukreipia į kažką 47 00:03:59,790 --> 00:04:03,140 ir tada jūs tiesiog dereferencing 48 00:04:03,140 --> 00:04:06,060 , kai galėjo naudoti originalų kintamąjį pradėti. 49 00:04:06,060 --> 00:04:18,190 Bet kai jūs gaunate į funkcijas - tarkim, mes turime tam tikrą funkciją, int foo, 50 00:04:18,190 --> 00:04:32,810 kad mano žymiklį ir tiesiog daro * P = 6; 51 00:04:32,810 --> 00:04:39,990 Kaip matėme anksčiau su apsikeitimo sandorio, jūs negalite padaryti veiksmingą apsikeitimo ir atskirą funkciją 52 00:04:39,990 --> 00:04:45,180 tik artimųjų sveikieji skaičiai, nes viskas C visada eina pagal vertę. 53 00:04:45,180 --> 00:04:48,360 , Net jei jūs artimųjų patarimų jums perduoti pagal vertę. 54 00:04:48,360 --> 00:04:51,940 Jis tiesiog taip atsitinka, kad šios vertybės yra atminties adresai. 55 00:04:51,940 --> 00:05:00,770 Taigi, kai aš sakau, foo (p); aš perduoti žymiklį į funkcijai foo 56 00:05:00,770 --> 00:05:03,910 ir tada foo daro * P = 6; 57 00:05:03,910 --> 00:05:08,600 Viduje šią funkciją, * p vis dar atitinka x, 58 00:05:08,600 --> 00:05:12,720 bet aš negaliu naudoti viduje šią funkciją X, nes tai nėra aprėptis per tą funkciją. 59 00:05:12,720 --> 00:05:19,510 Taigi * p = 6 yra vienintelis būdas aš galiu gauti prieigą vietos kintamąjį iš kitos funkcijos. 60 00:05:19,510 --> 00:05:23,600 Ar gerai, rodykles yra vienintelis būdas aš galiu gauti prieigą vietos kintamąjį iš kitos funkcijos. 61 00:05:23,600 --> 00:05:31,600 [Studentas] Tarkime, kad jūs norėjo grįžti rodyklę. Kaip tiksliai tai padaryti? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Grįžti rodyklę, kaip kažką panašaus į int y = 3; Return & m? >> [Studentas] Yeah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Gerai. Jūs niekada neturėtų daryti. Tai yra blogai. 64 00:05:48,480 --> 00:05:59,480 Manau, aš mačiau šių paskaitų skaidrės, pradėjau matyti visą šią diagramą atminties 65 00:05:59,480 --> 00:06:02,880 kur čia jūs turite Atmintis Adresų 0 66 00:06:02,880 --> 00:06:09,550 ir žemyn, čia jūs turite Atmintis Adresų 4 koncertai arba 2 į 32. 67 00:06:09,550 --> 00:06:15,120 Taip, tada jūs turite kai kurių dalykų ir kai kurių dalykų ir tada jūs turite savo kamino 68 00:06:15,120 --> 00:06:21,780 ir jūs turite savo krūvos, kurį ką tik pradėjo mokytis apie, augo. 69 00:06:21,780 --> 00:06:24,390 [Studentas] Ar ne virš kamino krūva? 70 00:06:24,390 --> 00:06:27,760 >> Taip. Krūvos viršuje, ar ne? >> [Studentas] Na, jis įdėti 0 viršuje. 71 00:06:27,760 --> 00:06:30,320 [Studentas] O, jis įdėti 0 viršuje. >> [Studentas] O, gerai. 72 00:06:30,320 --> 00:06:36,060 Atsakomybės apribojimas: bet su CS50 jūs einate, kad ji tokiu būdu. >> [Studentas] Gerai. 73 00:06:36,060 --> 00:06:40,290 Tai tiesiog, kad, kai jūs pirmą kartą pamatęs kaminai, 74 00:06:40,290 --> 00:06:45,000 patinka, kai manote, kad kamino jūsų manymu, krovimas dalykų, vienas ant kito. 75 00:06:45,000 --> 00:06:50,810 Todėl mes linkę apversti tai aplink, kamino auga kaip kamino paprastai 76 00:06:50,810 --> 00:06:55,940 vietoj kamino nuleisti. >> [Studentas] Ar ne krūvos techniškai augti taip pat nors? 77 00:06:55,940 --> 00:07:01,100 Tai priklauso nuo to, ką reiškia augti. 78 00:07:01,100 --> 00:07:04,010 Kamino ir krūva visada auga skirtingomis kryptimis. 79 00:07:04,010 --> 00:07:09,420 Kamino visada auga ta prasme, kad ji augo 80 00:07:09,420 --> 00:07:12,940 į aukštojo atminties adresai ir krūvos auga 81 00:07:12,940 --> 00:07:17,260 tuo, kad jis auga link žemesnių atminties adresai. 82 00:07:17,260 --> 00:07:20,250 Taigi viršuje yra 0, o apačioje yra didelės atminties adresai. 83 00:07:20,250 --> 00:07:26,390 Jie abu auga, tik priešingomis kryptimis. 84 00:07:26,390 --> 00:07:29,230 [Studentas] Aš tiesiog reiškia, kad, nes jūs sakėte, jūs įtraukėte kamino apačioje 85 00:07:29,230 --> 00:07:33,640 nes atrodo, kad labiau intuityvus, nes kamino pradėti krūvos viršuje, 86 00:07:33,640 --> 00:07:37,520 krūvos viršuje savaime per, todėl that - >> Taip. 87 00:07:37,520 --> 00:07:44,960 Jūs taip pat manau, kaip vis daugiau ir didesnių krūvą, bet labiau, kad kamino. 88 00:07:44,960 --> 00:07:50,280 Taigi krūva yra vienas, kad mes tipo noriu parodyti auga. 89 00:07:50,280 --> 00:07:55,390 Bet visur jums atrodo kitaip ketiname parodyti Adresas 0 viršuje 90 00:07:55,390 --> 00:07:59,590 , o didžiausia atminties adresas apačioje, todėl tai yra jūsų įprastu vaizdu iš atminties. 91 00:07:59,590 --> 00:08:02,100 >> Ar turite klausimų? 92 00:08:02,100 --> 00:08:04,270 [Studentas] Ar galite papasakoti daugiau apie krūvą? 93 00:08:04,270 --> 00:08:06,180 Taip. Aš gausiu, kad per sekundę. 94 00:08:06,180 --> 00:08:12,220 Pirmą kartą, grįžta, kodėl grįžti ir Y yra blogas dalykas, 95 00:08:12,220 --> 00:08:18,470 kamino turite krūva kamino kadrų, kurie atstovauja visas funkcijas 96 00:08:18,470 --> 00:08:20,460 buvo vadinamas. 97 00:08:20,460 --> 00:08:27,990 Taigi ignoruojant ankstesnius dalykų, Jūsų žetonų viršus visada bus pagrindinė funkcija 98 00:08:27,990 --> 00:08:33,090 nes tai pirmoji funkcija yra vadinamas. 99 00:08:33,090 --> 00:08:37,130 Ir tada, kai skambinate kitą funkciją, kamino augs žemyn. 100 00:08:37,130 --> 00:08:41,640 Taigi, jei aš vadinu tam tikrą funkciją, foo, ir jis gauna savo kamino rėmo, 101 00:08:41,640 --> 00:08:47,280 jis gali paskambinti tam tikrą funkciją, baras, jis gauna savo kamino rėmo. 102 00:08:47,280 --> 00:08:49,840 Ir baras gali būti rekursinis ir ji galėtų vadintis, 103 00:08:49,840 --> 00:08:54,150 ir kad antrasis kvietimas juostoje ketinate gauti savo kamino rėmo. 104 00:08:54,150 --> 00:08:58,880 Ir taip, kas vyksta šių kamino kadrų yra visi lokalūs kintamieji 105 00:08:58,880 --> 00:09:03,450 ir visi funkcijos argumentų - 106 00:09:03,450 --> 00:09:08,730 Visi dalykai, kurie vietoje aprėptis šiai funkcijai eiti šių kamino kadrų. 107 00:09:08,730 --> 00:09:21,520 Taigi, tai reiškia, kad, kai aš sakiau, kažkas panašaus juostoje yra funkcija, 108 00:09:21,520 --> 00:09:29,270 Aš tik ketina paskelbti sveikasis skaičius ir tada grąžina rodyklę į tą sveikojo skaičiaus. 109 00:09:29,270 --> 00:09:33,790 Taigi, kur gi y gyventi? 110 00:09:33,790 --> 00:09:36,900 [Studentas] y gyvena juostoje. >> [Bowden] Yeah. 111 00:09:36,900 --> 00:09:45,010 Kažkur, šioje mažoje aikštėje atminties littler kvadratas, Y. 112 00:09:45,010 --> 00:09:53,370 Kai grįžtu & y, aš grįžti rodyklę į šį mažai atminties bloko. 113 00:09:53,370 --> 00:09:58,400 Bet tada, kai funkcija grąžina, jo kamino rėmas gauna popped kamino. 114 00:10:01,050 --> 00:10:03,530 Ir štai kodėl jis vadinamas kamino. 115 00:10:03,530 --> 00:10:06,570 Tai tarsi kamino duomenų struktūros, jei žinote, kas tai yra. 116 00:10:06,570 --> 00:10:11,580 Ar net kaip kamino padėklai visada yra pavyzdys, 117 00:10:11,580 --> 00:10:16,060 Pagrindinis ketina eiti ant dugno, tada pirmoji funkcija skambinate ketina eiti viršuje, kad, 118 00:10:16,060 --> 00:10:20,400 ir jūs negalite grįžti į pagrindinį, kol grįšite iš visų funkcijų, kurios buvo vadinama 119 00:10:20,400 --> 00:10:22,340 kad buvo pateikti ant jo. 120 00:10:22,340 --> 00:10:28,650 >> [Studentas] Taigi, jei tu padaryti grąžinti ir Y, kad vertė turi būti keičiamos be įspėjimo. 121 00:10:28,650 --> 00:10:31,290 Taip, it's - >> [studentas] Tai gali būti perrašyti. >> Taip. 122 00:10:31,290 --> 00:10:34,660 Tai visiškai - Jei bandysite ir 123 00:10:34,660 --> 00:10:38,040 Tai taip pat būtų int * bar, nes jis grąžina rodyklę, 124 00:10:38,040 --> 00:10:41,310 todėl jos grįžimo tipas yra int *. 125 00:10:41,310 --> 00:10:46,500 Jei bandote naudoti šios funkcijos grąžinamą reikšmę, tai neapibrėžta elgesys 126 00:10:46,500 --> 00:10:51,770 dėl to, kad rodyklė rodo į blogas atmintį. >> [Studentas] Gerai. 127 00:10:51,770 --> 00:11:01,250 Taigi, ką daryti, jei, pavyzdžiui, jūs pareiškė, int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Tai geriau. Taip. 129 00:11:03,740 --> 00:11:07,730 [Studentas] Mes kalbėjome apie tai, kaip kai mes vilkite dalykų mūsų šiukšlinę 130 00:11:07,730 --> 00:11:11,750 jie nėra faktiškai ištrinami; mes tiesiog prarasti savo patarimų. 131 00:11:11,750 --> 00:11:15,550 Taigi šiuo atveju mes iš tikrųjų ištrinti vertę ar ji vis dar ten atminties? 132 00:11:15,550 --> 00:11:19,130 Nes didžioji dalis, tai vyksta vis dar bus ten. 133 00:11:19,130 --> 00:11:24,220 Bet tarkime mes atsitiktų skambinti nors kitą funkciją, bazių. 134 00:11:24,220 --> 00:11:28,990 Baz ketina gauti savo kamino rėmą čia. 135 00:11:28,990 --> 00:11:31,470 Tai bus perrašyti visą šią medžiagą, 136 00:11:31,470 --> 00:11:34,180 ir tada, jei vėliau išbandyti ir naudoti pelės žymeklį, kad jūs turite prieš, 137 00:11:34,180 --> 00:11:35,570 ji nesiruošia būti ta pati vertė. 138 00:11:35,570 --> 00:11:38,150 Ji ketina pasikeitė tik todėl, kad jūs vadinamas funkcijos BAZ. 139 00:11:38,150 --> 00:11:43,080 [Studentas] Bet jeigu mes ne, tai mes vis dar galite gauti 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Panašu, jūs. 141 00:11:44,990 --> 00:11:49,670 Bet jūs negalite remtis, kad. C tiesiog sako neapibrėžtą elgesį. 142 00:11:49,670 --> 00:11:51,920 >> [Studentas] O, ji veikia. Gerai. 143 00:11:51,920 --> 00:11:58,190 Taigi, kai norite grįžti rodyklę, tai kur malloc ateina. 144 00:12:00,930 --> 00:12:15,960 Aš rašau iš tikrųjų tiesiog grįžti malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Mes pereiti malloc per sekundę, tačiau, malloc idėja yra visi lokalūs kintamieji 146 00:12:24,050 --> 00:12:26,760 visada eiti kamino. 147 00:12:26,760 --> 00:12:31,570 Nieko, kad malloced eina į krūvą, ir jis bus amžinai ir visada turi būti ant krūvos 148 00:12:31,570 --> 00:12:34,490 kol aiškiai jį išlaisvinti. 149 00:12:34,490 --> 00:12:42,130 Taigi, tai reiškia, kad, kai jūs malloc kažką, jis bus išgyventi po funkcija grąžina. 150 00:12:42,130 --> 00:12:46,800 [Studentas] Ar tai išgyventi po to, kai programa sustoja? >> No 151 00:12:46,800 --> 00:12:53,180 Gerai, kad jis bus ten, kol programa visą kelią padaryti veikia. >> Taip. 152 00:12:53,180 --> 00:12:57,510 Mes galime eiti per išsami informacija apie tai, kas atsitinka, kai programa sustoja. 153 00:12:57,510 --> 00:13:02,150 Jums gali tekti priminti man, bet tai yra visiškai atskiras dalykas. 154 00:13:02,150 --> 00:13:04,190 [Studentas] Taigi malloc sukuria rodyklę? >> Taip. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [studentas] Manau, kad malloc paskiria atminties bloką, kad žymeklis gali naudoti. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Aš noriu vėl tą diagramą. >> [Studentas] Taigi, nors ši funkcija veikia? 157 00:13:19,610 --> 00:13:26,430 [Studentas] Taip, malloc paskiria atminties blokas, kad jūs galite naudoti, 158 00:13:26,430 --> 00:13:30,470 ir tada ji grąžina pirmojo bloko tos atminties adresą. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Taip. Taigi, kai jūs, malloc, jūs greiferiniai tam tikrą atminties bloką 160 00:13:36,750 --> 00:13:38,260 , kad šiuo metu į krūvą. 161 00:13:38,260 --> 00:13:43,040 Jei krūva yra per maža, tada krūva yra tik augs, o jis auga šia linkme. 162 00:13:43,040 --> 00:13:44,650 Taigi tarkim krūva yra per mažas. 163 00:13:44,650 --> 00:13:49,960 Tada tai augti šiek tiek ir grąžina rodyklę į šio bloko, tiesiog išaugo. 164 00:13:49,960 --> 00:13:55,130 Kai jums free stuff, jūs padaryti daugiau vietos krūvos, 165 00:13:55,130 --> 00:14:00,030 taip, tada vėliau paskambinti malloc pakartotiniam atmintį, kurioje anksčiau buvo nepanaudota. 166 00:14:00,030 --> 00:14:09,950 Malloc ir nemokamas Svarbus dalykas, apie tai, kad ji suteikia jums visiškai kontroliuoti 167 00:14:09,950 --> 00:14:12,700 per šių atminties blokus gyvenimą. 168 00:14:12,700 --> 00:14:15,420 Globalūs kintamieji yra visuomet gyvas. 169 00:14:15,420 --> 00:14:18,500 Vietiniai kintamieji yra gyvas patenka į jų taikymo sritį. 170 00:14:18,500 --> 00:14:22,140 Kaip greitai, kaip jūs einate pro garbanotas petnešomis, vietos kintamieji yra mirę. 171 00:14:22,140 --> 00:14:28,890 Malloced atmintis yra gyvas, kai norite, kad jis būtų gyvas 172 00:14:28,890 --> 00:14:33,480 ir tada grąžinamas, kai jūs pasakyti, kad bus išleistas. 173 00:14:33,480 --> 00:14:38,420 Tie, kurie iš tikrųjų yra tik 3 tipų atminties, tikrai. 174 00:14:38,420 --> 00:14:41,840 Yra automatinis atminties valdymas, kuris yra kamino. 175 00:14:41,840 --> 00:14:43,840 Dalykų atsitikti automatiškai. 176 00:14:43,840 --> 00:14:46,910 Kai jūs sakote, int x, atmintis yra skirta int x. 177 00:14:46,910 --> 00:14:51,630 Kai x išeina iš taikymo sritį, atminties atsiėmimo x. 178 00:14:51,630 --> 00:14:54,790 Tada ten dinaminis atminties valdymas, o tai, ką malloc yra, 179 00:14:54,790 --> 00:14:56,740 kuris yra, kai jūs turite kontroliuoti. 180 00:14:56,740 --> 00:15:01,290 Jūs dinamiškai nuspręsti, kai atminties turėtų ir neturėtų būti skiriama. 181 00:15:01,290 --> 00:15:05,050 Ir tada ten statinis, kuris tiesiog reiškia, kad jis gyvena amžinai, 182 00:15:05,050 --> 00:15:06,610 visuotiniai kintamieji. 183 00:15:06,610 --> 00:15:10,240 Jie tiesiog visada atmintyje. 184 00:15:10,960 --> 00:15:12,760 >> Turite klausimų? 185 00:15:14,490 --> 00:15:17,230 [Studentas] Ar galite apibrėžti tik naudojant garbanotas petnešos blokas 186 00:15:17,230 --> 00:15:21,220 bet neturi turėti, jei ataskaitos arba while ar ko nors panašaus? 187 00:15:21,220 --> 00:15:29,130 Galite nustatyti blokas, kaip ir funkcijos, bet kad garbanotas petnešos. 188 00:15:29,130 --> 00:15:32,100 [Studentas] Taigi galite ne tik kaip atsitiktinių pora Garbanotasis petnešos savo kodą 189 00:15:32,100 --> 00:15:35,680 kurie turi vietos kintamieji? >> Taip, galite. 190 00:15:35,680 --> 00:15:45,900 Viduje int baras galėtume turėti {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Tai turėtų būti čia. 192 00:15:48,440 --> 00:15:52,450 Bet tai visiškai apibrėžia int y taikymo sritį. 193 00:15:52,450 --> 00:15:57,320 Po to antrą garbanotas petnešomis, y negali būti naudojama daugiau. 194 00:15:57,910 --> 00:16:00,630 Jūs beveik niekada tai padaryti, nors. 195 00:16:02,940 --> 00:16:07,370 Sugrįžimas į tai, kas atsitinka, kai programa baigiasi, 196 00:16:07,370 --> 00:16:18,760 rūšies klaidinga / pusė melą, kad mes suteikiame tam, kad tik būtų lengviau. 197 00:16:18,760 --> 00:16:24,410 Mes pasakyti, kad, kai paskirstyti atmintį 198 00:16:24,410 --> 00:16:29,860 jūs skirti šiek tiek RAM riekė tos kintamojo. 199 00:16:29,860 --> 00:16:34,190 Bet jūs tikrai ne tiesiogiai neliesti RAM kada nors savo programose. 200 00:16:34,190 --> 00:16:37,490 , Jei jūs manote apie tai, kaip aš patraukė 201 00:16:37,490 --> 00:16:44,330 Ir iš tikrųjų, jei jūs einate per GDB jums matyti tą patį. 202 00:16:51,120 --> 00:16:57,590 Nepriklausomai nuo to, kiek kartų jums paleisti savo programą arba kokia programa jūs naudojate, 203 00:16:57,590 --> 00:16:59,950 kamino visada bus pradėti - 204 00:16:59,950 --> 00:17:06,510 jūs visada vyksta, norėdami pamatyti kintamuosius aplink adresas oxbffff kažką. 205 00:17:06,510 --> 00:17:09,470 Tai paprastai kažkur tame regione. 206 00:17:09,470 --> 00:17:18,760 Bet kaip gali 2 programos galbūt turite patarimų į tą patį atminties? 207 00:17:20,640 --> 00:17:27,650 [Studentas] Yra keletas savavališkai pavadinimas kur oxbfff turėtų būti RAM 208 00:17:27,650 --> 00:17:31,320 kad iš tiesų gali būti skirtingose ​​vietose, priklausomai nuo to, kai funkcija buvo vadinama. 209 00:17:31,320 --> 00:17:35,920 Taip. Terminas yra virtualioji atmintis. 210 00:17:35,920 --> 00:17:42,250 Idėja yra ta, kad kiekvienas procesas, kiekviena programa, kuri veikia ant jūsų kompiuterio 211 00:17:42,250 --> 00:17:49,450 turi savo - įsivaizduokime, 32 bits - visiškai nepriklausomas adresų erdvę. 212 00:17:49,450 --> 00:17:51,590 Tai adresų erdvė. 213 00:17:51,590 --> 00:17:56,220 Ji turi savo visiškai nepriklausomas 4 gigabaitų naudoti. 214 00:17:56,220 --> 00:18:02,220 >> Taigi, jei jūs naudojate 2 programas vienu metu, tai programa mato 4 gigabitų į save, 215 00:18:02,220 --> 00:18:04,870 ši programa mano, kad 4 GB į save, 216 00:18:04,870 --> 00:18:07,720 ir tai yra neįmanoma šią programą, dereference rodyklė 217 00:18:07,720 --> 00:18:10,920 ir galų gale su atmintim iš šios programos. 218 00:18:10,920 --> 00:18:18,200 Ir virtualiosios atminties yra iš adresų erdvės procesų atvaizdavimą 219 00:18:18,200 --> 00:18:20,470 į faktinių dalykų RAM. 220 00:18:20,470 --> 00:18:22,940 Todėl žinoti, kad jūsų operacinė sistema, 221 00:18:22,940 --> 00:18:28,080 ei, kai šis vaikinas dereferences rodyklė oxbfff, kad iš tikrųjų reiškia 222 00:18:28,080 --> 00:18:31,040 kad jis nori RAM baitas 1000, 223 00:18:31,040 --> 00:18:38,150 kadangi, jei ši programa dereferences oxbfff, jis tikrai nori RAM baitas 10.000. 224 00:18:38,150 --> 00:18:41,590 Jie gali būti savavališkai toli vienas nuo kito. 225 00:18:41,590 --> 00:18:48,730 Tai net tiesa dalykų vienoje procesų adresų erdvę. 226 00:18:48,730 --> 00:18:54,770 Taip, kaip jis mato visus 4 gigabaitų į save, bet tarkim - 227 00:18:54,770 --> 00:18:57,290 [Studentas] Ar kiekvieną procesą 228 00:18:57,290 --> 00:19:01,350 Tarkime, jūs turite kompiuterį tik su 4 GB RAM. 229 00:19:01,350 --> 00:19:06,430 Ar kiekvienas procesas pamatyti visą 4 GB? >> Taip. 230 00:19:06,430 --> 00:19:13,060 Bet 4 GB mato yra melas. 231 00:19:13,060 --> 00:19:20,460 Tai tiesiog ji mano, kad ji turi visą šią atmintį todėl, kad jis nežino, bet koks kitas procesas. 232 00:19:20,460 --> 00:19:28,140 Tai bus tik naudoti kuo daugiau atminties, nes ji iš tikrųjų reikia. 233 00:19:28,140 --> 00:19:32,340 Operacinė sistema neduos RAM į šį procesą 234 00:19:32,340 --> 00:19:35,750 jei ji ne naudojant bet šioje atmintį visam regionui. 235 00:19:35,750 --> 00:19:39,300 Jis nesiruošia suteikti jai atminties tame regione. 236 00:19:39,300 --> 00:19:54,780 Bet idėja yra ta, kad aš bandau galvoti apie - Aš negaliu galvoti apie analogiją. 237 00:19:54,780 --> 00:19:56,780 Analogijos yra sunku. 238 00:19:57,740 --> 00:20:02,700 Vienas iš virtualiosios atminties klausimais arba vienas iš dalykų, tai sprendžiant 239 00:20:02,700 --> 00:20:06,810 yra, kad procesai turėtų būti visiškai nežino vienas nuo kito. 240 00:20:06,810 --> 00:20:12,140 Ir todėl jūs galite rašyti bet kokią programą, kad tik dereferences bet POINTER 241 00:20:12,140 --> 00:20:19,340 patinka tiesiog parašyti programą, kuri sako * (ox1234), 242 00:20:19,340 --> 00:20:22,890 ir tai, atminties adresas dereferencing 1234. 243 00:20:22,890 --> 00:20:28,870 >> Bet jis į operacinę sistemą, tada išversti ką 1234 priemones. 244 00:20:28,870 --> 00:20:33,960 Taigi, jei 1234 atsitinka, kad šis procesas būtų galiojantis atminties adresas, 245 00:20:33,960 --> 00:20:38,800 kaip tai kamino ar kažką, tai bus grąžinti tos atminties adresą vertę 246 00:20:38,800 --> 00:20:41,960 kiek procesas žino. 247 00:20:41,960 --> 00:20:47,520 Bet jei 1234 yra neteisingas adresas, kaip tai atsitinka su žeme 248 00:20:47,520 --> 00:20:52,910 čia nors dalelę atminties, kuri yra anapus kamino ir už krūvos 249 00:20:52,910 --> 00:20:57,200 o jūs nesate iš tikrųjų naudojamas, kad, tada, kad kai jums gauti dalykų, pavyzdžiui, segfaults 250 00:20:57,200 --> 00:21:00,260 , nes jūs liesdami atminties, kad jums neturėtų būti neliesti. 251 00:21:07,180 --> 00:21:09,340 Tai taip pat pasakytina 252 00:21:09,340 --> 00:21:15,440 32-bitų sistema, 32 bitų reiškia, kad turite 32 bitų nustatyti atminties adresą. 253 00:21:15,440 --> 00:21:22,970 Tai kodėl rodykles 8 baitai, nes 32 bitai yra 8 baitai - ar 4 baitų. 254 00:21:22,970 --> 00:21:25,250 Rodykles 4 baitai. 255 00:21:25,250 --> 00:21:33,680 Taigi, kai pamatysite kaip oxbfffff žymeklį, tai yra - 256 00:21:33,680 --> 00:21:40,080 Per kiekvienos konkrečios programos, galite tiesiog pastatyti bet kokį pasirinktą žymeklį, 257 00:21:40,080 --> 00:21:46,330 bet nuo ox0 jautis 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Studentas] Ar jums sako, kad jie 4 baitų? >> Taip. 259 00:21:49,180 --> 00:21:52,730 [Studentas] Tada kiekvienas baitas - >> [Bowden] Šešioliktainis. 260 00:21:52,730 --> 00:21:59,360 Šešioliktainis - 5, 6, 7, 8. Taigi rodykles jūs ketinate rodyti visada šešioliktainis. 261 00:21:59,360 --> 00:22:01,710 Tai tiesiog kaip mes klasifikuoti patarimų. 262 00:22:01,710 --> 00:22:05,240 Kas 2 skaitmenys šešioliktainių yra 1 baitas. 263 00:22:05,240 --> 00:22:09,600 Taigi ten bus 8 šešioliktainis skaičius 4 baitų. 264 00:22:09,600 --> 00:22:14,190 Todėl kiekvienas žymiklį ant 32-bit sistemos bus 4 baitai, 265 00:22:14,190 --> 00:22:18,550 tai reiškia, kad savo procesą galite sukurti bet kokį pasirinktą portą 4 baitai 266 00:22:18,550 --> 00:22:20,550 ir padaryti žymeklį iš jo, 267 00:22:20,550 --> 00:22:32,730 tai reiškia, kad kiek tai žino, ji gali spręsti visą 2 iki 32 baitų atminties. 268 00:22:32,730 --> 00:22:34,760 Nors jis ne iš tikrųjų turėti prieigą prie to, 269 00:22:34,760 --> 00:22:40,190 net jei jūsų kompiuteris turi tik 512 megabaitų, jis mano, kad tai, kad daug atminties. 270 00:22:40,190 --> 00:22:44,930 Ir operacinė sistema yra pakankamai protingas, kad ji skiria tik tai, ką jūs iš tikrųjų reikia. 271 00:22:44,930 --> 00:22:49,630 Ji ne tik eiti, oh, naują procesą: 4 koncertai. 272 00:22:49,630 --> 00:22:51,930 >> Taip. >> [Studentas] Ką jautis? Kodėl rašote? 273 00:22:51,930 --> 00:22:54,980 Tai tiesiog Šešioliktainius skaičius simbolis. 274 00:22:54,980 --> 00:22:59,590 Kai pamatysite numeris pradžią jautis, vėlesni dalykai yra šešioliktainis. 275 00:23:01,930 --> 00:23:05,760 [Studentas] Jums buvo paaiškinti apie tai, kas atsitinka, kai programa baigiama. >> Taip. 276 00:23:05,760 --> 00:23:09,480 Kas atsitinka, kai programa baigiasi yra operacinė sistema 277 00:23:09,480 --> 00:23:13,600 tik ištrina vaizdavimus, kad ji turi šiuos adresus, ir viskas. 278 00:23:13,600 --> 00:23:17,770 Operacinė sistema gali duoti, kad dabar tiesiog atminties į kitą programą naudoti. 279 00:23:17,770 --> 00:23:19,490 [Studentas] Gerai. 280 00:23:19,490 --> 00:23:24,800 Taigi, kai jūs skirti krūvos ar kamino ar globalių kintamųjų ar kas nors ką nors, 281 00:23:24,800 --> 00:23:27,010 jie visi tiesiog dingti kuo greičiau baigsis programa 282 00:23:27,010 --> 00:23:32,120 nes operacinė sistema dabar nemokamai duoti, kad atminties bet kokiu kitu procesu. 283 00:23:32,120 --> 00:23:35,150 [Studentas] Nors yra tikriausiai dar vertės parašyta? >> Taip. 284 00:23:35,150 --> 00:23:37,740 Vertybės yra tikėtina, vis dar ten. 285 00:23:37,740 --> 00:23:41,570 Tai tiesiog, kad jis ketina būti sunku gauti į juos. 286 00:23:41,570 --> 00:23:45,230 Tai daug sunkiau gauti į juos, nei ji yra gauti ištrintas failas 287 00:23:45,230 --> 00:23:51,450 ,, nes ištrintas failas rūšies sėdi ilgą laiką, ir kietąjį diską yra daug didesnis. 288 00:23:51,450 --> 00:23:54,120 Taigi jis ketina perrašyti skirtingų dalių atminties 289 00:23:54,120 --> 00:23:58,640 prieš tai atsitinka perrašyti atminties gabalą, kad ši byla turi būti ne. 290 00:23:58,640 --> 00:24:04,520 Tačiau pagrindinės atminties, RAM, jūs ciklą per daug greičiau, 291 00:24:04,520 --> 00:24:08,040 todėl vyksta labai greitai, bus perrašyti. 292 00:24:10,300 --> 00:24:13,340 Turite klausimų apie tai, ar kas nors kitas? 293 00:24:13,340 --> 00:24:16,130 [Studentas] Turiu klausimų apie skirtingą temą. >> Gerai. 294 00:24:16,130 --> 00:24:19,060 Ar kas nors turite klausimų apie tai? 295 00:24:20,170 --> 00:24:23,120 >> Gerai. Kita tema. >> [Studentas] Gerai. 296 00:24:23,120 --> 00:24:26,550 Buvau išgyvena kai kurie Practice Tests, 297 00:24:26,550 --> 00:24:30,480 ir vienas iš jų buvo kalbama apie sizeof 298 00:24:30,480 --> 00:24:35,630 ir vertė, kad ji grąžina arba skirtingų kintamųjų tipai. >> Taip. 299 00:24:35,630 --> 00:24:45,060 Ir jis sakė, kad tiek int, ir ilgai ir grąža 4, todėl jie abu 4 baitų ilgio. 300 00:24:45,060 --> 00:24:48,070 Ar yra koks nors skirtumas tarp int ir ilgą, ar tai tas pats? 301 00:24:48,070 --> 00:24:50,380 Taip, yra skirtumas. 302 00:24:50,380 --> 00:24:52,960 C standartas - 303 00:24:52,960 --> 00:24:54,950 Aš tikriausiai bus bałagan. 304 00:24:54,950 --> 00:24:58,800 C standartas tiesiog patinka tai, ką C yra oficialūs dokumentai C. 305 00:24:58,800 --> 00:25:00,340 Tai, ką ji sako. 306 00:25:00,340 --> 00:25:08,650 Taigi C standartas tiesiog sako, kad char bus amžinai ir visada bus 1 baitas. 307 00:25:10,470 --> 00:25:19,040 Viskas po to - trumpas yra visada tiesiog apibrėžiamas kaip yra didesnis nei arba lygus char. 308 00:25:19,040 --> 00:25:23,010 Tai gali būti griežtai didesnis nei bet ne teigiamas. 309 00:25:23,010 --> 00:25:31,940 Žiniasklaida yra tiesiog apibrėžiamas kaip yra didesnis nei arba lygus trumpas. 310 00:25:31,940 --> 00:25:36,210 Ir ilgas, tai tiesiog yra didesnis nei arba lygus int. 311 00:25:36,210 --> 00:25:41,600 Ir ilgai ilgai yra didesnis nei arba lygus ilgas. 312 00:25:41,600 --> 00:25:46,610 Taigi vienintelis dalykas, C standartas apibrėžia viską, kas yra santykinis rūšiavimas. 313 00:25:46,610 --> 00:25:54,880 Faktinė suma, atminties, kad viskas užima paprastai yra iki įgyvendinimo 314 00:25:54,880 --> 00:25:57,640 bet tai gana gerai apibrėžta šiame taške. >> [Studentas] Gerai. 315 00:25:57,640 --> 00:26:02,490 Taigi šortai beveik visada bus 2 baitai. 316 00:26:04,920 --> 00:26:09,950 Ints beveik visada bus 4 baitų. 317 00:26:12,070 --> 00:26:15,340 Long long beveik visada bus 8 baitai. 318 00:26:17,990 --> 00:26:23,160 Ir trokšta, tai priklauso nuo to, ar jūs naudojate 32-bitų arba 64 bitų sistemą. 319 00:26:23,160 --> 00:26:27,450 Taigi ilgai ketinate atitinka taikomos sistemos tipo. 320 00:26:27,450 --> 00:26:31,920 Jei naudojate 32-bit sistemą kaip Appliance, tai bus 4 baitų. 321 00:26:34,530 --> 00:26:42,570 Jei naudojate 64-bitų kaip pastarojo meto kompiuterių daug, tai bus 8 baitai. 322 00:26:42,570 --> 00:26:45,230 >> Ints beveik visada yra 4 baitų šiuo metu. 323 00:26:45,230 --> 00:26:47,140 Long long beveik visada yra 8 baitai. 324 00:26:47,140 --> 00:26:50,300 Praeityje, int naudojami tik 2 baitai. 325 00:26:50,300 --> 00:26:56,840 Bet pastebėsite, kad tai visiškai atitinka visus šių santykių yra didesnis kaip ir lygus. 326 00:26:56,840 --> 00:27:01,280 Tol, kol yra puikiai gali būti tokio pat dydžio kaip sveikasis skaičius, 327 00:27:01,280 --> 00:27:04,030 ir jis taip pat gali būti tokio pat dydžio kaip ilgai ilgai. 328 00:27:04,030 --> 00:27:11,070 Ir ji tiesiog taip atsitinka, kad 99,999% sistemų, ji ketina būti lygus 329 00:27:11,070 --> 00:27:15,800 int arba ilgai ilgai. Tai tiesiog priklauso nuo 32-bit ar 64-bitų. >> [Studentas] Gerai. 330 00:27:15,800 --> 00:27:24,600 Plaustai, kaip kablelio, bitų paskirta? 331 00:27:24,600 --> 00:27:27,160 Kaip kaip dvejetainis? >> Taip. 332 00:27:27,160 --> 00:27:30,570 Jums nereikia žinoti, kad CS50. 333 00:27:30,570 --> 00:27:32,960 Jums nereikia net sužinoti, kad 61. 334 00:27:32,960 --> 00:27:37,350 Nenorite mokytis, kad tikrai bet žinoma. 335 00:27:37,350 --> 00:27:42,740 Tai tik atstovavimas. 336 00:27:42,740 --> 00:27:45,440 Aš tiksliai pamiršti bitų sugauti. 337 00:27:45,440 --> 00:27:53,380 Slankiojo kablelio idėja yra tai, kad jums skirti tam tikrą skaičių lazdą - 338 00:27:53,380 --> 00:27:56,550 Iš esmės, viskas yra slankiojo kablelio formatu. 339 00:27:56,550 --> 00:28:05,600 Taigi jūs skirti tam tikrą skaičių lazdą numerį pati, kaip ir 1,2345. 340 00:28:05,600 --> 00:28:10,200 Aš niekada negali atstovauti daugiau kaip 5 skaitmenų skaičių. 341 00:28:12,200 --> 00:28:26,300 Tada jūs taip pat skirti tam tikro skaičiaus bitai, kad jis yra linkęs būti kaip 342 00:28:26,300 --> 00:28:32,810 jūs galite tik pereiti tam tikrą skaičių, kaip tai didžiausia eksponentė galite turėti, 343 00:28:32,810 --> 00:28:36,190 ir jūs galite eiti tik iki tam tikro eksponentė, 344 00:28:36,190 --> 00:28:38,770 patinka, kad mažiausias eksponentė galite turėti. 345 00:28:38,770 --> 00:28:44,410 >> Aš nepamenu, Tikslus bitai priskiriami visų šių vertybių, 346 00:28:44,410 --> 00:28:47,940 bet tam tikras bitų skaičius yra skirta 1,2345, 347 00:28:47,940 --> 00:28:50,930 kitas tam tikras bitų skaičius yra skirta į eksponentė 348 00:28:50,930 --> 00:28:55,670 ir tai tik įmanoma, atstovauti tam tikro dydžio eksponentų. 349 00:28:55,670 --> 00:29:01,100 [Studentas] ir du kartus? Yra tai, kad kaip papildomą ilgą plūdės? >> Taip. 350 00:29:01,100 --> 00:29:07,940 Tai tas pats, išskyrus dabar jūs naudojate 8 baitai vietoj 4 baitų plūdės. 351 00:29:07,940 --> 00:29:11,960 Dabar jūs galėsite naudoti 9 skaitmenų arba 10 skaitmenų, 352 00:29:11,960 --> 00:29:16,630 ir tai bus gali eiti iki 300, o ne 100. >> [Studentas] Gerai. 353 00:29:16,630 --> 00:29:21,550 Ir teka taip pat yra 4 baitų. >> Taip. 354 00:29:21,550 --> 00:29:27,520 Na, dar kartą, tai tikriausiai priklauso apskritai bendru įgyvendinimu, 355 00:29:27,520 --> 00:29:30,610 bet plūdės yra 4 baitai, dviviečiai 8. 356 00:29:30,610 --> 00:29:33,440 Dviviečiai kambariai yra vadinami dvigubai, nes jie yra dvigubai plaustų dydis. 357 00:29:33,440 --> 00:29:38,380 [Studentas] Gerai. Ir dukart padvigubėja? >> Nėra. 358 00:29:38,380 --> 00:29:43,660 Aš manau - >> [studentas] Kaip long long? >> Taip. Aš taip nemanau. Taip. 359 00:29:43,660 --> 00:29:45,950 [Studentas] Remiantis praėjusių metų bandymo buvo klausimas apie pagrindinės funkcijos 360 00:29:45,950 --> 00:29:49,490 , kurie turi būti dalis savo programą. 361 00:29:49,490 --> 00:29:52,310 Buvo atsakyta, kad ji neturi būti dalis savo programą. 362 00:29:52,310 --> 00:29:55,100 Kokia situacija? Tai, ką aš pamačiau. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Atrodo - >> [studentas] Kokia situacija? 364 00:29:59,090 --> 00:30:02,880 Ar turite šią problemą? >> [Studentas] Taip, aš tikrai gali traukti ją į viršų. 365 00:30:02,880 --> 00:30:07,910 Ji neturi būti, techniškai, bet iš esmės tai bus. 366 00:30:07,910 --> 00:30:10,030 [Studentas] Aš mačiau vieną dėl skirtingų metų. 367 00:30:10,030 --> 00:30:16,220 Tai buvo tarsi Tiesa ar klaidinga: galioja - >> O, c failas.? 368 00:30:16,220 --> 00:30:18,790 [Studentas] Bet c failas turi būti - [tiek kalbanti vienu metu - nesuprantamas] 369 00:30:18,790 --> 00:30:21,120 Gerai. Taigi, kad atskirai. 370 00:30:21,120 --> 00:30:26,800 >> C failas tiesiog turi būti funkcijų. 371 00:30:26,800 --> 00:30:32,400 Galite surinkti failą į mašininiu kodu, dvejetainiai, nepriklausomai, 372 00:30:32,400 --> 00:30:36,620 nesant vykdomąjį dar. 373 00:30:36,620 --> 00:30:39,420 Galioja vykdomąjį privalo turėti pagrindinę funkciją. 374 00:30:39,420 --> 00:30:45,460 Jūs galite rašyti 100, bet ne pagrindines funkcijas, 1 failas 375 00:30:45,460 --> 00:30:48,800 ir tada sudaryti, kad žemyn į dvejetainį 376 00:30:48,800 --> 00:30:54,460 tada rašote kitą failą, kad tik pagrindinis, bet ji ragina iš šių funkcijų krūva 377 00:30:54,460 --> 00:30:56,720 Šiame dvejetainiame failą per čia. 378 00:30:56,720 --> 00:31:01,240 Ir todėl, kai jūs padaryti vykdomąjį failą, kad kas Linker 379 00:31:01,240 --> 00:31:05,960 ji jungia šiuos 2 dvejetainius failus į vykdomąjį. 380 00:31:05,960 --> 00:31:11,400 Taigi c failas nereikia turėti pagrindinę funkciją. 381 00:31:11,400 --> 00:31:19,220 Ir dėl didelių kodų bazių pamatysite tūkstančius C bylų ir 1 Pagrindinė byla. 382 00:31:23,960 --> 00:31:26,110 Daugiau klausimų? 383 00:31:29,310 --> 00:31:31,940 [Studentas] buvo dar vienas klausimas. 384 00:31:31,940 --> 00:31:36,710 Jis sakė, kad sudarytojas. True arba false? 385 00:31:36,710 --> 00:31:42,030 Ir atsakymas yra klaidinga, ir supratau, kodėl tai ne kaip Apsukite metalinis garsas. 386 00:31:42,030 --> 00:31:44,770 Bet ką mes vadiname, kad, jei tai ne? 387 00:31:44,770 --> 00:31:49,990 Padaryti iš esmės yra tik - Matau, ką ji vadina jį. 388 00:31:49,990 --> 00:31:52,410 Bet jis tiesiog vykdo komandas. 389 00:31:53,650 --> 00:31:55,650 Padaryti. 390 00:31:58,240 --> 00:32:00,870 Galiu traukti tai padaryti. Taip. 391 00:32:10,110 --> 00:32:13,180 O, taip. Darome taip pat daro. 392 00:32:13,180 --> 00:32:17,170 Tai sako, kad padaryti naudingumo tikslas yra nustatyti automatiškai 393 00:32:17,170 --> 00:32:19,610 didelėje programoje vienetų reikia perkompiliavote 394 00:32:19,610 --> 00:32:22,350 ir išduoda komandas perkompiliuoti. 395 00:32:22,350 --> 00:32:27,690 Jūs galite padaryti, kad failus, kurie yra visiškai didžiulis. 396 00:32:27,690 --> 00:32:33,210 Padaryti žiūri failų laiko ir, kaip mes sakėme anksčiau, 397 00:32:33,210 --> 00:32:36,930 galite surinkti atskirus failus, ir tai nėra, kol gausite į Linker 398 00:32:36,930 --> 00:32:39,270 , kad jie sujungti į vykdomąjį. 399 00:32:39,270 --> 00:32:43,810 Taigi, jei turite 10 skirtingų failus ir padaryti pakeitimą, 1 iš jų, 400 00:32:43,810 --> 00:32:47,870 kas tada markė ruošiasi daryti tik perkompiliuoti, kad: 1 failas 401 00:32:47,870 --> 00:32:50,640 ir tada relink viskas kartu. 402 00:32:50,640 --> 00:32:53,020 Bet tai daug kvailesnis nei kad. 403 00:32:53,020 --> 00:32:55,690 Tai iki jums visiškai apibrėžia, kad tai, ką ji turėtų daryti. 404 00:32:55,690 --> 00:32:59,560 Jis pagal nutylėjimą turi galimybę pripažinti šį laiko spaudu stuff, 405 00:32:59,560 --> 00:33:03,220 , bet jūs galite rašyti markę failą nieko daryti. 406 00:33:03,220 --> 00:33:09,150 Galite rašyti, kad failą taip, kad, kai įvesite, jis tiesiog CD į kitą katalogą. 407 00:33:09,150 --> 00:33:15,560 Aš buvo gauti nusivylė, nes aš pakeisti halsą viskas viduje mano Appliance 408 00:33:15,560 --> 00:33:21,740 ir tada aš peržiūrėti PDF iš "Mac". 409 00:33:21,740 --> 00:33:30,720 >> Taigi aš einu į Ieškiklis Galiu padaryti Eiti, prisijungti prie serverio, 410 00:33:30,720 --> 00:33:36,950 ir aš prisijungti prie serverio yra mano prietaisą, ir tada aš atverti PDF 411 00:33:36,950 --> 00:33:40,190 , kad gauna surinkti LaTeX. 412 00:33:40,190 --> 00:33:49,320 Bet aš buvo gauti nusivylė, nes kiekvieną kartą, man reikia atnaujinti PDF 413 00:33:49,320 --> 00:33:53,900 Aš turėjau nukopijuokite jį į konkretų katalogą, kad ji galėtų pasiekti 414 00:33:53,900 --> 00:33:57,710 ir buvo gauti erzina. 415 00:33:57,710 --> 00:34:02,650 Taigi vietoj aš parašiau markę failą, kuriame jūs turite nustatyti, kaip ji daro ką. 416 00:34:02,650 --> 00:34:06,130 Kaip jūs darote tai yra PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Tiesiog kaip ir bet kuri kita markė failą - ar aš manau, jūs dar nematėte Padaryti failus, 418 00:34:10,090 --> 00:34:13,510 bet mes turime Prietaiso pasaulinį markę failą, tiesiog sako, 419 00:34:13,510 --> 00:34:16,679 jei sudarant C failą, naudokite Apsukite metalinis garsas. 420 00:34:16,679 --> 00:34:20,960 Ir todėl čia mano padaryti failą, kad aš, kad aš sakau, 421 00:34:20,960 --> 00:34:25,020 šį failą, jūs ketinate norite kompiliuoti su PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Ir todėl PDF lateksu, kad daro kompiliavimas. 423 00:34:27,889 --> 00:34:31,880 Padaryti, yra ne kompiliavimas. Jis tiesiog veikia šių komandų seka. 424 00:34:31,880 --> 00:34:36,110 Taigi ji veikia PDF LaTeX, tai kopijuoja į katalogą, noriu, kad jis bus nukopijuotas į 425 00:34:36,110 --> 00:34:38,270 tai CD į katalogą ir daro kitus dalykus, 426 00:34:38,270 --> 00:34:42,380 tačiau ji yra atpažinti, kada failo pakeitimus, 427 00:34:42,380 --> 00:34:45,489 ir, jei jis keičia, tada ji paleisti, kad jis turėjo paleisti komandas 428 00:34:45,489 --> 00:34:48,760 kai failo pakeitimus. >> [Studentas] Gerai. 429 00:34:50,510 --> 00:34:54,420 Aš nežinau, kur pasaulinės Padaryti failai man check it out. 430 00:34:57,210 --> 00:35:04,290 Kiti klausimai? Viskas iš praeities viktorinos? Bet žymeklis dalykų? 431 00:35:06,200 --> 00:35:08,730 Yra subtilių dalykų, su rodyklėmis, pavyzdžiui - 432 00:35:08,730 --> 00:35:10,220 Aš nesiruošia, kad būtų galima rasti Viktorina klausimą - 433 00:35:10,220 --> 00:35:16,250 bet kaip šis dalykas rūšiuoti. 434 00:35:19,680 --> 00:35:24,060 Įsitikinkite, kad jūs suprantate, kad, kai aš sakau, int * x * y - 435 00:35:24,890 --> 00:35:28,130 Tai nėra tiksliai nieko čia, I guess. 436 00:35:28,130 --> 00:35:32,140 Bet kaip ir * x * y, jie yra 2 kintamieji, kurie yra ant kamino. 437 00:35:32,140 --> 00:35:37,220 Kai aš sakau, x = malloc (sizeof (int)), x yra kamino kintamasis, 438 00:35:37,220 --> 00:35:41,180 malloc kai per krūvą blokas, ir mes x tašką, į krūvą. 439 00:35:41,180 --> 00:35:43,900 >> Kad kažkas Stack į krūvą. 440 00:35:43,900 --> 00:35:48,100 , Kai jūs malloc nieko, jūs neišvengiamai ją saugoti viduje rodykle. 441 00:35:48,100 --> 00:35:55,940 Taip, kad žymeklis yra ant kamino, malloced blokas krūvos. 442 00:35:55,940 --> 00:36:01,240 Daug žmonių susipainioti ir sako, int * x = malloc, x yra krūvos. 443 00:36:01,240 --> 00:36:04,100 Nr KAS YRA X nurodo krūvą. 444 00:36:04,100 --> 00:36:08,540 x savaime yra kamino, išskyrus atvejus, kai dėl kokios nors priežasties jūs turite x pasaulinį kintamąjį, 445 00:36:08,540 --> 00:36:11,960 tokiu atveju tai atsitinka būti kitoje atminties regione. 446 00:36:13,450 --> 00:36:20,820 Taigi sekti šios dėžutės ir rodyklė diagramos yra gana įprasta, kad viktorina. 447 00:36:20,820 --> 00:36:25,740 Arba, jei tai ne viktorina 0, ji bus Quiz 1. 448 00:36:27,570 --> 00:36:31,940 Jūs turėtumėte žinoti, kad visų šių, rengdamas veiksmus 449 00:36:31,940 --> 00:36:35,740 , nes jums turėjo atsakyti į klausimus dėl šių. Taip. 450 00:36:35,740 --> 00:36:38,940 [Studentas] Ar mes galime eiti per šių žingsnių - >> Žinoma. 451 00:36:48,340 --> 00:36:58,640 Prieš žingsnių ir kaupimo turime išankstinio apdorojimo, 452 00:36:58,640 --> 00:37:16,750 sudarant, montavimas, ir susiejimas. 453 00:37:16,750 --> 00:37:21,480 Pirminio apdorojimo. Ką daryti? 454 00:37:29,720 --> 00:37:32,290 Tai lengviausias žingsnis - gerai, o ne kaip 455 00:37:32,290 --> 00:37:35,770 tai nereiškia, kad tai turėtų būti akivaizdu, tačiau tai lengviausias žingsnis. 456 00:37:35,770 --> 00:37:38,410 Jus vaikinai gali įgyvendinti patys. Taip. 457 00:37:38,410 --> 00:37:43,410 [Studentas] Paimkite, ką jūs turite savo yra kaip tai ir kopijuoja, ir tada taip pat apibrėžia. 458 00:37:43,410 --> 00:37:49,250 Jis ieško dalykų, pavyzdžiui, # include # define, 459 00:37:49,250 --> 00:37:53,800 ir tai tik kopijos ir pastos, kas tai iš tikrųjų reiškia. 460 00:37:53,800 --> 00:37:59,240 Taigi, kai jūs sakote # include cs50.h Preprocesorius yra kopijavimas ir įklijuoti cs50.h 461 00:37:59,240 --> 00:38:01,030 į tos linijos. 462 00:38:01,030 --> 00:38:06,640 Kai jūs sakote, # define x būti 4 Preprocesorius eina per visą programos 463 00:38:06,640 --> 00:38:10,400 ir pakeičia visus su 4 x atvejus. 464 00:38:10,400 --> 00:38:17,530 Taigi Preprocesorius mano galiojantį C failą ir išveda galiojantį C failą 465 00:38:17,530 --> 00:38:20,300 , kur viskas buvo nukopijuoti ir įklijuoti. 466 00:38:20,300 --> 00:38:24,230 Taigi dabar kompiliavimas. Ką daryti? 467 00:38:25,940 --> 00:38:28,210 [Studentas] Jis eina iš C į dvejetainį. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Tai nereiškia, pereiti visą kelią į dvejetainį. 469 00:38:30,970 --> 00:38:34,220 [Studentas] mašininiu kodu tada? >> Tai ne kompiuterinio kodo pavidalu. 470 00:38:34,220 --> 00:38:35,700 [Studentas] Asamblėja? >> Asamblėja. 471 00:38:35,700 --> 00:38:38,890 Jis eina į asamblėjos iki jis eina visą kelią iki C kodas, 472 00:38:38,890 --> 00:38:45,010 ir daugeliu kalbų, padaryti kažką panašaus į tai. 473 00:38:47,740 --> 00:38:50,590 Pasirinkti bet kokį aukšto lygio kalba, ir jei jūs ketinate sudaryti, 474 00:38:50,590 --> 00:38:52,390 tai gali sudaryti pakopomis. 475 00:38:52,390 --> 00:38:58,140 Pirmiausia ji ketina sudaryti Python C, vadinasi, jis ketina sudaryti C į surinkimo, 476 00:38:58,140 --> 00:39:01,600 ir tada Asamblėja ketina gauti išverstas į dvejetainį. 477 00:39:01,600 --> 00:39:07,800 Taigi sudarant ketina pareikšti iš C asamblėjos. 478 00:39:07,800 --> 00:39:12,130 Paprastai reiškia žodis sudarant iš aukštesnio lygio 479 00:39:12,130 --> 00:39:14,340 žemesnio lygio programavimo kalba. 480 00:39:14,340 --> 00:39:19,190 Taigi tai yra tik žingsnis duomenims rengti, jeigu jums pradėti aukšto lygio kalba 481 00:39:19,190 --> 00:39:23,270 ir galų gale žemo lygio kalba, ir tai, kodėl žingsnis yra vadinamas sudarant. 482 00:39:25,280 --> 00:39:33,370 [Studentas] Per sudarant, tarkime, kad jūs padaryti # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Ar sudarytojas perkompiliuoti cs50.h, kaip ir funkcijų, kurios yra ten, 484 00:39:42,190 --> 00:39:45,280 ir išversti, kad į Asamblėjos kodas, taip pat, 485 00:39:45,280 --> 00:39:50,830 ar ji nukopijuokite ir įklijuokite kažką, kad buvo iš anksto Asamblėja? 486 00:39:50,830 --> 00:39:56,910 cs50.h bus gana daug niekada baigti asamblėjos. 487 00:39:59,740 --> 00:40:03,680 Funkcijos prototipų ir daiktų stuff like tik jums būti atsargūs. 488 00:40:03,680 --> 00:40:09,270 Jis užtikrina, kad kompiliatorius gali patikrinti tokius dalykus, kaip jūs skambinate funkcijas 489 00:40:09,270 --> 00:40:12,910 su teise grąžinimo tipų ir tinkamus argumentus ir kita. 490 00:40:12,910 --> 00:40:18,350 >> Taigi cs50.h bus apdorotų į failą, ir tada, kai ji manimi sudarant 491 00:40:18,350 --> 00:40:22,310 tai iš esmės išmesti po to, kai jis užtikrina, kad viskas yra vadinamas tinkamai. 492 00:40:22,310 --> 00:40:29,410 Bet apibrėžta CS50 bibliotekos funkcijas, kurios yra atskirai nuo cs50.h, 493 00:40:29,410 --> 00:40:33,610 tiems, nebus atskirai surinkti. 494 00:40:33,610 --> 00:40:37,270 Kad tikrai bus nusileisti susiejimo žingsnio, todėl mes gauti per sekundę. 495 00:40:37,270 --> 00:40:40,100 Bet pirmiausia, kas yra surinkimo? 496 00:40:41,850 --> 00:40:44,500 [Studentas] Asamblėja į dvejetainį? >> Taip. 497 00:40:46,300 --> 00:40:48,190 Montavimas. 498 00:40:48,190 --> 00:40:54,710 Mes vadiname tai sudarant nes Asamblėja yra beveik grynas vertimas iš dviejų. 499 00:40:54,710 --> 00:41:00,230 Yra labai mažai logika vyksta asamblėjos į dvejetainį. 500 00:41:00,230 --> 00:41:03,180 Tai tiesiog kaip žiūrint į lentelę, oh, mes turime šį nurodymą; 501 00:41:03,180 --> 00:41:06,290 , kuris atitinka į dvejetainį 01.110. 502 00:41:10,200 --> 00:41:15,230 Ir todėl failai, montavimas apskritai rezultatai yra o failai. 503 00:41:15,230 --> 00:41:19,020 O failai yra tai, ką mes buvo pasakyti prieš, 504 00:41:19,020 --> 00:41:21,570 kaip failas nereikia turėti pagrindinę funkciją. 505 00:41:21,570 --> 00:41:27,640 Kiekvienas failas gali būti rengiami O failo, kol jis galioja C failas. 506 00:41:27,640 --> 00:41:30,300 Jis gali būti rengiami Õ. 507 00:41:30,300 --> 00:41:43,030 Dabar susiejimas, kas iš tikrųjų duoda krūva o failai ir atneša juos į vykdomąjį. 508 00:41:43,030 --> 00:41:51,110 Ir kas susiejimas ar galite galvoti apie CS50 bibliotekoje O failo. 509 00:41:51,110 --> 00:41:56,980 Tai yra jau yra sudariusi dvejetainis failas. 510 00:41:56,980 --> 00:42:03,530 Ir taip, kai renka savo failą, jūsų hello.c, kuriame raginama GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c gauna parengė į hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o dabar dvejetainiu. 513 00:42:08,910 --> 00:42:12,830 Jis naudoja GetString, todėl ji turi pereiti į cs50.o 514 00:42:12,830 --> 00:42:16,390 ir Linker smooshes juos kartu ir kopijuoja į šį failą GetString 515 00:42:16,390 --> 00:42:20,640 ir išeina vykdomąjį, kuris turi visas funkcijas, ji turi. 516 00:42:20,640 --> 00:42:32,620 Taigi cs50.o yra ne iš tikrųjų O failas, bet jis yra pakankamai arti, kad nėra esminio skirtumo. 517 00:42:32,620 --> 00:42:36,880 Taigi susiejimas tik atneša daug failų krūva kartu 518 00:42:36,880 --> 00:42:41,390 kad atskirai yra visas funkcijas, man reikia naudoti 519 00:42:41,390 --> 00:42:46,120 ir sukuria vykdomąjį failą, kad tikrai bus paleisti. 520 00:42:48,420 --> 00:42:50,780 >> Ir kad taip pat tai, ką mes buvo pasakyti prieš 521 00:42:50,780 --> 00:42:55,970 , kai jūs galite turėti 1000 c failus, galite sudaryti juos visus o failai, 522 00:42:55,970 --> 00:43:00,040 kuris tikriausiai šiek tiek užtrukti, tada jūs pakeisite 1 c failas. 523 00:43:00,040 --> 00:43:05,480 Jums tik reikia perkompiliuoti, kad 1 C failą ir tada relink visa kita, 524 00:43:05,480 --> 00:43:07,690 susieti viską atgal kartu. 525 00:43:09,580 --> 00:43:11,430 [Studentas] Kai mes susiejimas, mes rašome lcs50? 526 00:43:11,430 --> 00:43:20,510 Taip, taip lcs50. , Kad laivo vėliavos signalai Linker, kad jums reikia, jungiantys šios bibliotekos. 527 00:43:26,680 --> 00:43:28,910 Turite klausimų? 528 00:43:41,310 --> 00:43:46,860 Mes perėjo dvejetainis, išskyrus tai, kad 5 sekundes Pirmoji paskaita? 529 00:43:50,130 --> 00:43:53,010 Aš taip nemanau. 530 00:43:55,530 --> 00:43:58,820 Turėtumėte žinoti, visi didžiojo Os, kad mes perėjo, 531 00:43:58,820 --> 00:44:02,670 ir jums turėtų būti suteikta galimybė, jei mes davė jums funkciją, 532 00:44:02,670 --> 00:44:09,410 jums turėtų galėti pasakyti, kad tai didelis O maždaug. Ar gerai, didelis O yra šiurkštus. 533 00:44:09,410 --> 00:44:15,300 Taigi, jei matote įdėtos kilpos, Looping per tą patį dalykų, 534 00:44:15,300 --> 00:44:22,260 kaip int i, i > [studentas] n kvadrato. >> Jis yra linkęs būti n kvadrato. 535 00:44:22,260 --> 00:44:25,280 Jei turite trigubas įdėtos, jis yra linkęs n kubeliais. 536 00:44:25,280 --> 00:44:29,330 Taip, kad dalykas rūšiuoti, jums turėtų būti suteikta iš karto. 537 00:44:29,330 --> 00:44:33,890 Įterpimo Rūšiuoti ir burbulas rūšiuoti jums reikia žinoti, ir sujungti rūšiuoti, ir visos tos. 538 00:44:33,890 --> 00:44:41,420 Tai lengviau suprasti, kodėl jie yra tie n kvadrato ir n log n ir visa tai 539 00:44:41,420 --> 00:44:47,810 , nes manau, kad po vienerių metų, kai mes iš esmės davė jums buvo viktorinoje 540 00:44:47,810 --> 00:44:55,050 burbuliukų Rūšiuoti įgyvendinimas ir tarė: "Kas yra šios funkcijos veikimo laikas?" 541 00:44:55,050 --> 00:45:01,020 Taigi, jei jūs atpažins jį kaip burbulas rūšiuoti, tada jūs galite iš karto pasakyti, n kvadrato. 542 00:45:01,020 --> 00:45:05,470 Bet jei jūs tiesiog žiūrėti į jį, jūs net reikia suvokti burbulas rūšiuoti; 543 00:45:05,470 --> 00:45:08,990 galite tiesiog pasakyti tai daro tai ir tai. Tai n kvadratu. 544 00:45:12,350 --> 00:45:14,710 [Studentas] Ar yra kietas pavyzdžių galite sugalvoti, 545 00:45:14,710 --> 00:45:20,370 kaip suprasti, panašią idėją? 546 00:45:20,370 --> 00:45:24,450 >> Nemanau, kad mes norėtume duoti jums jokių sunkius pavyzdžių. 547 00:45:24,450 --> 00:45:30,180 Burbulas rūšiuoti dalykas yra taip sunku, kaip mes norėtume eiti, 548 00:45:30,180 --> 00:45:36,280 ir net, kad taip ilgai, kaip jūs suprantate, kad jūs per masyvo iteravimu 549 00:45:36,280 --> 00:45:41,670 kiekvieno masyvo elemento, kuris bus kažkas, kad n kvadrato. 550 00:45:45,370 --> 00:45:49,940 Yra bendri klausimai, pavyzdžiui, čia mes turime - Oh. 551 00:45:55,290 --> 00:45:58,530 Tik kitą dieną, Doug teigė, "Aš išrado algoritmą, kuris gali rūšiuoti masyvo 552 00:45:58,530 --> 00:46:01,780 "N O (log n) laiko!" 553 00:46:01,780 --> 00:46:04,900 Taigi, kaip mes žinome, kad tai neįmanoma? 554 00:46:04,900 --> 00:46:08,850 [Nesigirdi studentas atsakas] >> Taip. 555 00:46:08,850 --> 00:46:13,710 Bent jau, turite paliesti kiekvieną elementą masyve, 556 00:46:13,710 --> 00:46:16,210 todėl neįmanoma rūšiuoti masyvo - 557 00:46:16,210 --> 00:46:20,850 Jei viskas yra nerūšiuotų tvarka, tada jūs ketinate būti neliesti viską masyve, 558 00:46:20,850 --> 00:46:25,320 todėl neįmanoma padaryti mažiau nei O n. 559 00:46:27,430 --> 00:46:30,340 [Studentas] Jūs mums parodė, kad pavyzdys, kad galėtų tai padaryti O n 560 00:46:30,340 --> 00:46:33,920 jei jūs naudojate daug atminties. >> Taip. 561 00:46:33,920 --> 00:46:37,970 Ir būdams - aš pamiršti, ką that - Ar skaičiuoti rūšiuoti? 562 00:46:47,360 --> 00:46:51,330 Hmm. Kad yra sveikasis skaičius rūšiavimo algoritmą. 563 00:46:59,850 --> 00:47:05,100 Aš ieškojau specialų pavadinimą, kad aš negalėjo prisiminti, kad praėjusią savaitę. 564 00:47:05,100 --> 00:47:13,000 Taip. Tai yra rūšių tipai, kuriuos gali atlikti dalykus Big O n. 565 00:47:13,000 --> 00:47:18,430 Tačiau yra apribojimai, kaip jūs galite naudoti tik sveikieji skaičiai iki tam tikro skaičiaus. 566 00:47:20,870 --> 00:47:24,560 Plius, jei bandote rūšiuoti kažką that 567 00:47:24,560 --> 00:47:30,750 Jei jūsų masyvas yra 012, -12, 151, 4 mln, 568 00:47:30,750 --> 00:47:35,120 tada, kad vienas elementas visiškai sužlugdyti visą rūšiavimą. 569 00:47:42,060 --> 00:47:44,030 >> Turite klausimų? 570 00:47:49,480 --> 00:47:58,870 [Studentas] Jei turite rekursinį funkciją ir jis tiesiog daro rekursinis skambučius 571 00:47:58,870 --> 00:48:02,230 per Grizimas, kad uodega rekursinis 572 00:48:02,230 --> 00:48:07,360 ir taip norėčiau, kad negalima naudoti daugiau atminties per runtime 573 00:48:07,360 --> 00:48:12,550 ar jis bent panašių atminties, kartotinis sprendimas? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Taip. 575 00:48:14,530 --> 00:48:19,840 Tai greičiausiai bus šiek tiek lėčiau, bet ne tikrai. 576 00:48:19,840 --> 00:48:23,290 Liekamosios rekursinis yra gana gera. 577 00:48:23,290 --> 00:48:32,640 Domina vėl kamino kadrų, galime pasakyti, kad mes turime pagrindinis 578 00:48:32,640 --> 00:48:42,920 ir mes turime LC juostą (int x) ar kažką. 579 00:48:42,920 --> 00:48:52,310 Tai nėra puikus rekursinis funkcija, tačiau grąža bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Taigi, akivaizdu, kad tai yra ydinga. Jums reikia bazinių atvejus ir kita. 581 00:48:57,620 --> 00:49:00,360 Tačiau čia yra idėja, kad tai yra uodega rekursinis, 582 00:49:00,360 --> 00:49:06,020 tai reiškia, kai pagrindinį skambučių juostą jis ketina gauti savo kamino rėmo. 583 00:49:09,550 --> 00:49:12,440 Šiuo kamino rėmo ten bus šiek tiek atminties blokas 584 00:49:12,440 --> 00:49:17,490 , kuris atitinka jos argumentas x. 585 00:49:17,490 --> 00:49:25,840 Ir taip tarkim pagrindinis atsitinka skambinti juostą (100); 586 00:49:25,840 --> 00:49:30,050 Taigi x yra ketina pradėti kaip 100. 587 00:49:30,050 --> 00:49:35,660 Jei kompiliatorius pripažįsta, kad tai uodega rekursinis funkcija, 588 00:49:35,660 --> 00:49:38,540 tada, kai juosta jos rekursinis kvietimas uždrausti, 589 00:49:38,540 --> 00:49:45,490 vietoj to, kad naują kamino rėmo, kuris yra kur kamino pradeda auga daugiausia, 590 00:49:45,490 --> 00:49:48,220 galų gale ji bus paleisti į krūvą ir tada jums segfaults 591 00:49:48,220 --> 00:49:51,590 nes visa atmintis prasideda susidūrimo. 592 00:49:51,590 --> 00:49:54,830 >> Taigi, vietoj to, kad savo kamino rėmo, jis gali suvokti, 593 00:49:54,830 --> 00:49:59,080 Ei, aš niekada iš tikrųjų reikia grįžti į šią kamino rėmo, 594 00:49:59,080 --> 00:50:08,040 todėl vietoj aš tiesiog pakeisti šį argumentą su 99 ir tada pradėti baras viso. 595 00:50:08,040 --> 00:50:11,810 Ir tada ji bus tai padaryti iš naujo ir jis pasieks grąžinimo juostą (x - 1), 596 00:50:11,810 --> 00:50:17,320 ir vietoj to, kad naują kamino rėmelį, jis bus tiesiog pakeisti savo dabartinę argumentą 98 597 00:50:17,320 --> 00:50:20,740 ir tada šokti atgal į pačioje pradžioje juostoje. 598 00:50:23,860 --> 00:50:30,430 Šios operacijos, pakeisti, kad 1 reikšmę į steką ir šokinėja atgal į pradžią, 599 00:50:30,430 --> 00:50:32,430 yra gana efektyvus. 600 00:50:32,430 --> 00:50:41,500 Taigi, ne tik tai tas pats atminties kaip atskira funkcija, kuri yra pasikartojantis 601 00:50:41,500 --> 00:50:45,390 , nes jūs tik naudojant 1 kamino kadrą, bet jūs ne kenčia praradimas 602 00:50:45,390 --> 00:50:47,240 skambinti funkcijas. 603 00:50:47,240 --> 00:50:50,240 Skambinimo funkcijos gali būti šiek tiek brangesnis, nes jis turi padaryti visą šią įrangą 604 00:50:50,240 --> 00:50:52,470 ir teardown ir visa tai stuff. 605 00:50:52,470 --> 00:50:58,160 Taigi tai uodega rekursija yra gera. 606 00:50:58,160 --> 00:51:01,170 [Studentas] Kodėl ji sukurti naujų priemonių? 607 00:51:01,170 --> 00:51:02,980 Nes ji suvokia, kad nereikia. 608 00:51:02,980 --> 00:51:07,800 Skambučių į baro tik grįžau rekursinis skambutį. 609 00:51:07,800 --> 00:51:12,220 Taip, kad nereikia nieko daryti su sugrįžimo vertę. 610 00:51:12,220 --> 00:51:15,120 Tai tik ketina nedelsiant grąžinti. 611 00:51:15,120 --> 00:51:20,530 Taigi, tai tik ketina pakeisti savo argumentams pagrįsti, ir pradėti iš naujo. 612 00:51:20,530 --> 00:51:25,780 Ir, jei jūs neturite uodega rekursinis versiją 613 00:51:25,780 --> 00:51:31,460 tada jūs gaunate visas šias juostas, kai ši juosta gražinimai 614 00:51:31,460 --> 00:51:36,010 ji turi grąžinti jo vertę šį vieną, tada, kad baras nedelsiant grąžina 615 00:51:36,010 --> 00:51:39,620 ir grąžina jo reikšmę į šį vieną, tada ji tiesiog ketina nedelsiant grąžinti 616 00:51:39,620 --> 00:51:41,350 ir grąžinti jo vertę šį vieną. 617 00:51:41,350 --> 00:51:45,350 Taigi, Jūs sutaupysite Popping visų šių dalykų, kamino 618 00:51:45,350 --> 00:51:48,730 , nes grąžina vertė yra tik ketina būti perduoti visą kelią atgal vistiek. 619 00:51:48,730 --> 00:51:55,400 Tad kodėl gi ne tiesiog pakeisti mūsų argumentus su atnaujinta argumentu, ir pradėti iš naujo? 620 00:51:57,460 --> 00:52:01,150 Jei funkcija nėra uodega rekursinis, jei jūs darote kažką panašaus - 621 00:52:01,150 --> 00:52:07,530 [Studentas], jei bar (x + 1). >> Taip. 622 00:52:07,530 --> 00:52:11,770 >> Taigi, jei jūs įtraukėte būklės, tada jūs darote kažką su sugrįžimo vertę. 623 00:52:11,770 --> 00:52:16,260 Ar net jei jūs tiesiog 2 grąžą * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Taigi dabar bar (x - 1) turi grįžti, kad ji galėtų apskaičiuoti 2 kartus, kad vertės, 625 00:52:23,560 --> 00:52:26,140 todėl dabar ji reikia savo atskirą kamino kadrą 626 00:52:26,140 --> 00:52:31,180 ir dabar, nesvarbu, kaip sunkiai jūs bandote, jūs ketinate reikia 627 00:52:31,180 --> 00:52:34,410 Tai ne uodega rekursinis. 628 00:52:34,410 --> 00:52:37,590 [Studentas] Ar aš pabandyti pareikšti rekursija, kad būtų siekiama uodegos rekursijos - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Idealiame pasaulyje, bet į CS50 jūs neturite. 630 00:52:43,780 --> 00:52:49,280 Siekiant gauti uodegos rekursija, iš esmės, jūs įsteigti papildomą argumentą 631 00:52:49,280 --> 00:52:53,550 , kai juosta bus int x į y 632 00:52:53,550 --> 00:52:56,990 ir y atitinka galutiniam dalykas, jūs norite grįžti. 633 00:52:56,990 --> 00:53:03,650 Taip, tada jūs ketinate būti grįžta juostą (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Taip, kad tik aukšto lygio, kaip jums paversti ką rekursinis uodega. 635 00:53:09,810 --> 00:53:13,790 Tačiau papildomos argumentas - 636 00:53:13,790 --> 00:53:17,410 Ir tada galų gale, kai jūs pasieksite savo pagrindinę bylą, jūs tiesiog grįžti y 637 00:53:17,410 --> 00:53:22,740 nes jūs kaupėsi per visą laikotarpį grąžos vertę, kurią norite. 638 00:53:22,740 --> 00:53:27,280 Jūs rūšies buvo tai daryti keletą kartų, tačiau naudojant rekursinių skambučius. 639 00:53:32,510 --> 00:53:34,900 Turite klausimų? 640 00:53:34,900 --> 00:53:39,890 [] Gal apie rodyklių aritmetinis studentas, pavyzdžiui, kai naudojant styginiams. >> Žinoma. 641 00:53:39,890 --> 00:53:43,610 Rodyklė aritmetika. 642 00:53:43,610 --> 00:53:48,440 Kai naudojant styginiams tai lengva,, nes stygos char žvaigždutės, 643 00:53:48,440 --> 00:53:51,860 simbolių yra amžinai ir visada vieną baitą 644 00:53:51,860 --> 00:53:57,540 ir todėl rodyklė aritmetinis reguliariai aritmetinis, kai jūs susiduriame su stygos. 645 00:53:57,540 --> 00:54:08,790 Tegul tiesiog pasakyti, char * s = "hello". 646 00:54:08,790 --> 00:54:11,430 Taigi mes turime atminties bloką. 647 00:54:19,490 --> 00:54:22,380 Ji turi 6 baitai, nes jūs visada reikia null terminatorius. 648 00:54:22,380 --> 00:54:28,620 Char * s ketina atkreipti dėmesį į šio masyvo pradžioje. 649 00:54:28,620 --> 00:54:32,830 Taigi taškai,. 650 00:54:32,830 --> 00:54:36,710 Dabar, tai yra iš esmės, kaip bet kokia matrica veikia, 651 00:54:36,710 --> 00:54:40,780 nepriklausomai nuo to, ar ji buvo malloc, ar tai dėl kamino grąža. 652 00:54:40,780 --> 00:54:47,110 Bet masyvas yra iš esmės rodyklė į masyvo pradžios, 653 00:54:47,110 --> 00:54:53,640 ir tada bet koks masyvas operacija, bet indeksavimo, tik vyksta į tą masyvo tam tikras kompensuoti. 654 00:54:53,640 --> 00:55:05,360 >> Taigi, kai aš pasakyti kažką panašaus į S [3]; tai vyksta s ir skaičiuoti 3 simbolių in 655 00:55:05,360 --> 00:55:12,490 Taigi [3], mes turime 0, 1, 2, 3, taip s [3] ketina perduoti šios l. 656 00:55:12,490 --> 00:55:20,460 [Studentas] Ir mes galime pasiekti tą pačią vertę atlikdami s + 3 ir skliaustus, žvaigždė? 657 00:55:20,460 --> 00:55:22,570 Taip. 658 00:55:22,570 --> 00:55:26,010 Tai prilygsta * (s + 3); 659 00:55:26,010 --> 00:55:31,240 ir tai yra amžinai ir visada ekvivalentas nesvarbu, ką jūs darote. 660 00:55:31,240 --> 00:55:34,070 Jums niekada nereikės naudoti laikiklį sintaksę. 661 00:55:34,070 --> 00:55:37,770 Jūs visada galite naudoti * sintaksė (-ai + 3). 662 00:55:37,770 --> 00:55:40,180 Žmonės linkę patinka laikiklis sintaksę, nors. 663 00:55:40,180 --> 00:55:43,860 [Studentas] Taigi visos matricos yra iš tikrųjų tik patarimų. 664 00:55:43,860 --> 00:55:53,630 Yra nedidelis skirtumas, kai aš sakau, int x [4]; >> [studentas] Ar tai sukurti atmintį? 665 00:55:53,630 --> 00:56:03,320 [Bowden], kad ketina sukurti 4 Ints kamino, kad 16 baitų bendras. 666 00:56:03,320 --> 00:56:05,700 Ji ketina sukurti 16 baitų kamino. 667 00:56:05,700 --> 00:56:09,190 x yra saugomi ne visur. 668 00:56:09,190 --> 00:56:13,420 Jis yra tik simbolis, nuoroda į dalykas pradžios. 669 00:56:13,420 --> 00:56:17,680 Nes jūs paskelbė masyvo viduje šią funkciją, 670 00:56:17,680 --> 00:56:22,340 sudarytojas ketina padaryti, tai tiesiog pakeisti visus atvejus kintamojo x 671 00:56:22,340 --> 00:56:26,400 kur tai įvyko, leidžiama pasirinkti, kaip įgyvendinti šiuos 16 baitų. 672 00:56:26,400 --> 00:56:30,040 Ji negali padaryti, kad char * s, nes ai yra tikrasis rodyklė. 673 00:56:30,040 --> 00:56:32,380 Jis yra nemokamas, tada nukreipkite į kitus dalykus. 674 00:56:32,380 --> 00:56:36,140 x yra konstanta. Jūs negalite turėti nukreipkite žymiklį į kitą masyvą. >> [Studentas] Gerai. 675 00:56:36,140 --> 00:56:43,420 Tačiau ši idėja, tai indeksavimo, yra tas pats, nepriklausomai nuo to, ar tai tradicinis masyvas 676 00:56:43,420 --> 00:56:48,230 arba, jei tai yra rodyklė į kažką, arba jei tai žymiklį į malloced masyvo. 677 00:56:48,230 --> 00:56:59,770 Ir iš tiesų, ji yra tokia tolygi, kad tai irgi tas pats. 678 00:56:59,770 --> 00:57:05,440 Ji iš tikrųjų tiesiog verčia tai, kas viduje skliausteliuose ir kas liko skliausteliuose, 679 00:57:05,440 --> 00:57:07,970 prideda jas kartu, ir dereferences. 680 00:57:07,970 --> 00:57:14,710 Kad tai tik interpretuojama kaip * (s + 3) ar s [3]. 681 00:57:16,210 --> 00:57:22,090 [Studentas] Ar turite patarimų, nukreipiančios į 2-vienmačių masyvų? 682 00:57:22,090 --> 00:57:27,380 >> Tai sunkiau. Tradiciškai, ne. 683 00:57:27,380 --> 00:57:34,720 2-dimensional array yra tik 1-dimensional array su kai kuriais patogioje sintaksė 684 00:57:34,720 --> 00:57:54,110 nes kai aš sakau, int x [3] [3], tai tikrai tik 1 su 9 reikšmių masyvas. 685 00:57:55,500 --> 00:58:03,000 Ir todėl, kai aš indeksas, kompiliatorius žino, ką turiu galvoje. 686 00:58:03,000 --> 00:58:13,090 Jei aš sakau, x [1] [2], ji žino, kad aš noriu eiti į antrą eilutę, kad ji ketina praleisti pirmąjį 3 687 00:58:13,090 --> 00:58:17,460 ir tada ji nori Antras dalykas, ta prasme, kad jis ketina gauti šį vieną. 688 00:58:17,460 --> 00:58:20,480 Bet ji vis dar yra tik vienas-dimensional array. 689 00:58:20,480 --> 00:58:23,660 Ir todėl, jei aš norėjau priskirti žymiklį į masyvo, 690 00:58:23,660 --> 00:58:29,770 Sakyčiau, int * p = x; 691 00:58:29,770 --> 00:58:33,220 X tipas yra tiesiog 692 00:58:33,220 --> 00:58:38,280 Tai grubus sakydamas tipas x, nes tai yra tik simbolis, ir tai nėra tikrasis kintamasis, 693 00:58:38,280 --> 00:58:40,140 bet tai tik int *. 694 00:58:40,140 --> 00:58:44,840 x yra tik rodyklė į šio pradžios. >> [Studentas] Gerai. 695 00:58:44,840 --> 00:58:52,560 Ir todėl aš negalėsite naudotis [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Manau, kad yra speciali sintaksė skelbiantis rodyklę, 697 00:58:58,370 --> 00:59:12,480 kažkas juokinga kaip int (* p [- kažkas visiškai juokinga aš net nežinau. 698 00:59:12,480 --> 00:59:17,090 Bet yra patarimų, kaip su skliausteliuose ir daiktų deklaravimo sintaksė. 699 00:59:17,090 --> 00:59:22,960 Jis gali net jums tai padaryti. 700 00:59:22,960 --> 00:59:26,640 Galėtų pažvelgti atgal į kažką, kad būtų pasakyti tiesą. 701 00:59:26,640 --> 00:59:34,160 Atrodys vėliau, jei yra taško sintaksė. Bet jūs niekada pamatyti jį. 702 00:59:34,160 --> 00:59:39,670 Ir net sintaksė yra tokia archajiška, kad jei jūs jį naudoti, žmonės bus nesuprantamas. 703 00:59:39,670 --> 00:59:43,540 Daugiamačių masyvų yra gana reti, nes ji yra. 704 00:59:43,540 --> 00:59:44,630 Jūs gana daug - 705 00:59:44,630 --> 00:59:48,490 Na, jei jūs darote matricos dalykų ji nesiruošia būti retas, 706 00:59:48,490 --> 00:59:56,730 bet, C jūs retai bus naudojant daugiamačių masyvų. 707 00:59:57,630 --> 01:00:00,470 Taip. >> [Studentas] Tarkime, kad turite tikrai ilgai masyvas. 708 01:00:00,470 --> 01:00:03,900 >> Todėl virtualiosios atminties, atrodo, būti viską iš eilės, 709 01:00:03,900 --> 01:00:05,640 kaip elementų, viena šalia kitos, 710 01:00:05,640 --> 01:00:08,770 bet fizinės atminties, tai būtų įmanoma, kad taip negali būti skaidomas? >> Taip. 711 01:00:08,770 --> 01:00:16,860 Kaip veikia virtualiosios atminties tai tik atskiria - 712 01:00:19,220 --> 01:00:24,860 Paskirstymo įrenginys yra puslapis, kuris linkęs būti 4 kilobaitai, 713 01:00:24,860 --> 01:00:29,680 ir, kai procesas sako, ei, aš noriu naudoti šią atminties, 714 01:00:29,680 --> 01:00:35,970 operacinė sistema ketina skirti 4 kilobaitų atminties, kad šiek tiek bloko. 715 01:00:35,970 --> 01:00:39,100 Net jei jūs naudojate tik vieną mažą baitas visą atminties bloko, 716 01:00:39,100 --> 01:00:42,850 operacinė sistema suteiks jai visas 4 kilobaitų. 717 01:00:42,850 --> 01:00:49,410 Taigi, ką tai reiškia, aš galėjo - tarkim tai yra mano kamino. 718 01:00:49,410 --> 01:00:53,180 Šis kamino gali būti atskirtos. Mano kamino gali būti megabaitų ir megabaitais. 719 01:00:53,180 --> 01:00:55,020 Mano kamino gali būti didžiulis. 720 01:00:55,020 --> 01:01:00,220 Tačiau kamino turi būti padalytas į atskirus puslapius, 721 01:01:00,220 --> 01:01:09,010 jei pažvelgsime čia galime pasakyti, kad tai mūsų atminties, 722 01:01:09,010 --> 01:01:16,600 jei aš turiu 2 GB RAM, tai yra faktinis adresas 0 kaip nulinis baitas mano RAM, 723 01:01:16,600 --> 01:01:22,210 ir tai yra 2 gigabaitai visą kelią žemyn čia. 724 01:01:22,210 --> 01:01:27,230 Taigi, šis puslapis gali atitikti šio bloko čia. 725 01:01:27,230 --> 01:01:29,400 Šis puslapis gali atitikti šio bloko čia. 726 01:01:29,400 --> 01:01:31,560 Tai vienas gali atitikti Vienas tai per čia. 727 01:01:31,560 --> 01:01:35,540 Taigi operacinė sistema yra priskirti fizinės atminties 728 01:01:35,540 --> 01:01:39,320 savavališkai bet kurį atskirą puslapį. 729 01:01:39,320 --> 01:01:46,180 Ir tai reiškia, kad, jei ši riba būna sėdėjimas išsižergus masyvą, 730 01:01:46,180 --> 01:01:50,070 masyvas atsitinka, turi būti palikta, tai ir teisė į šį puslapį, kad būtų 731 01:01:50,070 --> 01:01:54,460 tada, kad bus padalyta į fizinės atminties masyvas. 732 01:01:54,460 --> 01:01:59,280 Ir tada, kai jums mesti rūkyti programą, kai procesas baigiasi, 733 01:01:59,280 --> 01:02:05,690 šie priskyrimai gauti ištrinami ir tada ji laisvai naudoti kitų dalykų šių mažai blokus. 734 01:02:14,730 --> 01:02:17,410 Daugiau klausimų? 735 01:02:17,410 --> 01:02:19,960 [Studentas] rodyklė aritmetika. >> Oh yeah. 736 01:02:19,960 --> 01:02:28,410 Stygos buvo lengviau, bet žiūri kažką panašaus į int, 737 01:02:28,410 --> 01:02:35,000 Taigi atgal į int x [4]; 738 01:02:35,000 --> 01:02:41,810 Nesvarbu, ar tai yra masyvas ar tai rodyklė į malloced masyvas 4 sveikieji skaičiai, 739 01:02:41,810 --> 01:02:47,060 tai bus traktuoti taip pat. 740 01:02:50,590 --> 01:02:53,340 [Studentas] Taigi matricos yra krūvos? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Masyvai nėra krūvos. >> [Studentas] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Šis masyvo tipas linkęs būti kamino 743 01:03:08,320 --> 01:03:12,220 nebent jūs paskelbė jį ignoruojant globalių kintamųjų. Nenaudokite globalių kintamųjų. 744 01:03:12,220 --> 01:03:16,280 Viduje funkcijos, sakau int x [4]; 745 01:03:16,280 --> 01:03:22,520 Ji ketina sukurti 4-sveikasis skaičius blokas kamino šio masyvo. 746 01:03:22,520 --> 01:03:26,960 Bet tai malloc (4 * sizeof (int)); ketina eiti krūvos. 747 01:03:26,960 --> 01:03:31,870 Bet po to, kai šiuo klausimu galiu naudoti x ir p gana daug tais pačiais būdais, 748 01:03:31,870 --> 01:03:36,140 išskyrus išimčių, aš sakė prieš maždaug galite perskirstyti p. 749 01:03:36,140 --> 01:03:40,960 Techniškai, jų dydžiai yra šiek tiek kitoks, bet tai visiškai neturi reikšmės. 750 01:03:40,960 --> 01:03:43,310 Jūs niekada iš tikrųjų naudoti jų dydžius. 751 01:03:48,020 --> 01:03:56,810 P galėčiau pasakyti p [3] = 2 arba x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Jūs galite naudoti juos lygiai tais pačiais būdais. 753 01:03:59,680 --> 01:04:01,570 Taigi rodyklė aritmetinis dabar - Taip. 754 01:04:01,570 --> 01:04:07,390 [Studentas] Ar jūs neturite daryti p * Jei turite laikiklius? 755 01:04:07,390 --> 01:04:11,720 Skliausteliuose numanoma dereference. >> Gerai. 756 01:04:11,720 --> 01:04:20,200 Tiesą sakant, tai, ką jūs sakote, su galite gauti daugiamačių masyvų 757 01:04:20,200 --> 01:05:02,650 patarimų, ką galite padaryti, yra kažkas panašaus į, tarkim, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Aš tiesiog rašyti viskas iš pradžių. 759 01:05:37,880 --> 01:05:41,020 Nenorėjau, kad vienas. 760 01:05:41,020 --> 01:05:42,550 Gerai. 761 01:05:42,550 --> 01:05:48,910 Ką aš padariau, čia - Tai turėtų būti pp [i]. 762 01:05:48,910 --> 01:05:53,680 Taigi PP žymeklis žymeklis. 763 01:05:53,680 --> 01:06:02,420 Jūs mallocing pp, kad rodytų į 5 int žvaigždžių masyvo. 764 01:06:02,420 --> 01:06:10,950 Taigi atminties turite kamino pp 765 01:06:10,950 --> 01:06:20,150 Ji ketina atkreipti dėmesį į 5 blokus, kurie visi yra patys patarimų masyvo. 766 01:06:20,150 --> 01:06:28,210 Ir tada, kai aš malloc žemyn čia, aš malloc, kad kiekvienos iš šių atskirų rodykles 767 01:06:28,210 --> 01:06:32,080 turėtų atkreipti dėmesį į atskirą bloką 4 baitų krūvos. 768 01:06:32,080 --> 01:06:35,870 Taigi tai rodo iki 4 baitų. 769 01:06:37,940 --> 01:06:40,660 Ir tai vienas į kitą 4 baitų. 770 01:06:40,660 --> 01:06:43,200 >> Ir visi jie nurodo į savo 4 baitų. 771 01:06:43,200 --> 01:06:49,080 Tai suteikia man daro daugiamačių dalykų. 772 01:06:49,080 --> 01:06:58,030 Galėčiau pasakyti, pp [3] [4], tačiau dabar tai yra ne tas pats kaip daugiamačių masyvų 773 01:06:58,030 --> 01:07:05,390 nes daugiamatės matricos išversti [3] [4] į vieną kompensuoti į x masyvo. 774 01:07:05,390 --> 01:07:14,790 Tai dereferences p, pasiekia trečiąjį indeksą, tada dereferences, kad 775 01:07:14,790 --> 01:07:20,790 ir užklausų - 4 negalioja - antrą indeksas. 776 01:07:24,770 --> 01:07:31,430 Kadangi, kai mes turėjome int x [3] [4] anksčiau kaip daugiamatis masyvas 777 01:07:31,430 --> 01:07:35,740 ir kai dukart laikiklį tai tikrai tik vienas dereference, 778 01:07:35,740 --> 01:07:40,490 esate po vieną žymiklį ir tada kompensuoti, 779 01:07:40,490 --> 01:07:42,850 tai tikrai 2D nuorodos. 780 01:07:42,850 --> 01:07:45,840 Po 2 atskirus nurodymus. 781 01:07:45,840 --> 01:07:50,420 Taigi tai taip pat yra techniškai leidžia jums turėti daugiamačių masyvų 782 01:07:50,420 --> 01:07:53,550 kur kiekvienas masyvas yra įvairių dydžių. 783 01:07:53,550 --> 01:07:58,000 Taigi, manau, Jagged daugiamatės matricos yra tai, ką ji vadinama 784 01:07:58,000 --> 01:08:01,870 nes tikrai pirmas dalykas, galėtų būti kažkas, kad turi 10 elementų, 785 01:08:01,870 --> 01:08:05,540 Antras dalykas, galėtų būti kažkas, kad yra 100 elementai. 786 01:08:05,540 --> 01:08:10,790 [Studentas] Ar yra kokia nors riba rodykles, jūs galite turėti 787 01:08:10,790 --> 01:08:14,290 nukreipta į kitas rodykles? >> No 788 01:08:14,290 --> 01:08:17,010 Jūs galite turėti int ***** p. 789 01:08:18,050 --> 01:08:23,760 Atgal į rodyklės aritmetinis - >> [studentas] Oh. >> Taip. 790 01:08:23,760 --> 01:08:35,649 [Studentas] Jeigu aš turiu int *** p ir tada aš padaryti dereferencing ir sakau p * yra lygi šiai reikšmei, 791 01:08:35,649 --> 01:08:39,560 tai tik ketina padaryti 1 lygio dereferencing? >> Taip. 792 01:08:39,560 --> 01:08:43,340 Taigi, jei norite prieiti prie dalykas, kad paskutinis rodyklė būtų nukreipta - 793 01:08:43,340 --> 01:08:46,210 Tada jūs *** p. >> Gerai. 794 01:08:46,210 --> 01:08:54,080 Taigi tai yra 1 blokas, atkreipia dėmesį į kitą bloko į kitą bloko punktuose nurodo, kad p. 795 01:08:54,080 --> 01:09:02,010 Tada, jei jūs darote * p = kažkas, tada jūs keičiasi tai 796 01:09:02,010 --> 01:09:13,640 dabar į kitą bloko. >> Gerai. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Ir jei jie buvo malloced, tada jūs jau nutekėjo atmintį 798 01:09:17,649 --> 01:09:20,430 nebent jums atsitikti, kad skirtingas šių nuorodų 799 01:09:20,430 --> 01:09:25,270 nes jūs negalite grįžti Tuos, kad jūs tiesiog išmetė. 800 01:09:25,270 --> 01:09:29,550 Rodyklė aritmetika. 801 01:09:29,550 --> 01:09:36,310 int x [4]; ketina skirti 4 sveikieji skaičiai masyvo 802 01:09:36,310 --> 01:09:40,670 kur x yra nurodyti masyvo pradžioje. 803 01:09:40,670 --> 01:09:50,420 Taigi, kai aš sakau kažką panašaus x [1], noriu, kad jis reiškia eiti į antrąjį sveikasis skaičius masyve, 804 01:09:50,420 --> 01:09:53,319 kuris būtų šį vieną. 805 01:09:53,319 --> 01:10:04,190 Bet iš tikrųjų, tai 4 baitų į masyvo, nes tai sveikasis skaičius užima 4 baitų. 806 01:10:04,190 --> 01:10:08,470 Taigi, kompensuoti iš 1, iš tikrųjų reiškia, kompensuoti iš 1 807 01:10:08,470 --> 01:10:12,030 kartus nepriklausomai nuo masyvo tipas yra dydis. 808 01:10:12,030 --> 01:10:17,170 Tai yra sveikųjų skaičių masyvas, todėl ji žino, kad padaryti 1 kartus dydis int, kai ji nori kompensuoti. 809 01:10:17,170 --> 01:10:25,260 Sintaksė. Nepamirškite, kad tai prilygsta * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kai aš sakau, POINTER + 1, ką kuri grąžina adresas, kad žymeklis yra saugoti 811 01:10:35,250 --> 01:10:40,360 plius 1 kartų rodyklė tipo dydis. 812 01:10:40,360 --> 01:10:59,510 Taigi, jei x = ox100, tada x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Ir jūs galite piktnaudžiauti tai ir pasakyti kažką panašaus char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 ir dabar bus tas pats adresas kaip x c. 815 01:11:23,050 --> 01:11:26,040 c būti lygus ox100, 816 01:11:26,040 --> 01:11:31,490 bet c + 1 bus lygus ox101 817 01:11:31,490 --> 01:11:38,030 nes rodyklė aritmetinis priklauso nuo rodyklė tipo, kad jūs įtraukiate į. 818 01:11:38,030 --> 01:11:45,390 Taigi c + 1, atrodo c, char rodyklė, todėl ketina pridėti 1 kartų dydį char, 819 01:11:45,390 --> 01:11:48,110 , kuris visada bus 1, taigi, galėsite gauti 101, 820 01:11:48,110 --> 01:11:54,890 kadangi, jei aš tai padaryti X, kuris taip pat dar 100, x + 1 bus 104. 821 01:11:56,660 --> 01:12:06,340 [Studentas] Ar galima naudoti C + +, siekiant iš anksto žymeklį 1? 822 01:12:06,340 --> 01:12:09,810 Taip, galite. 823 01:12:09,810 --> 01:12:16,180 Jūs negalite padaryti, kad su x, nes x yra tik simbolis, tai yra pastovus; jūs negalite pakeisti x. 824 01:12:16,180 --> 01:12:22,610 >> Bet c atsitinka tiesiog būti rodyklė, kad C + + yra visiškai galioja ir jis bus prieaugio 1. 825 01:12:22,610 --> 01:12:32,440 Jei c buvo tik int *, tada C + + bus 104. 826 01:12:32,440 --> 01:12:41,250 + + Rodyklė aritmetinis tik kaip c + 1 padaryta rodyklė aritmetiką. 827 01:12:43,000 --> 01:12:48,870 Tai iš tikrųjų, kaip daug dalykų, pavyzdžiui, sujungti rūšiuoti - 828 01:12:49,670 --> 01:12:55,710 Užuot kūrę dalykų kopijas, galite vietoj Pass - 829 01:12:55,710 --> 01:13:02,400 Pavyzdžiui, jei aš norėjau perduoti šią masyvo pusę - tegul ištrinti kai tai. 830 01:13:04,770 --> 01:13:10,520 Tarkime, aš norėjau perduoti šią masyvo funkcijos pusę į. 831 01:13:10,520 --> 01:13:12,700 Ką turėtų praeiti tą funkciją? 832 01:13:12,700 --> 01:13:17,050 Jei galiu perduoti x, Aš perduodu šį adresą. 833 01:13:17,050 --> 01:13:23,780 Bet aš noriu perduoti šį konkretų adresą. Taigi, ką turėčiau praeiti? 834 01:13:23,780 --> 01:13:26,590 [Studentas] pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Taigi x + 2. Taip. 836 01:13:29,350 --> 01:13:31,620 Kad bus šis adresas. 837 01:13:31,620 --> 01:13:42,810 Jūs taip pat labai dažnai matyti, kaip X [2], o po to, kad adresas. 838 01:13:42,810 --> 01:13:47,850 Taigi, jūs turite imtis jo adresą, nes laikiklis yra numanomas dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] - tai į vertę, kuri yra šiame langelyje, ir tada jūs norite tame langelyje adresą, 840 01:13:53,250 --> 01:13:56,850 todėl jūs sakote & X [2]. 841 01:13:56,850 --> 01:14:02,880 Taigi tai, kaip kažkas sujungti rūšiuoti, kur norite praleisti pusę sąrašą kažką 842 01:14:02,880 --> 01:14:08,790 jūs tikrai tiesiog praeiti ir x [2], o dabar kiek rekursinis skambutis 843 01:14:08,790 --> 01:14:12,510 mano naujas masyvas prasideda ten. 844 01:14:12,510 --> 01:14:15,130 Paskutinės minutės klausimai. 845 01:14:15,130 --> 01:14:20,050 [Studentas] Jei mes neskirti ampersendo arba - kas tai vadinama? >> Žvaigždė? 846 01:14:20,050 --> 01:14:23,200 [Studentas] Star ". >> Techniškai, dereference operatorius, bet - >> [studentas] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Jei mes neturime įdėti žvaigždę ar ampersendo, kas atsitiks, jei aš tiesiog pasakyti, y = x ir x yra rodyklė? 848 01:14:29,310 --> 01:14:34,620 Kas yra y tipas? >> [Studentas] aš tiesiog pasakyti, kad tai žymeklį 2. 849 01:14:34,620 --> 01:14:38,270 Taigi, jei jūs tiesiog pasakyti, y = x, dabar x ir y žymiklį į tą patį. >> [Studentas] Taškas į tą patį. 850 01:14:38,270 --> 01:14:45,180 Ir, jei x yra int rodyklė? >> Jis skundžiasi, nes tu negali priskirti patarimų. 851 01:14:45,180 --> 01:14:46,540 [Studentas] Gerai. 852 01:14:46,540 --> 01:14:51,860 Atminkite, kad patarimų, nors mes ir padaryti juos kaip rodyklėmis, 853 01:14:51,860 --> 01:15:02,010 tikrai visi jie - parduotuvė int * x - tikrai visais x kaupia kažkas panašaus ox100 854 01:15:02,010 --> 01:15:06,490 kurią mes atsitiktų atstovauti nukreipta į 100 laikomo bloko. 855 01:15:06,490 --> 01:15:19,660 Taigi, kai aš sakau, int * y = x; aš tiesiog nukopijuoti ox100 į y, 856 01:15:19,660 --> 01:15:24,630 , kurią mes tik ketina atstovauti kaip y, taip pat nukreipta į ox100. 857 01:15:24,630 --> 01:15:39,810 Ir jei aš sakau, int i = (int) x, tada i laikyti, nepriklausomai ox100 vertė 858 01:15:39,810 --> 01:15:45,100 viduje ji, bet dabar tai bus aiškinama kaip sveikasis skaičius, vietoj rodykle. 859 01:15:45,100 --> 01:15:49,310 Bet jūs turite mesti arba dar ji skundžiasi. 860 01:15:49,310 --> 01:15:53,300 [Studentas] Taigi jums reiškia mesti - 861 01:15:53,300 --> 01:16:00,290 Jis ketina liejimo int x arba liejimo int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Kas? 863 01:16:03,700 --> 01:16:07,690 [Studentas] Gerai. Po šių skliausteliuose ten bus x arba ay yra? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden]. x ir y yra lygiaverčiai. >> [Studentas] Gerai. 865 01:16:11,500 --> 01:16:14,390 Nes jie abu patarimų. >> Taip. 866 01:16:14,390 --> 01:16:21,050 [Studentas] Taigi tai būtų laikyti šešioliktainį 100 sveikasis forma? >> [Bowden] Yeah. 867 01:16:21,050 --> 01:16:23,620 Bet ne, kokia ji nurodo vertę. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Taip. >> [Studentas] Taigi tik sveikasis forma adresas. Gerai. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Jei nori dėl kokių nors keistai priežasties, 870 01:16:34,720 --> 01:16:38,900 jums tik gali susidoroti su rodyklės ir niekada elgtis su sveikaisiais skaičiais 871 01:16:38,900 --> 01:16:49,240 ir tiesiog būti kaip int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Tada jūs ketinate gauti tikrai supainioti,, kai rodyklė aritmetinis prasideda vyksta. 873 01:16:53,000 --> 01:16:56,570 Taip, kad jie saugo numeriai yra beprasmis. 874 01:16:56,570 --> 01:16:58,940 Tai tik kaip jūs galų gale jas aiškinant. 875 01:16:58,940 --> 01:17:02,920 Taigi, aš laisvai kopijuoti iš int * ox100 int, 876 01:17:02,920 --> 01:17:07,790 ir aš tikiu, priskirti - Tu tikriausiai nesiruošia gauti rėkė ne liejimo 877 01:17:07,790 --> 01:17:18,160 Aš esu nemokamai priskirti kažką panašaus (int *) į šį savavališkai int * ox1234. 878 01:17:18,160 --> 01:17:25,480 Taigi ox123 yra lygiai taip pat galioja atminties adresas & y. 879 01:17:25,480 --> 01:17:32,060 & Y atsitinka atsiųsti ką nors, kad yra gana daug ox123. 880 01:17:32,060 --> 01:17:35,430 [Studentas] Ar tai būtų šaunus būdas eiti Šešioliktainius skaičius dešimtaine forma, 881 01:17:35,430 --> 01:17:39,230 patinka, jei turite rodyklę ir jums mesti jį kaip int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Galite tikrai tik spausdinti naudojant kaip printf. 883 01:17:44,860 --> 01:17:50,300 Tarkime, turiu int y = 100. 884 01:17:50,300 --> 01:18:02,700 Taigi printf (% d \ n - kaip jau turėtumėte žinoti - atsispausdink, kad kaip sveikasis skaičius,% x. 885 01:18:02,700 --> 01:18:05,190 Mes tiesiog atspausdinti jį kaip šešioliktainius. 886 01:18:05,190 --> 01:18:10,760 Taigi žymeklis nėra saugomas kaip šešioliktainius 887 01:18:10,760 --> 01:18:12,960 ir sveikasis skaičius nėra saugomas kaip dešimtainį. 888 01:18:12,960 --> 01:18:14,700 Viskas bus saugoma kaip dvejetainis. 889 01:18:14,700 --> 01:18:17,950 Tai tiesiog, kad mes linkę patarimų, kaip šešioliktainius 890 01:18:17,950 --> 01:18:23,260 nes mes manome, šių 4-baitų blokus dalykų, 891 01:18:23,260 --> 01:18:25,390 ir atminties adresai yra linkę būti susipažinę. 892 01:18:25,390 --> 01:18:28,890 Mes, pavyzdžiui, jei ji pradeda su bf, tada jis būna, kad ant kamino. 893 01:18:28,890 --> 01:18:35,560 Taigi, tai tik mūsų interpretacija kaip šešioliktainius rodykles. 894 01:18:35,560 --> 01:18:39,200 Gerai. Paskutinę klausimų? 895 01:18:39,200 --> 01:18:41,700 >> Aš būsiu čia šiek tiek, po to, jei turite ką nors kita. 896 01:18:41,700 --> 01:18:46,070 Ir tai, kad pabaiga. 897 01:18:46,070 --> 01:18:48,360 >> [Studentas] Puiku! [Plojimai] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]