1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Kafli 4 - öruggari] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvard University] 3 00:00:04,850 --> 00:00:07,370 [Þetta er CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Við höfum quiz á morgun, ef þið ekki vita það. 5 00:00:14,810 --> 00:00:20,970 Það er í grundvallaratriðum um allt sem þú gætir hafa séð í bekknum eða ætti að hafa séð í bekknum. 6 00:00:20,970 --> 00:00:26,360 Það felur í sér ábendingar, jafnvel þó þeir ert mjög nýleg efni. 7 00:00:26,360 --> 00:00:29,860 Þú ættir að minnsta kosti að skilja mikið magn af þeim. 8 00:00:29,860 --> 00:00:34,760 Nokkuð sem var farið yfir í bekknum sem þú ættir að skilja að próf. 9 00:00:34,760 --> 00:00:37,320 Svo ef þú hefur einhverjar spurningar á þeim, er hægt að spyrja þá nú. 10 00:00:37,320 --> 00:00:43,280 En þetta er að fara til vera a mjög nemandi undir fundur þar sem þið spyrja spurninga, 11 00:00:43,280 --> 00:00:45,060 svo vonandi að fólk hefur einhverjar spurningar. 12 00:00:45,060 --> 00:00:48,020 Hefur einhver hefur einhverjar spurningar? 13 00:00:49,770 --> 00:00:52,090 Já. >> [Nemandi] er hægt að fara yfir ábendingum á ný? 14 00:00:52,090 --> 00:00:54,350 Ég fer yfir ábendingum. 15 00:00:54,350 --> 00:00:59,180 Allar breytur lifa endilega í minni, 16 00:00:59,180 --> 00:01:04,450 en yfirleitt er ekki hafa áhyggjur óður í það og þú segir bara x + 2 og y + 3 17 00:01:04,450 --> 00:01:07,080 og þýðandi mun reikna út hvar hlutirnir eru að lifa fyrir þig. 18 00:01:07,080 --> 00:01:12,990 Þegar þú ert að takast á við ábendingum, nú þú ert sérstaklega að nota þessar minni tölur. 19 00:01:12,990 --> 00:01:19,800 Svo einn breytu mun bara alltaf lifa á einum heimilisfang hverju sinni. 20 00:01:19,800 --> 00:01:24,040 Ef við viljum að lýsa yfir músina, það er gerð að fara að líta út? 21 00:01:24,040 --> 00:01:26,210 >> Mig langar að lýsa yfir músina bls. Hvað tegund út? 22 00:01:26,210 --> 00:01:33,530 [Nemandi] int * p. >> Já. Svo int * p. 23 00:01:33,530 --> 00:01:38,030 Og hvernig get ég það benda á x? >> [Nemandi] merkið. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Svo merkið er bókstaflega kölluð heimilisfang rekstraraðila. 25 00:01:45,300 --> 00:01:50,460 Svo þegar ég segi & x hann er að fá minni vistfang breytu x. 26 00:01:50,460 --> 00:01:56,790 Svo nú hef ég músina p, og hvar í númerið mitt sem ég er að nota * P 27 00:01:56,790 --> 00:02:02,960 eða ég gæti notað X og það verður nákvæmlega sama. 28 00:02:02,960 --> 00:02:09,520 (* P). Hvað er þetta að gera? Hvað gerir þessi stjarna þýðir? 29 00:02:09,520 --> 00:02:13,120 [Nemandi] Það þýðir að verðmæti á þeim tímapunkti. >> Já. 30 00:02:13,120 --> 00:02:17,590 Þannig að ef við lítum á það, það getur verið mjög gagnlegt til að draga út skýringarmyndir 31 00:02:17,590 --> 00:02:22,230 þar sem þetta er lítill kassi af minni fyrir X, sem gerist að hafa gildið 4, 32 00:02:22,230 --> 00:02:25,980 þá höfum við smá kassa af minni fyrir P, 33 00:02:25,980 --> 00:02:31,590 og svo p benda til X, þannig að við draga ör úr P í x. 34 00:02:31,590 --> 00:02:40,270 Svo þegar við segjum * p við erum að segja að fara í kassa sem er á bls. 35 00:02:40,270 --> 00:02:46,480 Star er að fylgja á örina og þá gera hvað sem þú vilt með þessi kassi þarna. 36 00:02:46,480 --> 00:03:01,090 Svo get ég sagt * p = 7, og það mun fara í kassa sem er x og breyting það til 7. 37 00:03:01,090 --> 00:03:13,540 Eða ég gæti sagt int z = * p * 2, Það er flókið, því að stjarna það er, stjarna. 38 00:03:13,540 --> 00:03:19,230 Sá stjörnu er dereferencing p, hitt stjarna er að margfalda með 2. 39 00:03:19,230 --> 00:03:26,780 Tilkynning Ég gæti hafa alveg eins vel í stað * p með x. 40 00:03:26,780 --> 00:03:29,430 Þú getur notað þau á sama hátt. 41 00:03:29,430 --> 00:03:38,000 Og svo seinna ég get haft p benda til alveg nýr hlutur. 42 00:03:38,000 --> 00:03:42,190 Ég get bara sagt p = &z; 43 00:03:42,190 --> 00:03:44,940 Svo nú p ekki lengur stig til X., það bendir til Ö. 44 00:03:44,940 --> 00:03:50,510 Og hvenær ég * P það er það sama og að gera Z. 45 00:03:50,510 --> 00:03:56,170 Svo er gagnlegur hlutur um þetta þegar við byrjum að fá í aðgerðum. 46 00:03:56,170 --> 00:03:59,790 >> Það er góður af gagnslaus að lýsa bendi sem bendir á eitthvað 47 00:03:59,790 --> 00:04:03,140 og þá þú ert bara dereferencing það 48 00:04:03,140 --> 00:04:06,060 þegar þú gætir hafa notað upprunalega breytu til að byrja með. 49 00:04:06,060 --> 00:04:18,190 En þegar þú kemst inn í störf - þannig að við skulum segja að við höfum sumir virka, int foo, 50 00:04:18,190 --> 00:04:32,810 sem tekur bendi og bara er * P = 6; 51 00:04:32,810 --> 00:04:39,990 Eins og við sáum áður með skipti, getur þú ekki að gera skilvirka skipti og sér virka 52 00:04:39,990 --> 00:04:45,180 bara farið heiltölur því allt í C er alltaf farið með verðmæti. 53 00:04:45,180 --> 00:04:48,360 Jafnvel þegar þú ert að labba framhjá ábendingum þú ert liggur við gildi. 54 00:04:48,360 --> 00:04:51,940 Það gerist bara svo að þessi gildi eru minni viðtakandi. 55 00:04:51,940 --> 00:05:00,770 Svo þegar ég segi foo (p), ég ætla að standast bendilinn í fallinu foo 56 00:05:00,770 --> 00:05:03,910 og þá foo er að gera * P = 6; 57 00:05:03,910 --> 00:05:08,600 Svo inni í þeim virka, * p er enn um X, 58 00:05:08,600 --> 00:05:12,720 en ég get ekki notað x inni sem virka vegna þess að það er ekki scoped innan sem virka. 59 00:05:12,720 --> 00:05:19,510 Svo er * p = 6 eina leiðin sem ég get aðgang að staðbundin breytu úr annan valkost. 60 00:05:19,510 --> 00:05:23,600 Eða vel, ábendingum eina leiðin sem ég get aðgang að staðbundin breytu úr annan valkost. 61 00:05:23,600 --> 00:05:31,600 [Nemandi] skulum segja að þú vildir skila músina. Hvað nákvæmlega gerir þú það? 62 00:05:31,600 --> 00:05:44,270 [Bowden] aftur bendi eins og eitthvað eins og int y = 3, aftur & y? >> [Nemandi] Já. 63 00:05:44,270 --> 00:05:48,480 [Bowden] lagi. Þú ættir aldrei að gera þetta. Þetta er slæmt. 64 00:05:48,480 --> 00:05:59,480 Ég held að ég sá í þessum fyrirlestur skyggnur þú byrjaðir að sjá þetta allt skýringarmynd af minni 65 00:05:59,480 --> 00:06:02,880 þar upp hér að þú hafir fengið minni heimilisfang 0 66 00:06:02,880 --> 00:06:09,550 og niður þú ert minni heimilisfang 4 gigs eða 2 við 32. 67 00:06:09,550 --> 00:06:15,120 Svo þú hefur fengið smá dót og smá dót og svo þú stafla þinn 68 00:06:15,120 --> 00:06:21,780 og þú hefur fengið hrúga þitt, sem þú byrjaðir bara að læra um, að alast upp. 69 00:06:21,780 --> 00:06:24,390 [Nemandi] Er ekki hrúga ofan stafla? 70 00:06:24,390 --> 00:06:27,760 >> Já. Hrúga er ofan á, er það ekki? >> [Nemandi] Ja, hann setti 0 ofan. 71 00:06:27,760 --> 00:06:30,320 [Nemandi] Ó, setti hann 0 á toppinn. >> [Nemandi] Ó, allt í lagi. 72 00:06:30,320 --> 00:06:36,060 Fyrirvari: Einhvers staðar með CS50 þú ert að fara að sjá það með þessum hætti. >> [Nemandi] lagi. 73 00:06:36,060 --> 00:06:40,290 Það er bara að þegar þú ert að sjá stafla, 74 00:06:40,290 --> 00:06:45,000 eins og þegar þú hugsa um stafla þú hugsa um stöflun það ofan á annan. 75 00:06:45,000 --> 00:06:50,810 Þannig að við tilhneigingu til að Flip það í kring svo að stafla er að vaxa upp eins og stafla venjulega myndi 76 00:06:50,810 --> 00:06:55,940 stað stafla hangandi niður. >> [Nemandi] ekki hrúga tæknilega vaxa upp of, þó? 77 00:06:55,940 --> 00:07:01,100 Það fer eftir því hvað þú átt við með að vaxa upp. 78 00:07:01,100 --> 00:07:04,010 Stafla og hrúga vaxa alltaf í gagnstæða átt. 79 00:07:04,010 --> 00:07:09,420 A stafla er alltaf að vaxa upp í þeim skilningi að það er að alast upp 80 00:07:09,420 --> 00:07:12,940 til hærri minni heimilisföng og hrúga er að vaxa niður 81 00:07:12,940 --> 00:07:17,260 á að það er að vaxa til lægri minni tölur. 82 00:07:17,260 --> 00:07:20,250 Svo er efst 0 og botninn er hár netföng minni. 83 00:07:20,250 --> 00:07:26,390 Þeir eru báðir að vaxa, bara í andstæðar áttir. 84 00:07:26,390 --> 00:07:29,230 [Nemandi] ég ætlaði bara að því að þú sagðir að setja stafla á botninum 85 00:07:29,230 --> 00:07:33,640 vegna þess að það virðist meira innsæi vegna þess að á mánudaginn til að byrja efst á hrúga, 86 00:07:33,640 --> 00:07:37,520 hrúga er ofan á sig líka, svo that's - >> Já. 87 00:07:37,520 --> 00:07:44,960 Þú heldur líka að hrúga sem vaxa upp og stærri, en stafla meira svo. 88 00:07:44,960 --> 00:07:50,280 Svo er stafla sá sem við viljum svona til að sýna að vaxa upp. 89 00:07:50,280 --> 00:07:55,390 En alls staðar þú lítur annars er að fara að sýna heimilisfang 0 efst 90 00:07:55,390 --> 00:07:59,590 og hæsta minni heimilisfang neðst, þannig að þetta er venjulega skoðun þín á minni. 91 00:07:59,590 --> 00:08:02,100 >> Ert þú með spurningu? 92 00:08:02,100 --> 00:08:04,270 [Nemandi] Getur þú sagt okkur meira um hrúga? 93 00:08:04,270 --> 00:08:06,180 Já. Ég næ að því í annað. 94 00:08:06,180 --> 00:08:12,220 First, fara til baka til hvers aftur & Y er slæmt, 95 00:08:12,220 --> 00:08:18,470 á stafla þú ert með fullt af römmum stafla sem tákna allar aðgerðir 96 00:08:18,470 --> 00:08:20,460 sem hafa verið kölluð. 97 00:08:20,460 --> 00:08:27,990 Svo hunsa fyrri hluti, efst á stafla er alltaf að fara að vera aðal virka 98 00:08:27,990 --> 00:08:33,090 því það er fyrsta fall sem er að vera kölluð. 99 00:08:33,090 --> 00:08:37,130 Og svo þegar þú hringir annað virka, stafla er að fara að vaxa niður. 100 00:08:37,130 --> 00:08:41,640 Svo ef ég kalla sumir virka, Foo, og það fær sér stafla ramma þess, 101 00:08:41,640 --> 00:08:47,280 það er hægt að kalla sumir virka, bar, það fær eigin stafla ramma þess. 102 00:08:47,280 --> 00:08:49,840 Og bar gæti verið endurkvæma og það gæti kalla sig, 103 00:08:49,840 --> 00:08:54,150 og svo annað símtal á bar er að fara að fá sér stafla ramma þess. 104 00:08:54,150 --> 00:08:58,880 Og svo það sem fer í þessum stafla ramma eru allar staðbundnar breytur 105 00:08:58,880 --> 00:09:03,450 og alla virka rök að - 106 00:09:03,450 --> 00:09:08,730 Allir hlutir sem eru á staðnum scoped þessa aðgerð fara í þessum stafla ramma. 107 00:09:08,730 --> 00:09:21,520 Svo þýðir að þegar ég sagði eitthvað eins og barinn er fall, 108 00:09:21,520 --> 00:09:29,270 Ég ætla bara að lýsa heiltölu og síðan aftur bendi til að heiltölu. 109 00:09:29,270 --> 00:09:33,790 Svo hvar er Y lifa? 110 00:09:33,790 --> 00:09:36,900 [Nemandi] Y býr í bar. >> [Bowden] Já. 111 00:09:36,900 --> 00:09:45,010 Einhvers staðar í þessu litla veldi af minni a littler ferningur sem hefur y í það. 112 00:09:45,010 --> 00:09:53,370 Þegar ég aftur & y, ég er aftur bendi á þessu litla blokk minni. 113 00:09:53,370 --> 00:09:58,400 En svo þegar skilar, stafla ramma þess fær smella af stafla. 114 00:10:01,050 --> 00:10:03,530 Og það er hvers vegna það er kallað stafla. 115 00:10:03,530 --> 00:10:06,570 Það er eins og gögn stafla uppbyggingu, ef þú veist hvað það er. 116 00:10:06,570 --> 00:10:11,580 Eða jafnvel eins og stafla af stæði er alltaf dæmi, 117 00:10:11,580 --> 00:10:16,060 Helsta er að fara að fara á the botn, þá fyrst virka þú hringir er að fara að fara á toppur af þessi, 118 00:10:16,060 --> 00:10:20,400 og þú getur ekki fengið til baka helstu þar til þú aftur frá öllum aðgerðum sem hafa verið kölluð 119 00:10:20,400 --> 00:10:22,340 sem hafa verið sett ofan á það. 120 00:10:22,340 --> 00:10:28,650 >> [Nemandi] Svo ef þú did ekki skila og Y, sem gildi geta breyst án fyrirvara. 121 00:10:28,650 --> 00:10:31,290 Já, it's - >> [nemandi] Það gæti verið skrifað yfir hana. >> Já. 122 00:10:31,290 --> 00:10:34,660 Það er alveg - Ef þú ert að reyna og - 123 00:10:34,660 --> 00:10:38,040 Það myndi einnig vera int * barnum vegna þess að það er aftur bendi, 124 00:10:38,040 --> 00:10:41,310 svo er aftur gerð þess int *. 125 00:10:41,310 --> 00:10:46,500 Ef þú reynir að nota skilagildi þessa aðgerð, það er óskilgreint hegðun 126 00:10:46,500 --> 00:10:51,770 því að bendillinn bendir slæmt minni. >> [Nemandi] lagi. 127 00:10:51,770 --> 00:11:01,250 Svo hvað ef, til dæmis, þú lýst int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Það er betra. Já. 129 00:11:03,740 --> 00:11:07,730 [Nemandi] Við töluðum um hvernig þegar við draga það að endurvinna kassi okkar 130 00:11:07,730 --> 00:11:11,750 þeir eru ekki í raun þurrkast út, við missa bara ábendingum þeirra. 131 00:11:11,750 --> 00:11:15,550 Þannig að í þessu tilfelli höfum við eyða í raun gildi eða er það enn í minni? 132 00:11:15,550 --> 00:11:19,130 Fyrir the hluti, það er að fara til enn vera there. 133 00:11:19,130 --> 00:11:24,220 En við skulum segja að við séum skyldir hringja eitthvað annað virka, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz er að fara að fá sér stafla ramma þess hér. 135 00:11:28,990 --> 00:11:31,470 Það er að fara að skrifa of mikið öll þessi efni, 136 00:11:31,470 --> 00:11:34,180 og þá ef þú reynir seinna og nota músina sem þú fékkst áður, 137 00:11:34,180 --> 00:11:35,570 það er ekki að fara að vera sú sama gildi. 138 00:11:35,570 --> 00:11:38,150 Það er að fara að hafa breyst aðeins vegna þess að þú heitir virka Baz. 139 00:11:38,150 --> 00:11:43,080 [Nemandi] En við höfðum ekki, myndum við fá enn 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Að öllum líkindum væri þú. 141 00:11:44,990 --> 00:11:49,670 En þú getur ekki treyst á það. C segir bara óskilgreindur hegðun. 142 00:11:49,670 --> 00:11:51,920 >> [Nemandi] Ó, er það. Allt í lagi. 143 00:11:51,920 --> 00:11:58,190 Svo þegar þú vilt koma aftur með músina, þetta er þar sem malloc koma í notkun. 144 00:12:00,930 --> 00:12:15,960 Ég er að skrifa í raun bara aftur malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Við munum fara yfir malloc meira í annað, en hugmyndin um að malloc er öllum staðbundnum breytur 146 00:12:24,050 --> 00:12:26,760 alltaf að fara á mánudaginn. 147 00:12:26,760 --> 00:12:31,570 Nokkuð sem er malloced fer á hrúga, og það mun að eilífu og alltaf vera á hrúga 148 00:12:31,570 --> 00:12:34,490 þar til þú frjáls sérstaklega það. 149 00:12:34,490 --> 00:12:42,130 Svo þýðir þetta að þegar þú malloc eitthvað, það er að fara að lifa eftir skilar. 150 00:12:42,130 --> 00:12:46,800 [Nemandi] Mun það lifa eftir að forritið hættir að keyra? >> Nei 151 00:12:46,800 --> 00:12:53,180 Jæja, svo það er að fara að vera þar þangað til forritið er alveg gert gangi. >> Já. 152 00:12:53,180 --> 00:12:57,510 Við getum farið yfir upplýsingar um hvað gerist þegar forritið hættir að keyra. 153 00:12:57,510 --> 00:13:02,150 Þú gætir þurft að minna mig, en það er sérstakt hlutur alveg. 154 00:13:02,150 --> 00:13:04,190 [Nemandi] Svo malloc skapar músina? >> Já. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [nemandi] Ég held malloc tilnefnir blokk minni sem bendillinn getur notað. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Ég vil að skýringarmynd aftur. >> [Nemandi] Þannig virkar þessi aðgerð, þó? 157 00:13:19,610 --> 00:13:26,430 [Nemandi] Já, malloc tilnefnir blokk af minni sem hægt er að nota, 158 00:13:26,430 --> 00:13:30,470 og þá skilar það veffang fyrstu blokk sem minni. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Já. Svo þegar þú malloc, þú ert grabbing sumir blokk af minni 160 00:13:36,750 --> 00:13:38,260 það er nú í hrúga. 161 00:13:38,260 --> 00:13:43,040 Ef hrúga er of lítill, þá er hrúga er bara að fara að vaxa, og það vex í þessa átt. 162 00:13:43,040 --> 00:13:44,650 Svo skulum segja að hrúga er of lítill. 163 00:13:44,650 --> 00:13:49,960 Þá er það um að vaxa smá og aftur bendi á þessa blokk sem bara jókst. 164 00:13:49,960 --> 00:13:55,130 Þegar þú frjáls efni, þú ert að gera meira pláss í hrúga, 165 00:13:55,130 --> 00:14:00,030 svo þá síðar kalla á malloc getur endurnýta þessi minni sem þú hafðir áður leysti. 166 00:14:00,030 --> 00:14:09,950 The mikilvægur hlutur óður malloc og ókeypis er að það gefur þér fullkomna stjórn 167 00:14:09,950 --> 00:14:12,700 á líftíma þessara minni blokkir. 168 00:14:12,700 --> 00:14:15,420 Global breytur eru alltaf lifandi. 169 00:14:15,420 --> 00:14:18,500 Local breytur eru á lífi innan gildissviðs þeirra. 170 00:14:18,500 --> 00:14:22,140 Um leið og þú ferð framhjá hrokkið borsveif, eru staðbundnar breytur dauður. 171 00:14:22,140 --> 00:14:28,890 Malloced minni er lifandi þegar þú vilt það til að vera á lífi 172 00:14:28,890 --> 00:14:33,480 og þá er út þegar þú segir það að gefa út. 173 00:14:33,480 --> 00:14:38,420 Þeir eru í raun aðeins 3 tegundir af minni, í raun. 174 00:14:38,420 --> 00:14:41,840 Það er sjálfvirk minni stjórnun, sem er stafla. 175 00:14:41,840 --> 00:14:43,840 Hlutirnir gerast fyrir þig sjálfkrafa. 176 00:14:43,840 --> 00:14:46,910 Þegar þú segir int x, er minni úthlutað fyrir int x. 177 00:14:46,910 --> 00:14:51,630 Þegar x fer út af umfangi, er minni endurheimta fyrir x. 178 00:14:51,630 --> 00:14:54,790 Þá er það dynamic minni stjórnun, sem er það malloc er, 179 00:14:54,790 --> 00:14:56,740 sem er þegar þú hefur fulla stjórn. 180 00:14:56,740 --> 00:15:01,290 Þú ákveður virk þegar minni ætti og ætti ekki að vera úthlutað. 181 00:15:01,290 --> 00:15:05,050 Og þá er það fast, sem þýðir bara að það varir að eilífu, 182 00:15:05,050 --> 00:15:06,610 sem er það alþjóðlegt breytur eru. 183 00:15:06,610 --> 00:15:10,240 Þeir eru bara alltaf í minni. 184 00:15:10,960 --> 00:15:12,760 >> Spurningar? 185 00:15:14,490 --> 00:15:17,230 [Nemandi] Getur þú skilgreina blokk bara með því að nota hrokkið axlabönd 186 00:15:17,230 --> 00:15:21,220 en ekki að þurfa að hafa óákveðinn greinir í ensku ef yfirlýsingu eða meðan yfirlýsingu eða eitthvað svoleiðis? 187 00:15:21,220 --> 00:15:29,130 Þú getur slegið inn blokk eins og í aðgerð, en það hefur ekki hrokkið axlabönd líka. 188 00:15:29,130 --> 00:15:32,100 [Nemandi] Svo þú getur ekki bara eins handahófi par af hrokkið axlabönd í kóðanum þínum 189 00:15:32,100 --> 00:15:35,680 sem hafa staðbundin breytum? >> Já, þú getur. 190 00:15:35,680 --> 00:15:45,900 Inni á int bar við gætum hafa {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Það er ætlast til að vera hérna. 192 00:15:48,440 --> 00:15:52,450 En það skilgreinir algjörlega umfang int y. 193 00:15:52,450 --> 00:15:57,320 Eftir að seinni hrokkið borsveif, getur Y ekki að nota lengur. 194 00:15:57,910 --> 00:16:00,630 Þú næstum aldrei gera það, þó. 195 00:16:02,940 --> 00:16:07,370 Getting bak til hvað gerist þegar forrit lýkur, 196 00:16:07,370 --> 00:16:18,760 það er eins konar misskilningur / hálf liggja að við gefum til að bara gera hlutina auðveldari. 197 00:16:18,760 --> 00:16:24,410 Við segja þér að þegar þú skiptir minni 198 00:16:24,410 --> 00:16:29,860 þú ert að úthluta sumir klumpur af vinnsluminni fyrir þá breytu. 199 00:16:29,860 --> 00:16:34,190 En þú ert í raun ekki beint að snerta vinnsluminni alltaf í áætlunum þínum. 200 00:16:34,190 --> 00:16:37,490 Ef þér finnst um það, hvernig ég teiknaði - 201 00:16:37,490 --> 00:16:44,330 Og í raun, ef þú ferð í gegnum í gdb þú munt sjá það sama. 202 00:16:51,120 --> 00:16:57,590 Óháð því hversu oft þú keyrir forrit eða hvaða forrit sem þú ert að keyra, 203 00:16:57,590 --> 00:16:59,950 stafla er alltaf að fara að byrja - 204 00:16:59,950 --> 00:17:06,510 þú ert alltaf að fara að sjá breytum um netfang oxbffff eitthvað. 205 00:17:06,510 --> 00:17:09,470 Það er yfirleitt einhvers staðar á því svæði. 206 00:17:09,470 --> 00:17:18,760 En hvernig geta 2 forrit hugsanlega hafa ábendingum á sama minni? 207 00:17:20,640 --> 00:17:27,650 [Nemandi] Það er eitthvað handahófskennt tilnefningu þar oxbfff er ætlað að vera á RAM 208 00:17:27,650 --> 00:17:31,320 sem geta í raun verið á mismunandi stöðum eftir þegar fallið var kallað. 209 00:17:31,320 --> 00:17:35,920 Já. Hugtakið er raunverulegur minni. 210 00:17:35,920 --> 00:17:42,250 Hugmyndin er að hvert einasta ferli, hvert einasta forrit sem er í gangi á tölvunni þinni 211 00:17:42,250 --> 00:17:49,450 hefur eigin - við skulum gera ráð fyrir 32 bita - alveg óháð heimilisfang rúm. 212 00:17:49,450 --> 00:17:51,590 Þetta er heimilisfang rúm. 213 00:17:51,590 --> 00:17:56,220 Það hefur eigið alveg óháð sína 4 gígabæta til að nota. 214 00:17:56,220 --> 00:18:02,220 >> Svo ef þú keyrir 2 forrit samtímis, þetta forrit sér 4 gígabæta til að sjálfu sér, 215 00:18:02,220 --> 00:18:04,870 Þetta forrit sér 4 gígabæta til að sjálfu sér, 216 00:18:04,870 --> 00:18:07,720 og það er ómögulegt fyrir þetta forrit til dereference bendi 217 00:18:07,720 --> 00:18:10,920 og á endanum með minni frá þessu forriti. 218 00:18:10,920 --> 00:18:18,200 Og hvað raunverulegur minni er er kortlagning frá ferli heimilisfang rúm 219 00:18:18,200 --> 00:18:20,470 raunverulegum hlutum á vinnsluminni. 220 00:18:20,470 --> 00:18:22,940 Svo það er allt að stýrikerfi til að vita það, 221 00:18:22,940 --> 00:18:28,080 hey, þegar þessi strákur dereferences bendillinn oxbfff, sem raunverulega þýðir 222 00:18:28,080 --> 00:18:31,040 að hann vill RAM bæti 1000, 223 00:18:31,040 --> 00:18:38,150 en ef þetta forrit dereferences oxbfff, vill hann virkilega RAM bæti 10000. 224 00:18:38,150 --> 00:18:41,590 Þeir geta vera geðþótta langt í sundur. 225 00:18:41,590 --> 00:18:48,730 Þetta er jafnvel rétt af hlutum í einu ferli heimilisfang rúm. 226 00:18:48,730 --> 00:18:54,770 Svo eins og það sér öll 4 gígabæta í sjálfu sér, en við skulum segja - 227 00:18:54,770 --> 00:18:57,290 [Nemandi] er hvert einasta ferli - 228 00:18:57,290 --> 00:19:01,350 Segjum að þú ert með tölvu með aðeins 4 gígabæta vinnsluminni. 229 00:19:01,350 --> 00:19:06,430 Er hvert einasta ferli sjá heilu 4 gígabæta? >> Já. 230 00:19:06,430 --> 00:19:13,060 En 4 gígabæta það sér er lygi. 231 00:19:13,060 --> 00:19:20,460 Það er það bara telur sem það hefur allt þetta minni vegna þess að það veit ekki önnur aðferð til. 232 00:19:20,460 --> 00:19:28,140 Það mun aðeins nota eins mikið minni og það þarf í raun og veru. 233 00:19:28,140 --> 00:19:32,340 Stýrikerfið er ekki að fara að gefa vinnsluminni í þessu ferli 234 00:19:32,340 --> 00:19:35,750 ef það er ekki að nota hvaða minni í þessu öllu svæðinu. 235 00:19:35,750 --> 00:19:39,300 Það er ekki að fara að gefa það minni fyrir héraðið. 236 00:19:39,300 --> 00:19:54,780 En hugmyndin er að - ég er að reyna að hugsa um - ég get ekki hugsað um líkingar. 237 00:19:54,780 --> 00:19:56,780 Svipað er erfitt. 238 00:19:57,740 --> 00:20:02,700 Eitt þeirra mála af raunverulegur minni eða eitt af því sem það er að leysa 239 00:20:02,700 --> 00:20:06,810 að ferli ætti að vera alveg ókunnugt um annað. 240 00:20:06,810 --> 00:20:12,140 Og svo þú getur skrifað hvaða forrit sem dereferences bara allir músina, 241 00:20:12,140 --> 00:20:19,340 eins og bara skrifa forrit sem segir * (ox1234) 242 00:20:19,340 --> 00:20:22,890 dereferencing og það er minni heimilisfang 1234. 243 00:20:22,890 --> 00:20:28,870 >> En það er allt til stýrikerfi til þá þýða hvað 1234 þýðir. 244 00:20:28,870 --> 00:20:33,960 Svo gerist ef 1234 að vera gilt minni heimilisfang fyrir þessu ferli, 245 00:20:33,960 --> 00:20:38,800 eins og það er á mánudaginn eða eitthvað, þá er þetta mun skila gildi þess minni heimilisfang 246 00:20:38,800 --> 00:20:41,960 eins langt og ferlið veit. 247 00:20:41,960 --> 00:20:47,520 En ef 1234 er ekki gilt netfang, eins og það gerist að lenda 248 00:20:47,520 --> 00:20:52,910 í sumum lítill stykki af minni hér sem er handan við stafla og utan hrúga 249 00:20:52,910 --> 00:20:57,200 og þú hefur í raun ekki að nota það, þá er það þegar þú færð hlutina eins segfaults 250 00:20:57,200 --> 00:21:00,260 vegna þess að þú ert að snerta minni sem þú ættir ekki að vera að snerta. 251 00:21:07,180 --> 00:21:09,340 Þetta er einnig satt - 252 00:21:09,340 --> 00:21:15,440 A 32-bita kerfi, 32 bita þýðir að þú þarft 32 bita til að skilgreina minni heimilisfang. 253 00:21:15,440 --> 00:21:22,970 Það er ástæðan fyrir ábendingum eru 8 bæti því 32 bita eru 8 bæti - eða 4 bæti. 254 00:21:22,970 --> 00:21:25,250 Ábendingar eru 4 bytes. 255 00:21:25,250 --> 00:21:33,680 Svo þegar þú sérð músina eins oxbfffff, sem er - 256 00:21:33,680 --> 00:21:40,080 Innan hverjum forrit sem þú getur bara byggja einhverja músina, 257 00:21:40,080 --> 00:21:46,330 hvar ox0 til uxar 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Nemandi] ekki að segja að þeir eru 4 bytes? >> Já. 259 00:21:49,180 --> 00:21:52,730 [Nemandi] Þá hvert bæti verður - >> [Bowden] Sextánskt. 260 00:21:52,730 --> 00:21:59,360 Sextánskt - 5, 6, 7, 8. Svo ábendingum sem þú ert að fara að alltaf að sjá í sextánskur. 261 00:21:59,360 --> 00:22:01,710 Það er bara hvernig við flokka ábendingum. 262 00:22:01,710 --> 00:22:05,240 Sérhver 2 tölustafi sextánskur er 1 bæti. 263 00:22:05,240 --> 00:22:09,600 Þannig að það er að fara að vera 8 sextánskur tölustafir fyrir 4 bæti. 264 00:22:09,600 --> 00:22:14,190 Svo hvert einasta músina á 32-bita kerfi er að fara að vera 4 bæti, 265 00:22:14,190 --> 00:22:18,550 sem þýðir að í ferli sem þú getur reisa einhverja 4 bæti 266 00:22:18,550 --> 00:22:20,550 og gera músina út af því, 267 00:22:20,550 --> 00:22:32,730 sem þýðir að svo miklu leyti sem það er kunnugt, það getur takast heilt 2 við 32 bæti af minni. 268 00:22:32,730 --> 00:22:34,760 Jafnvel þó að það er í raun ekki að hafa aðgang að þeim, 269 00:22:34,760 --> 00:22:40,190 jafnvel ef þinn tölva hefur aðeins 512 megabæti, telur það hefur það mikið minni. 270 00:22:40,190 --> 00:22:44,930 Og stýrikerfi er sviði nógur að það verður bara tekið það sem þú þarft í raun. 271 00:22:44,930 --> 00:22:49,630 Það þýðir ekki bara að fara, ó, ný aðferð: 4 gigs. 272 00:22:49,630 --> 00:22:51,930 >> Já. >> [Nemandi] Hvað uxa þýtt? Hvers vegna skrifa þú það? 273 00:22:51,930 --> 00:22:54,980 Það er bara tákn fyrir sextánskur. 274 00:22:54,980 --> 00:22:59,590 Þegar þú sérð númer byrja með uxa, eru síðari hluti sextánskur. 275 00:23:01,930 --> 00:23:05,760 [Nemandi] Þú varst að útskýra um hvað gerist þegar forrit lýkur. >> Já. 276 00:23:05,760 --> 00:23:09,480 Hvað gerist þegar forrit lýkur er stýrikerfi 277 00:23:09,480 --> 00:23:13,600 bara þurrka þær kortlagning sem það hefur til þessara talna, og það er það. 278 00:23:13,600 --> 00:23:17,770 Stýrikerfið getur nú bara gefa þessi minni í annað forrit til að nota. 279 00:23:17,770 --> 00:23:19,490 [Nemandi] lagi. 280 00:23:19,490 --> 00:23:24,800 Svo þegar þú skiptir eitthvað á hrúga eða á mánudaginn eða alþjóðlegum breytur eða neitt, 281 00:23:24,800 --> 00:23:27,010 þeir bara hverfa um leið og forritið lýkur 282 00:23:27,010 --> 00:23:32,120 vegna þess að stýrikerfið er nú frjálst að gefa að minni að öðrum ferli. 283 00:23:32,120 --> 00:23:35,150 [Nemandi] Jafnvel þó að það eru sennilega enn gildi skrifað á? >> Já. 284 00:23:35,150 --> 00:23:37,740 Gildin eru líklega enn. 285 00:23:37,740 --> 00:23:41,570 Það er það bara að fara að vera erfitt að komast á þá. 286 00:23:41,570 --> 00:23:45,230 Það er miklu erfiðara að komast á þá en það er að komast á brott skrá 287 00:23:45,230 --> 00:23:51,450 því eytt skrá konar situr þar í langan tíma og harður ökuferð er mikið stærri. 288 00:23:51,450 --> 00:23:54,120 Svo það er að fara að skrifa mismunandi hluta af minni 289 00:23:54,120 --> 00:23:58,640 áður en það verður að skrifa í klumpur af minni að þessi skrá er notað til að vera á. 290 00:23:58,640 --> 00:24:04,520 En helstu minni, RAM, þú flett í gegnum mikið hraðar, 291 00:24:04,520 --> 00:24:08,040 svo það er að fara að mjög hratt að skrifa of mikið. 292 00:24:10,300 --> 00:24:13,340 Spurningar um þetta eða eitthvað annað? 293 00:24:13,340 --> 00:24:16,130 [Nemandi] Ég hef spurningar um mismunandi efni. >> Lagi. 294 00:24:16,130 --> 00:24:19,060 Hefur einhver hefur einhverjar spurningar um þetta? 295 00:24:20,170 --> 00:24:23,120 >> Allt í lagi. Mismunandi efni. >> [Nemandi] lagi. 296 00:24:23,120 --> 00:24:26,550 Ég var að fara í gegnum sumir af the æfa próf, 297 00:24:26,550 --> 00:24:30,480 og einn af þeim var að tala um sizeof 298 00:24:30,480 --> 00:24:35,630 og gildi það skilar eða mismunandi ýmsum tegundum. >> Já. 299 00:24:35,630 --> 00:24:45,060 Og það sagði að bæði int og lengi bæði aftur 4, þannig að þeir eru báðir 4 bæti. 300 00:24:45,060 --> 00:24:48,070 Er einhver munur milli heiltala og a langur, eða er það það sama? 301 00:24:48,070 --> 00:24:50,380 Já, það er munur. 302 00:24:50,380 --> 00:24:52,960 The C Standard - 303 00:24:52,960 --> 00:24:54,950 Ég er líklega að fara að skipta sér upp. 304 00:24:54,950 --> 00:24:58,800 C staðall er bara eins og það C, opinber gögn um C. 305 00:24:58,800 --> 00:25:00,340 Þetta er það sem það segir. 306 00:25:00,340 --> 00:25:08,650 Svo segir C staðall bara að bleikju mun að eilífu og alltaf 1 bæti. 307 00:25:10,470 --> 00:25:19,040 Allt eftir því - stutt er alltaf bara skilgreint sem að vera meira en eða jafnt í bleikju. 308 00:25:19,040 --> 00:25:23,010 Þetta gæti verið stranglega meiri en, en ekki jákvætt. 309 00:25:23,010 --> 00:25:31,940 An int er bara skilgreind sem meira en eða jafnt og stutt. 310 00:25:31,940 --> 00:25:36,210 Og lengi er bara skilgreind sem meira en eða jafnt heiltala. 311 00:25:36,210 --> 00:25:41,600 Og lengi lengi er meiri en eða jafn og fyrir. 312 00:25:41,600 --> 00:25:46,610 Svo er það eina sem C staðall skilgreinir hlutfallsleg röðun öllu. 313 00:25:46,610 --> 00:25:54,880 Raunveruleg upphæð minni að það tekur upp er yfirleitt allt til framkvæmda, 314 00:25:54,880 --> 00:25:57,640 en það er nokkuð vel skilgreind á þessu stigi. >> [Nemandi] lagi. 315 00:25:57,640 --> 00:26:02,490 Svo stuttbuxur eru nánast alltaf að fara að vera 2 bytes. 316 00:26:04,920 --> 00:26:09,950 Ints eru nánast alltaf að fara að vera 4 bæti. 317 00:26:12,070 --> 00:26:15,340 Long þráir eru nánast alltaf að fara að vera 8 bæti. 318 00:26:17,990 --> 00:26:23,160 Og þráir, það fer eftir því hvort þú ert að nota a 32-bita eða 64-bita kerfi. 319 00:26:23,160 --> 00:26:27,450 Svo lengi er að fara að vinna í samræmi við þá tegund af kerfi. 320 00:26:27,450 --> 00:26:31,920 Ef þú ert með 32-bita kerfi eins og búnaðinn, það er að fara að vera 4 bæti. 321 00:26:34,530 --> 00:26:42,570 Ef þú ert með 64-bita eins og a einhver fjöldi af nýlegum tölvum, það er að fara að vera 8 bæti. 322 00:26:42,570 --> 00:26:45,230 >> Ints eru nánast alltaf 4 bæti á þessum tímapunkti. 323 00:26:45,230 --> 00:26:47,140 Long þráir eru næstum alltaf 8 bæti. 324 00:26:47,140 --> 00:26:50,300 Í the fortíð, ints notað til að aðeins 2 bytes. 325 00:26:50,300 --> 00:26:56,840 En eftir að þetta fullkomlega uppfyllir öll þessi tengsl stærra en og jafnt. 326 00:26:56,840 --> 00:27:01,280 Svo lengi er fullkomlega leyfilegt að vera í sömu stærð sem heiltölu, 327 00:27:01,280 --> 00:27:04,030 og það er líka leyfilegt að vera í sömu stærð og fyrir lengi. 328 00:27:04,030 --> 00:27:11,070 Og það gerist bara svo að vera að í 99,999% af kerfi, það er að fara að vera jafn 329 00:27:11,070 --> 00:27:15,800 annaðhvort int eða fyrir löngu. Það veltur bara á 32-bita eða 64-bita. >> [Nemandi] lagi. 330 00:27:15,800 --> 00:27:24,600 Í flotum, hvernig er kommu tilnefnd í skilmálar af bitum? 331 00:27:24,600 --> 00:27:27,160 Eins og tvöfaldur? >> Já. 332 00:27:27,160 --> 00:27:30,570 Þú þarft ekki að vita það fyrir CS50. 333 00:27:30,570 --> 00:27:32,960 Þú þarft ekki einu sinni að læra að í 61. 334 00:27:32,960 --> 00:27:37,350 Þú lærir ekki að í raun á hvaða námskeið. 335 00:27:37,350 --> 00:27:42,740 Það er bara framsetning. 336 00:27:42,740 --> 00:27:45,440 Ég gleymi nákvæmlega allotments hluti. 337 00:27:45,440 --> 00:27:53,380 Hugmyndin um fljótandi lið er að þú úthluta tilteknum fjölda bita til að tákna - 338 00:27:53,380 --> 00:27:56,550 Í grundvallaratriðum, allt er í vísindalegum merki. 339 00:27:56,550 --> 00:28:05,600 Svo þú úthluta tilteknum fjölda bita til að tákna fjölda sjálft, eins og 1,2345. 340 00:28:05,600 --> 00:28:10,200 Ég get aldrei tákna fjölda með fleiri stafi en 5. 341 00:28:12,200 --> 00:28:26,300 Þá skiptir einnig tilteknum fjölda bita þannig að það hefur tilhneigingu til að vera eins og 342 00:28:26,300 --> 00:28:32,810 þú getur aðeins farið upp í ákveðinn fjölda, eins og það er stærsta veldisvísir sem þú getur haft, 343 00:28:32,810 --> 00:28:36,190 og þú getur bara farið niður að ákveðnu veldisvísir, 344 00:28:36,190 --> 00:28:38,770 eins sem er minnsti veldisvísir þú getur haft. 345 00:28:38,770 --> 00:28:44,410 >> Ég man ekki nákvæmlega bits leið er úthlutað öllum þessum gildum, 346 00:28:44,410 --> 00:28:47,940 en ákveðinn fjöldi bita eru tileinkuð 1,2345, 347 00:28:47,940 --> 00:28:50,930 annar ákveðinn fjölda bita eru tileinkuð veldisvísir, 348 00:28:50,930 --> 00:28:55,670 og það er aðeins hægt að tákna veldisvísinn af ákveðinni stærð. 349 00:28:55,670 --> 00:29:01,100 [Nemandi] og tvöfalda? Er það eins og extra langt fljóta? >> Já. 350 00:29:01,100 --> 00:29:07,940 Það er það sama sem fljóta nema nú þú ert að nota 8 bæti í stað 4 bæti. 351 00:29:07,940 --> 00:29:11,960 Nú munt þú vera fær um að nota 9 tölustafi eða 10 tölustafi, 352 00:29:11,960 --> 00:29:16,630 og þetta mun vera fær um að fara upp í 300 í stað 100. >> [Nemandi] lagi. 353 00:29:16,630 --> 00:29:21,550 Og fljóta eru einnig 4 bæti. >> Já. 354 00:29:21,550 --> 00:29:27,520 Jæja, aftur veltur það líklega almennt á framkvæmd, 355 00:29:27,520 --> 00:29:30,610 en flýtur eru 4 bytes, eru tvöfaldar 8. 356 00:29:30,610 --> 00:29:33,440 Doubles kallast tvöfaldur vegna þess að þeir eru tvöfalt stærð flotum. 357 00:29:33,440 --> 00:29:38,380 [Nemandi] lagi. Og eru það tvöfaldar tvöfaldur? >> Það eru ekki. 358 00:29:38,380 --> 00:29:43,660 Ég held - >> [nemandi] Eins lengi þráir? >> Já. Ég held ekki. Já. 359 00:29:43,660 --> 00:29:45,950 [Nemandi] Á próf á síðasta ári var spurning um helstu virkni 360 00:29:45,950 --> 00:29:49,490 þurfa að vera hluti af kerfinu þínu. 361 00:29:49,490 --> 00:29:52,310 Svarið var að það þarf ekki að vera hluti af kerfinu þínu. 362 00:29:52,310 --> 00:29:55,100 Í hvaða aðstæðum? Það er það sem ég sá. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Það virðist - >> [nemandi] Hvaða aðstæður? 364 00:29:59,090 --> 00:30:02,880 Ertu með vandamál? >> [Nemandi] Já, ég get örugglega draga það upp. 365 00:30:02,880 --> 00:30:07,910 Það þarf ekki að vera, tæknilega, en í grundvallaratriðum það er að fara til vera. 366 00:30:07,910 --> 00:30:10,030 [Nemandi] Ég sá einn á annað ári. 367 00:30:10,030 --> 00:30:16,220 Það var eins og True eða False: Gilt - >> Ó, C skrá.? 368 00:30:16,220 --> 00:30:18,790 . [Nemandi] Allir C Skráin verður að hafa - [bæði að tala í einu - óskiljanlegur] 369 00:30:18,790 --> 00:30:21,120 Allt í lagi. Svo er það aðskilið. 370 00:30:21,120 --> 00:30:26,800 >> A. C skrá þarf bara að vera virka. 371 00:30:26,800 --> 00:30:32,400 Þú getur safna saman skrá í kóða vél, tvöfaldur, hvað, 372 00:30:32,400 --> 00:30:36,620 án þess að vera executable enn. 373 00:30:36,620 --> 00:30:39,420 Gilt executable verður að hafa helstu hlutverk. 374 00:30:39,420 --> 00:30:45,460 Þú getur skrifað 100 aðgerðir í 1 skrá en ekki helstu 375 00:30:45,460 --> 00:30:48,800 og svo saman að ofan til tvöfaldur, 376 00:30:48,800 --> 00:30:54,460 þá skrifa aðra skrá sem aðeins hefur helsta en það kallar fullt af þessum aðgerðum 377 00:30:54,460 --> 00:30:56,720 í tvöfaldur skrá hérna. 378 00:30:56,720 --> 00:31:01,240 Og svo þegar þú ert að gera executable, það er það sem linker gerir 379 00:31:01,240 --> 00:31:05,960 það sameinar þessar 2 tvöfaldur skrár inn í executable. 380 00:31:05,960 --> 00:31:11,400 Svo. C skrá þarf ekki að hafa meginhlutverki yfirleitt. 381 00:31:11,400 --> 00:31:19,220 Og stór bækistöðvar kóða sem þú munt sjá þúsundir. C skrá og 1 helstu skrá. 382 00:31:23,960 --> 00:31:26,110 Fleiri spurningar? 383 00:31:29,310 --> 00:31:31,940 [Nemandi] Það var annar spurning. 384 00:31:31,940 --> 00:31:36,710 Það sagði að er þýðanda. True eða False? 385 00:31:36,710 --> 00:31:42,030 Og svarið var rangt, og ég skildi hvers vegna það er ekki eins og Clang. 386 00:31:42,030 --> 00:31:44,770 En hvað köllum að gera ef það er ekki? 387 00:31:44,770 --> 00:31:49,990 Gera er í rauninni bara - ég get séð nákvæmlega hvað það kallar það. 388 00:31:49,990 --> 00:31:52,410 En það liggur bara skipanir. 389 00:31:53,650 --> 00:31:55,650 Gerðu. 390 00:31:58,240 --> 00:32:00,870 Ég get rífa þetta upp. Já. 391 00:32:10,110 --> 00:32:13,180 Ó, já. Gera er einnig að. 392 00:32:13,180 --> 00:32:17,170 Þetta segir tilgangur gera gagnsemi er að ákveða sjálfkrafa 393 00:32:17,170 --> 00:32:19,610 hvaða stykki af stórum program þarf að recompiled 394 00:32:19,610 --> 00:32:22,350 og gefa út skipanir til að laun þeirra. 395 00:32:22,350 --> 00:32:27,690 Þú getur gert skrár sem eru alveg gríðarstór. 396 00:32:27,690 --> 00:32:33,210 Gerðu lítur á tíma frímerki af skrám og eins og ég sagði áður, 397 00:32:33,210 --> 00:32:36,930 þú getur safna saman einstakar skrár niður, og það er ekki fyrr en þú færð að linker 398 00:32:36,930 --> 00:32:39,270 að þeir setja saman í keyrsluskrá. 399 00:32:39,270 --> 00:32:43,810 Svo ef þú ert með 10 mismunandi skrár og þú gerir breytingar til 1 af þeim, 400 00:32:43,810 --> 00:32:47,870 þá er það að gera er að fara að gera bara laun að 1 skrá 401 00:32:47,870 --> 00:32:50,640 og þá relink allt saman. 402 00:32:50,640 --> 00:32:53,020 En það er miklu Dumber en það. 403 00:32:53,020 --> 00:32:55,690 Það er komið að þér að alveg skilgreina að það er það sem það ætti að gera. 404 00:32:55,690 --> 00:32:59,560 Það sjálfgefið hefur getu til að viðurkenna þennan stimpil tíma efni, 405 00:32:59,560 --> 00:33:03,220 en þú getur skrifað að gera skrá að gera neitt. 406 00:33:03,220 --> 00:33:09,150 Þú getur skrifað að gera skrána þannig að þegar þú skrifar að það bara CD í aðra möppu. 407 00:33:09,150 --> 00:33:15,560 Ég var að fá svekktur vegna þess að ég tittur allt inni tækis míns 408 00:33:15,560 --> 00:33:21,740 og þá er ég að skoða PDF frá Mac. 409 00:33:21,740 --> 00:33:30,720 >> Svo fer ég í Finder og ég get ekki fara, að tengjast við miðlara, 410 00:33:30,720 --> 00:33:36,950 og þjónustan sem ég tengst er Appliance minn, og þá vil ég opna PDF 411 00:33:36,950 --> 00:33:40,190 sem fær unnin af latexi. 412 00:33:40,190 --> 00:33:49,320 En ég var að fá svekktur vegna þess að hvert einasta skipti sem ég þarf að uppfæra PDF, 413 00:33:49,320 --> 00:33:53,900 Ég þurfti að afrita það til a sérstakur skrá að það gæti nálgast 414 00:33:53,900 --> 00:33:57,710 og það var að fá pirrandi. 415 00:33:57,710 --> 00:34:02,650 Svo í stað þess að ég skrifaði að gera skrá, sem þú þarft að skilgreina hvernig það gerir það. 416 00:34:02,650 --> 00:34:06,130 Hvernig þú gerir í þessu er PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Rétt eins og allir aðrir gera skrá - eða ég giska á að þú hefur ekki séð gera skrá, 418 00:34:10,090 --> 00:34:13,510 en við höfum í tækið á heimsvísu gera skrá sem bara segir, 419 00:34:13,510 --> 00:34:16,679 Ef þú ert að setja saman C skrá, nota Clang. 420 00:34:16,679 --> 00:34:20,960 Og svo hér í skrá gera sem ég að gera ég segi, 421 00:34:20,960 --> 00:34:25,020 þessi skrá sem þú ert að fara til að vilja taka saman við PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Og svo er það PDF LaTeX sem er að gera frágang. 423 00:34:27,889 --> 00:34:31,880 Gera ekki gerð. Það er bara að keyra þessar skipanir í röð sem ég tilgreint. 424 00:34:31,880 --> 00:34:36,110 Svo rekur PDF latex, afrit það það til að skrá að ég vil það til að afrita, 425 00:34:36,110 --> 00:34:38,270 það er CD til að skrá og gerir aðra hluti, 426 00:34:38,270 --> 00:34:42,380 en allt það gerir er að viðurkenna þegar skrá breytingar, 427 00:34:42,380 --> 00:34:45,489 og ef það breytist, þá mun það að keyra skipanir sem það er ætlast til að keyra 428 00:34:45,489 --> 00:34:48,760 þegar skrá breytingar. >> [Nemandi] lagi. 429 00:34:50,510 --> 00:34:54,420 Ég veit ekki hvar á heimsvísu skrár gera er fyrir mig að athuga það út. 430 00:34:57,210 --> 00:35:04,290 Aðrar spurningar? Nokkuð frá fortíðinni Skyndipróf? Allir músina hluti? 431 00:35:06,200 --> 00:35:08,730 Það eru lúmskur hluti með ábendingum eins - 432 00:35:08,730 --> 00:35:10,220 Ég ætla ekki að fara að vera fær um að finna quiz spurning um það - 433 00:35:10,220 --> 00:35:16,250 en rétt eins og þessa tegund af hlutur. 434 00:35:19,680 --> 00:35:24,060 Gakktu úr skugga um að þú skiljir að þegar ég segi int * x * y - 435 00:35:24,890 --> 00:35:28,130 Þetta er ekki nákvæmlega neitt hérna, held ég. 436 00:35:28,130 --> 00:35:32,140 En eins og * x * y, þá eru 2 breytur sem eru í stafla. 437 00:35:32,140 --> 00:35:37,220 Þegar ég segi x = malloc (sizeof (int)), x er enn breyta á mánudaginn, 438 00:35:37,220 --> 00:35:41,180 malloc er einhver blokk yfir í hrúga, og við erum með x benda á hrúga. 439 00:35:41,180 --> 00:35:43,900 >> Svo eitthvað um stafla bendir á hrúga. 440 00:35:43,900 --> 00:35:48,100 Alltaf þegar þú malloc neitt, þú ert óhjákvæmilega að geyma það inni í músina. 441 00:35:48,100 --> 00:35:55,940 Svo að bendillinn er á mánudaginn, sem malloced blokk er á hrúga. 442 00:35:55,940 --> 00:36:01,240 A einhver fjöldi af fólk fá rugla og segja int * x = malloc, x er á hrúga. 443 00:36:01,240 --> 00:36:04,100 Nei Hvað x bendir til er á hrúga. 444 00:36:04,100 --> 00:36:08,540 x sjálft er á mánudaginn, nema af einhverri ástæðu þú hefur verið x alþjóðlegt breytu, 445 00:36:08,540 --> 00:36:11,960 en þá gerist það að vera í öðru svæði af minni. 446 00:36:13,450 --> 00:36:20,820 Svo halda utan eru þessar kassi og ör skýringarmyndir nokkuð algengt fyrir próf. 447 00:36:20,820 --> 00:36:25,740 Eða ef það er ekki á próf 0, verður það að vera á prófinu 1. 448 00:36:27,570 --> 00:36:31,940 Þú ættir að vita allt um þetta, skref í söfnun 449 00:36:31,940 --> 00:36:35,740 þar sem þú þurftir að svara spurningum um þær. Já. 450 00:36:35,740 --> 00:36:38,940 [Nemandi] Gat við förum yfir þeim skrefum - >> Sure. 451 00:36:48,340 --> 00:36:58,640 Áður skref og setja saman við höfum forvinnu, 452 00:36:58,640 --> 00:37:16,750 safna saman, samsetningu, og tengja. 453 00:37:16,750 --> 00:37:21,480 Forvinnu. Hvað þýðir það að gera? 454 00:37:29,720 --> 00:37:32,290 Það er einfaldasta skref í - ja, ekki eins - 455 00:37:32,290 --> 00:37:35,770 það þýðir ekki að það ætti að vera augljóst, en það er auðveldasta skrefið. 456 00:37:35,770 --> 00:37:38,410 Þið krakkar geta framkvæma það sjálf. Já. 457 00:37:38,410 --> 00:37:43,410 [Nemandi] Taktu það sem þú hefur í þinn inniheldur svona og afritar og þá einnig skilgreinir. 458 00:37:43,410 --> 00:37:49,250 Það lítur út fyrir hluti eins og # include og # skilgreina, 459 00:37:49,250 --> 00:37:53,800 og það bara afrit og deig hvað þeir meina í raun og veru. 460 00:37:53,800 --> 00:37:59,240 Svo þegar þú segir # include cs50.h er Preprocessor er að afrita og líma cs50.h 461 00:37:59,240 --> 00:38:01,030 í þeirri línu. 462 00:38:01,030 --> 00:38:06,640 Þegar þú segir # skilgreina x að vera 4, Preprocessor fer í gegnum allt forritið 463 00:38:06,640 --> 00:38:10,400 og kemur öllum tilvikum af x með 4. 464 00:38:10,400 --> 00:38:17,530 Svo tekur Preprocessor gilt C skrá og framleiðsla gilt C skrá 465 00:38:17,530 --> 00:38:20,300 þar sem hlutirnir hafa verið afrituð og líma. 466 00:38:20,300 --> 00:38:24,230 Svo nú að setja saman. Hvað þýðir það að gera? 467 00:38:25,940 --> 00:38:28,210 [Nemandi] Það fer úr C í tvöfaldur. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Það þýðir ekki að fara alla leið til tvöfaldur. 469 00:38:30,970 --> 00:38:34,220 [Nemandi] Til vél númer þá? >> Það er ekki vél númer. 470 00:38:34,220 --> 00:38:35,700 [Nemandi] þing? >> Þing. 471 00:38:35,700 --> 00:38:38,890 Það fer til þingsins áður en það fer alla leið til C kóða, 472 00:38:38,890 --> 00:38:45,010 og flest tungumál að gera eitthvað eins og this. 473 00:38:47,740 --> 00:38:50,590 Veldu hvaða hár-láréttur flötur tungumál, og ef þú ert að fara að þýða það, 474 00:38:50,590 --> 00:38:52,390 það er líklegt til að safna saman í skrefum. 475 00:38:52,390 --> 00:38:58,140 Fyrst það er að fara að safna saman Python í C, þá er að fara að safna saman C til þingsins, 476 00:38:58,140 --> 00:39:01,600 og svo þingið er að fara að fá þýða að tvöfaldur. 477 00:39:01,600 --> 00:39:07,800 Svo að setja saman er að fara að koma með það frá C til þingsins. 478 00:39:07,800 --> 00:39:12,130 Orðið að setja saman þýðir yfirleitt koma það frá meiri 479 00:39:12,130 --> 00:39:14,340 til lægra stigi forritunarmál. 480 00:39:14,340 --> 00:39:19,190 Svo er þetta eina skrefið í samantekt þar sem þú byrjar með a hár-láréttur flötur tungumál 481 00:39:19,190 --> 00:39:23,270 og endar í lágu stigi tungumál, og það er hvers vegna það skref er kölluð söfnun. 482 00:39:25,280 --> 00:39:33,370 [Nemandi] Á samantekt, við skulum segja að þú hafir gert # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Mun þýðandinn laun cs50.h, svona aðgerðir sem eru þar, 484 00:39:42,190 --> 00:39:45,280 og þýða það inn í kóða þingi og vel, 485 00:39:45,280 --> 00:39:50,830 eða mun það afrita og líma eitthvað sem hefur verið fyrir þingið? 486 00:39:50,830 --> 00:39:56,910 cs50.h mun nánast aldrei endað á þingi. 487 00:39:59,740 --> 00:40:03,680 Stuff eins og frumgerð virka og hlutirnir eru bara fyrir þig að vera varkár. 488 00:40:03,680 --> 00:40:09,270 Það tryggir að þýðandinn getur athugað það eins og þú ert að kalla aðgerðir 489 00:40:09,270 --> 00:40:12,910 með rétta tegund aftur og rétt rök og efni. 490 00:40:12,910 --> 00:40:18,350 >> Svo cs50.h verður preprocessed í skrá, og svo þegar hún er gerð 491 00:40:18,350 --> 00:40:22,310 það er í rauninni hent eftir að það gerir viss um að allt er kallað rétt. 492 00:40:22,310 --> 00:40:29,410 En aðgerðir skilgreindar í CS50 bókasafn, sem eru aðskilin frá cs50.h, 493 00:40:29,410 --> 00:40:33,610 þá verður ekki sérstaklega saman. 494 00:40:33,610 --> 00:40:37,270 Það mun í raun koma niður í tengja skref, þannig að við munum komast að því í annað. 495 00:40:37,270 --> 00:40:40,100 En fyrst, það er samsetningu? 496 00:40:41,850 --> 00:40:44,500 [Nemandi] Þingið í tvöfaldur? >> Já. 497 00:40:46,300 --> 00:40:48,190 Samsetningu. 498 00:40:48,190 --> 00:40:54,710 Við köllum það ekki að setja saman vegna Þingið er ansi mikið hreint þýðing tvöfaldur. 499 00:40:54,710 --> 00:41:00,230 Það er mjög lítið rökfræði í að fara frá þinginu til tvöfaldur. 500 00:41:00,230 --> 00:41:03,180 Það er bara eins og að horfa upp á borð, ó, við höfum þessa fræðslu; 501 00:41:03,180 --> 00:41:06,290 sem svarar til tvöfaldur 01110. 502 00:41:10,200 --> 00:41:15,230 Og svo skrár sem samsetningu almennt framleiðsla eru. O skrár. 503 00:41:15,230 --> 00:41:19,020 Og. O skrár eru það sem við vorum að segja áður, 504 00:41:19,020 --> 00:41:21,570 hvernig skrá þarf ekki að hafa meginhlutverki. 505 00:41:21,570 --> 00:41:27,640 Hvaða skrá er hægt að safna saman niður á. O skrá svo lengi sem það er í gildi C skrá. 506 00:41:27,640 --> 00:41:30,300 Það er hægt að safna saman niður. O. 507 00:41:30,300 --> 00:41:43,030 Nú, tengja er það í raun koma fullt af. O skrá og koma þeim til executable. 508 00:41:43,030 --> 00:41:51,110 Og svo hvað tengir er hægt að hugsa um CS50 bókasafninu sem. O skrá. 509 00:41:51,110 --> 00:41:56,980 Það er nú þegar saman tvöfaldur skrá. 510 00:41:56,980 --> 00:42:03,530 Og svo þegar þú saman skrána, hello.c þín, sem kallar GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c fær saman niður hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o er nú tvöfaldur. 513 00:42:08,910 --> 00:42:12,830 Það notar GetString, svo það þarf að fara yfir til cs50.o, 514 00:42:12,830 --> 00:42:16,390 og linker smooshes þeim saman og afrit GetString í skrána 515 00:42:16,390 --> 00:42:20,640 og kemur út með executable sem hefur allar aðgerðir sem það þarfnast. 516 00:42:20,640 --> 00:42:32,620 Svo cs50.o ekki raun O skrá, en það er nógu nálægt að það er enginn grundvallar munur. 517 00:42:32,620 --> 00:42:36,880 Svo kemur að tengja bara fullt af skrá saman 518 00:42:36,880 --> 00:42:41,390 sem sérstaklega inniheldur allar aðgerðir sem ég þarf að nota 519 00:42:41,390 --> 00:42:46,120 og skapar executable sem mun í raun keyra. 520 00:42:48,420 --> 00:42:50,780 >> Og svo er það líka það sem við vorum að segja fyrir 521 00:42:50,780 --> 00:42:55,970 þar sem þú getur haft 1000. c skrá, safna saman að þá alla til. o skrá, 522 00:42:55,970 --> 00:43:00,040 sem mun væntanlega taka nokkurn tíma, svo að breyta 1. C skrá. 523 00:43:00,040 --> 00:43:05,480 Þú þarft aðeins að laun að 1. C skrá og þá relink allt annað, 524 00:43:05,480 --> 00:43:07,690 tengja allt aftur saman. 525 00:43:09,580 --> 00:43:11,430 [Nemandi] Þegar við erum að tengja við skrifa lcs50? 526 00:43:11,430 --> 00:43:20,510 Já, svo-lcs50. Að merkja merki til linker sem þú ættir að tengja í því safninu. 527 00:43:26,680 --> 00:43:28,910 Spurningar? 528 00:43:41,310 --> 00:43:46,860 Höfum við farið yfir tvöfaldur en að 5 sekúndum á fyrsta fyrirlestri? 529 00:43:50,130 --> 00:43:53,010 Ég held ekki. 530 00:43:55,530 --> 00:43:58,820 Þú ættir að vita allt um stóru OS sem við höfum farið yfir, 531 00:43:58,820 --> 00:44:02,670 og þú ættir að vera fær um að, ef við gaf þér virka, 532 00:44:02,670 --> 00:44:09,410 þú ættir að vera fær um að segja að það er stór O, u.þ.b.. Eða vel, stór O er gróft. 533 00:44:09,410 --> 00:44:15,300 Svo ef þú sérð hreiður fyrir lykkjur lykkja á sama fjölda af hlutum, 534 00:44:15,300 --> 00:44:22,260 eins og int i, i > [nemandi] N veldi. >> Gæta þess að vera N veldi. 535 00:44:22,260 --> 00:44:25,280 Ef þú hefur þrefaldur hreiður, gæta þess að vera N cubed. 536 00:44:25,280 --> 00:44:29,330 Svo þessi tegund af hlutur sem þú ættir að vera fær um að benda á strax. 537 00:44:29,330 --> 00:44:33,890 Þú þarft að vita insertion sort og kúla raða og sameina tegund og öll þeirra. 538 00:44:33,890 --> 00:44:41,420 Það er auðveldara að skilja hvers vegna þeir eru þeir N veldi og n log n og allt það 539 00:44:41,420 --> 00:44:47,810 því ég held að það var á spurningakeppni eitt ár þar sem við gáfum í grundvallaratriðum þér 540 00:44:47,810 --> 00:44:55,050 sem framkvæmd tegund kúla og sagði: "Hvað er í gangi þegar þetta virka?" 541 00:44:55,050 --> 00:45:01,020 Svo ef þú viðurkenna það eins konar kúla, þá getur þú strax að segja N veldi. 542 00:45:01,020 --> 00:45:05,470 En ef þú horfir bara á hana, heldur þú ekki einu sinni að átta sig kúla tegund það er, 543 00:45:05,470 --> 00:45:08,990 þú getur bara sagt þetta er að gera þetta og þetta. Þetta er n veldi. 544 00:45:12,350 --> 00:45:14,710 [Nemandi] Eru einhverjar erfiðar dæmi sem þú getur komið upp með, 545 00:45:14,710 --> 00:45:20,370 eins svipuðum hugmynd vangaveltur út? 546 00:45:20,370 --> 00:45:24,450 >> Ég held ekki að við myndum gefa þér einhverjar erfiðar dæmi. 547 00:45:24,450 --> 00:45:30,180 The konar kúla hlutur er óður í eins og sterkur eins og við myndum fara, 548 00:45:30,180 --> 00:45:36,280 og jafnvel það, svo lengi sem þú skilur að þú ert iterating yfir fjölda 549 00:45:36,280 --> 00:45:41,670 fyrir hvert frumefni í fylki, sem er að fara að vera eitthvað sem er n veldi. 550 00:45:45,370 --> 00:45:49,940 Það eru almennar spurningar, eins og hérna við höfum - Ó. 551 00:45:55,290 --> 00:45:58,530 Bara um daginn, Doug krafa, "Ég hef fundið reiknirit sem geta raða fylki 552 00:45:58,530 --> 00:46:01,780 "Á n tölur í O (log n) tíma!" 553 00:46:01,780 --> 00:46:04,900 Svo hvernig vitum við að er ómögulegt? 554 00:46:04,900 --> 00:46:08,850 [Inaudible nemandi svar] >> Já. 555 00:46:08,850 --> 00:46:13,710 Minnsta kosti, þú þarft að snerta hvert frumefni í fylking, 556 00:46:13,710 --> 00:46:16,210 þannig að það er ómögulegt að raða fylki af - 557 00:46:16,210 --> 00:46:20,850 Ef allt er í óflokkuðum röð, þá þú ert að fara að snerta allt í fylking, 558 00:46:20,850 --> 00:46:25,320 þannig að það er ómögulegt að gera það í minna en O á n. 559 00:46:27,430 --> 00:46:30,340 [Nemandi] Þú sýndi okkur það dæmi að vera fær um að gera það í O á n 560 00:46:30,340 --> 00:46:33,920 ef þú notar mikið minni. >> Já. 561 00:46:33,920 --> 00:46:37,970 Og that's - Ég gleymi því that's - Er það að telja tegund? 562 00:46:47,360 --> 00:46:51,330 Hmm. Það er heiltala flokkun reiknirit. 563 00:46:59,850 --> 00:47:05,100 Ég var að leita að sérstöku heiti fyrir þetta að ég gat ekki munað síðustu viku. 564 00:47:05,100 --> 00:47:13,000 Já. Þetta eru þær tegundir af konar sem geta náð hlutina í stóra O í n. 565 00:47:13,000 --> 00:47:18,430 En það eru takmörk, eins og þú getur aðeins notað heiltölur allt að tilteknum fjölda. 566 00:47:20,870 --> 00:47:24,560 Plús ef þú ert að reyna að raða eitthvað that's - 567 00:47:24,560 --> 00:47:30,750 Ef array er 012, -12, 151, 4 milljónir, 568 00:47:30,750 --> 00:47:35,120 þá einn þátturinn er að fara að alveg eyðilagt alla flokkun. 569 00:47:42,060 --> 00:47:44,030 >> Spurningar? 570 00:47:49,480 --> 00:47:58,870 [Nemandi] Ef þú hafa a endurkvæma virka og það gerir bara endurkvæma símtöl 571 00:47:58,870 --> 00:48:02,230 innan til baka yfirlýsingu, það er hali endurkvæma, 572 00:48:02,230 --> 00:48:07,360 og svo myndi það ekki nota meira minni á afturkreistingur 573 00:48:07,360 --> 00:48:12,550 eða það væri að minnsta kosti að nota sambærilega minni sem endurtekningu lausn? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Já. 575 00:48:14,530 --> 00:48:19,840 Það myndi líklega vera nokkru minni, en ekki í raun. 576 00:48:19,840 --> 00:48:23,290 Tail endurkvæma er nokkuð gott. 577 00:48:23,290 --> 00:48:32,640 Horft aftur á ramma stakkur, segja skulum við hafa helstu 578 00:48:32,640 --> 00:48:42,920 og við höfum int bar (int x) eða eitthvað. 579 00:48:42,920 --> 00:48:52,310 Þetta er ekki fullkomið endurkvæma virka, en aftur Bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Svo augljóslega, þetta er gölluð. Þú þarft grunn tilvikum og efni. 581 00:48:57,620 --> 00:49:00,360 En hugmyndin hér er að þetta er hali endurkvæma, 582 00:49:00,360 --> 00:49:06,020 sem þýðir að þegar helstu símtöl bar það er að fara að fá stafla ramma þess. 583 00:49:09,550 --> 00:49:12,440 Í þessum stafla ramma það er að fara til vera a lítill blokk af minni 584 00:49:12,440 --> 00:49:17,490 sem svarar til rifrildi x hennar. 585 00:49:17,490 --> 00:49:25,840 Og svo skulum segja helstu gerist að hringja bar (100); 586 00:49:25,840 --> 00:49:30,050 Svo x ætlar að byrja út sem 100. 587 00:49:30,050 --> 00:49:35,660 Ef þýðandinn viðurkennir að þetta er hali endurkvæma virka, 588 00:49:35,660 --> 00:49:38,540 svo þegar Bar gerir endurkvæma hringja til bar, 589 00:49:38,540 --> 00:49:45,490 í stað þess að búa til nýja stafla ramma, sem er þar sem stafla byrjar að vaxa að mestu, 590 00:49:45,490 --> 00:49:48,220 lokum mun keyra hrúga og þá færðu segfaults 591 00:49:48,220 --> 00:49:51,590 því minni byrjar rekast. 592 00:49:51,590 --> 00:49:54,830 >> Svo í stað þess að gera eigin stafla ramma þess, getur það grein, 593 00:49:54,830 --> 00:49:59,080 hey, aldrei ég virkilega þarf að koma aftur á þessa stafla ramma, 594 00:49:59,080 --> 00:50:08,040 svo í stað þess að ég ætla bara að skipta um þessa fullyrðingu með 99 og þá byrja bar allt. 595 00:50:08,040 --> 00:50:11,810 Og þá mun það gera það aftur og það mun ná aftur bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 og í stað þess að gera nýja stafla ramma, það verður bara að koma í stað núverandi rök hennar með 98 597 00:50:17,320 --> 00:50:20,740 og svo hoppa til baka í upphafi bar. 598 00:50:23,860 --> 00:50:30,430 Þá starfsemi, í stað þess að 1 gildi á mánudaginn og stökk aftur í byrjun, 599 00:50:30,430 --> 00:50:32,430 eru mjög duglegur. 600 00:50:32,430 --> 00:50:41,500 Svo er ekki bara þetta sama minni notkun sem sérstakt fall sem endurtekningu 601 00:50:41,500 --> 00:50:45,390 vegna þess að þú ert bara að nota 1 stafla ramma, en þú ert ekki þjáist af downsides 602 00:50:45,390 --> 00:50:47,240 að þurfa að hringja í aðgerðir. 603 00:50:47,240 --> 00:50:50,240 Starf aðgerðir geta verið nokkuð dýr vegna þess að það þarf að gera allt þetta skipulag 604 00:50:50,240 --> 00:50:52,470 og tearDown og allt þetta dót. 605 00:50:52,470 --> 00:50:58,160 Svo er þetta hali endurkvæmni gott. 606 00:50:58,160 --> 00:51:01,170 [Nemandi] Hvers vegna er það ekki skapa ný skref? 607 00:51:01,170 --> 00:51:02,980 Vegna þess að hún gerir sér grein fyrir að það þarf ekki að. 608 00:51:02,980 --> 00:51:07,800 The kalla á bar er bara aftur endurkvæma hringja. 609 00:51:07,800 --> 00:51:12,220 Svo það þarf ekki að gera neitt með skilagildi. 610 00:51:12,220 --> 00:51:15,120 Það er bara að fara strax aftur því. 611 00:51:15,120 --> 00:51:20,530 Svo það er bara að fara að skipta um eigin rök hennar og byrja upp á nýtt. 612 00:51:20,530 --> 00:51:25,780 Og líka, ef þú ert ekki með hala endurkvæma útgáfu, 613 00:51:25,780 --> 00:51:31,460 þá færðu allar þessar bars þar þegar þetta Bar skilar 614 00:51:31,460 --> 00:51:36,010 það hefur til að skila gildi til þessa, þá er barinn strax aftur 615 00:51:36,010 --> 00:51:39,620 og það skilar gildi til þessa, þá er það bara að fara að stað aftur 616 00:51:39,620 --> 00:51:41,350 og aftur gildi þess að þessa. 617 00:51:41,350 --> 00:51:45,350 Svo þú ert að vista þetta pabbi allt þetta burt af stafla 618 00:51:45,350 --> 00:51:48,730 þar sem skilagildi er bara að fara til að fara framhjá alla leið aftur upp engu að síður. 619 00:51:48,730 --> 00:51:55,400 Svo hvers vegna ekki bara að skipta um rifrildi okkar við uppfærðum rök og byrja upp á nýtt? 620 00:51:57,460 --> 00:52:01,150 Ef aðgerð er ekki hali endurkvæma, ef þú gerir eitthvað eins og - 621 00:52:01,150 --> 00:52:07,530 [Nemandi] ef Bar (x + 1). >> Já. 622 00:52:07,530 --> 00:52:11,770 >> Svo ef þú setur það í ástandi, þá þú ert að gera eitthvað með skilagildi. 623 00:52:11,770 --> 00:52:16,260 Eða jafnvel ef þú gera bara aftur 2 * Bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Svo nú Bar (x - 1) þarf að fara í röð fyrir það að reikna 2 sinnum að gildi, 625 00:52:23,560 --> 00:52:26,140 svo nú er það þarf eigin sérstaka stafla ramma þess, 626 00:52:26,140 --> 00:52:31,180 og nú, sama hversu harður þú reynir, þú ert að fara að þurfa að - 627 00:52:31,180 --> 00:52:34,410 Þetta er ekki hali endurkvæma. 628 00:52:34,410 --> 00:52:37,590 [Nemandi] Myndi ég reyna að koma með endurkvæmni að miða að hali endurkvæmni - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Í fullkomnum heimi, en í CS50 þú þarft ekki að. 630 00:52:43,780 --> 00:52:49,280 Til að fá hali endurkvæmni, almennt, setja þig upp til viðbótar rök 631 00:52:49,280 --> 00:52:53,550 þar bar vilja taka int x í y 632 00:52:53,550 --> 00:52:56,990 og y samsvarar fullkominn hlutur sem þú vilt að fara. 633 00:52:56,990 --> 00:53:03,650 Svo þá er þetta sem þú ert að fara að vera aftur bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Svo það er bara hár-láréttur flötur hvernig þú umbreyta það til að vera hali endurkvæma. 635 00:53:09,810 --> 00:53:13,790 En auka rök - 636 00:53:13,790 --> 00:53:17,410 Og svo á endanum þegar þú nærð stöð mál þitt, aftur bara y 637 00:53:17,410 --> 00:53:22,740 vegna þess að þú hefur verið að safna allan tímann skilagildi sem þú vilt. 638 00:53:22,740 --> 00:53:27,280 Manni hefur verið að gera það iteratively en með endurkvæma símtöl. 639 00:53:32,510 --> 00:53:34,900 Spurningar? 640 00:53:34,900 --> 00:53:39,890 [Nemandi] kannski um tölur músina, eins og þegar strengi. >> Jú. 641 00:53:39,890 --> 00:53:43,610 Pointer tölur. 642 00:53:43,610 --> 00:53:48,440 Þegar band það er auðvelt vegna þess að strengir séu char stjörnur, 643 00:53:48,440 --> 00:53:51,860 chars eru að eilífu og alltaf eitt bæti, 644 00:53:51,860 --> 00:53:57,540 og svo er bendillinn stærðfræði jafngildir reglulega tölur þegar þú ert að takast á við strengi. 645 00:53:57,540 --> 00:54:08,790 Segjum bara char * s = "halló". 646 00:54:08,790 --> 00:54:11,430 Þannig að við höfum blokk í minni. 647 00:54:19,490 --> 00:54:22,380 Það þarf 6 bæti vegna þess að þú þarft alltaf núll Ljúka. 648 00:54:22,380 --> 00:54:28,620 Og char * s er að fara að benda á í upphafi þessarar fylkisins. 649 00:54:28,620 --> 00:54:32,830 Svo bendir þar. 650 00:54:32,830 --> 00:54:36,710 Nú, þetta er í grundvallaratriðum hvernig allir fylki virkar, 651 00:54:36,710 --> 00:54:40,780 hvort sem það var aftur með malloc eða hvort það er á mánudaginn. 652 00:54:40,780 --> 00:54:47,110 Hvaða fylki er í grundvallaratriðum a bendi á upphaf í fylkinu, 653 00:54:47,110 --> 00:54:53,640 og þá hvaða array rekstur, hvaða flokkun, er bara að fara inn í þessi fylki ákveðna móti. 654 00:54:53,640 --> 00:55:05,360 >> Svo þegar ég segi eitthvað eins og s [3], þetta er að fara til S og telja 3 chars inn 655 00:55:05,360 --> 00:55:12,490 Svo s [3], höfum við 0, 1, 2, 3, svo s [3] er að fara að vísa til þessa l. 656 00:55:12,490 --> 00:55:20,460 [Nemandi] Og við gætum náð sama gildi með því að gera s + 3 og svo sviga stjörnu? 657 00:55:20,460 --> 00:55:22,570 Já. 658 00:55:22,570 --> 00:55:26,010 Þetta jafngildir * (s + 3); 659 00:55:26,010 --> 00:55:31,240 og það er að eilífu og alltaf svarar sama hvað þú gerir. 660 00:55:31,240 --> 00:55:34,070 Þú þarft aldrei að nota krappi setningafræði. 661 00:55:34,070 --> 00:55:37,770 Þú getur alltaf notað * (s + 3) setningafræði. 662 00:55:37,770 --> 00:55:40,180 Fólk tilhneigingu til eins og krappi setningafræði, þó. 663 00:55:40,180 --> 00:55:43,860 [Nemandi] Svo allir fylki eru reyndar bara ábendingar. 664 00:55:43,860 --> 00:55:53,630 Það er smá munur þegar ég segi int x [4]; >> [nemandi] Er að búa til minni? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Það er að fara að búa til 4 ints á mánudaginn, þannig að 16 bytes heild. 666 00:56:03,320 --> 00:56:05,700 Það er að fara að búa til 16 bæti á mánudaginn. 667 00:56:05,700 --> 00:56:09,190 x er ekki vistað neitt. 668 00:56:09,190 --> 00:56:13,420 Það er bara tákn sem vísa til the byrjun af the hlutur. 669 00:56:13,420 --> 00:56:17,680 Þar sem þú lýst fylking innan þessarar starfsemi, 670 00:56:17,680 --> 00:56:22,340 hvað þýðandinn er að fara að gera er bara að skipta um öll dæmi af breytu x 671 00:56:22,340 --> 00:56:26,400 með þar sem það gerðist að velja að setja þessar 16 bæti. 672 00:56:26,400 --> 00:56:30,040 Það getur ekki gert það með char * s vegna s er raunveruleg músina. 673 00:56:30,040 --> 00:56:32,380 Það er ókeypis að þá benda til annars. 674 00:56:32,380 --> 00:56:36,140 x er fasti. Þú getur ekki hafa það benda á annað fylki. >> [Nemandi] lagi. 675 00:56:36,140 --> 00:56:43,420 En þessi hugmynd, þessi flokkun er sú sama hvort sem það er hefðbundin array 676 00:56:43,420 --> 00:56:48,230 eða ef það bendi á eitthvað eða ef það er bendi til malloced fylkisins. 677 00:56:48,230 --> 00:56:59,770 Og í raun er það svo jafngildi að það er einnig það sama. 678 00:56:59,770 --> 00:57:05,440 Það í raun bara þýða hvað er inni í sviga og hvað er eftir af þeim sviga, 679 00:57:05,440 --> 00:57:07,970 bætir þeim saman, og dereferences. 680 00:57:07,970 --> 00:57:14,710 Svo er þetta bara eins og gildi og * (s + 3) eða s [3]. 681 00:57:16,210 --> 00:57:22,090 [Nemandi] Getur þú ábendingum vísa á 2-víddar fylki? 682 00:57:22,090 --> 00:57:27,380 >> Það er erfiðara. Hefð nr. 683 00:57:27,380 --> 00:57:34,720 A 2-víddar array er bara 1-víddar array með einhverjum þægilegum setningafræði 684 00:57:34,720 --> 00:57:54,110 vegna þess að þegar ég segi int x [3] [3], þetta er í raun bara 1 array með 9 gildum. 685 00:57:55,500 --> 00:58:03,000 Og svo þegar ég vísitölu, sem þýðandi veit hvað ég meina. 686 00:58:03,000 --> 00:58:13,090 Ef ég segi x [1] [2], hún veit að ég vil fara í annarri röð, svo það er að fara að sleppa fyrstu 3, 687 00:58:13,090 --> 00:58:17,460 og þá vill það Annað sem á það, svo það er að fara að fá þetta einn. 688 00:58:17,460 --> 00:58:20,480 En það er samt bara einn-víddar array. 689 00:58:20,480 --> 00:58:23,660 Og svo ef ég vildi að tengja músina til að fylking, 690 00:58:23,660 --> 00:58:29,770 Ég myndi segja int * p = x; 691 00:58:29,770 --> 00:58:33,220 The tegund af x er bara - 692 00:58:33,220 --> 00:58:38,280 Það er gróft að segja tegund x þar sem það er bara tákn og það er ekki raunverulegur breytu, 693 00:58:38,280 --> 00:58:40,140 en það er bara int *. 694 00:58:40,140 --> 00:58:44,840 x er bara bendi á upphaf þessa. >> [Nemandi] lagi. 695 00:58:44,840 --> 00:58:52,560 Og svo ég mun ekki vera fær um að fá aðgang [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Ég held að það sé sérstakt setningafræði til að lýsa bendi, 697 00:58:58,370 --> 00:59:12,480 eitthvað fáránlegt eins og int (* p [-. eitthvað algerlega fáránlegt að ég veit ekki einu sinni. 698 00:59:12,480 --> 00:59:17,090 En það er setningafræði til að lýsa yfir ábendingum eins og sviga og hlutum. 699 00:59:17,090 --> 00:59:22,960 Það má ekki einu sinni láta þig gera það. 700 00:59:22,960 --> 00:59:26,640 Ég gat að líta aftur á eitthvað sem myndi segja mér sannleikann. 701 00:59:26,640 --> 00:59:34,160 Ég mun líta á það seinna, ef það er setningafræði fyrir lið. En þú munt aldrei sjá það. 702 00:59:34,160 --> 00:59:39,670 Og jafnvel setningafræði er svo gamaldags að ef þú notar það, fólk verður undrandi. 703 00:59:39,670 --> 00:59:43,540 Fjölvíða fylki eru mjög sjaldgæf og það er. 704 00:59:43,540 --> 00:59:44,630 Þú ansi mikið - 705 00:59:44,630 --> 00:59:48,490 Jæja, ef þú ert að gera fylkið hluti það er ekki að fara að vera sjaldgæft, 706 00:59:48,490 --> 00:59:56,730 en í C þú ert sjaldan að fara að nota fjölvíða fylki. 707 00:59:57,630 --> 01:00:00,470 Já. >> [Nemandi] Segjum að þú hafa a raunverulega langur array. 708 01:00:00,470 --> 01:00:03,900 >> Svo í raunverulegur minni það virðist vera allt í röð, 709 01:00:03,900 --> 01:00:05,640 eins og atriði við hliðina á hvort öðru, 710 01:00:05,640 --> 01:00:08,770 en í líkamlegur minni, væri mögulegt fyrir það að vera skipt upp? >> Já. 711 01:00:08,770 --> 01:00:16,860 Hvernig raunverulegur minni virkar það skilur bara - 712 01:00:19,220 --> 01:00:24,860 The eining úthlutun er síða, sem hefur tilhneigingu til að vera 4 kílóbætum, 713 01:00:24,860 --> 01:00:29,680 og svo þegar ferli segir, hey, ég vil nota þetta minni, 714 01:00:29,680 --> 01:00:35,970 stýrikerfi er að fara að úthluta það 4 kílóbæti fyrir litla blokk minni. 715 01:00:35,970 --> 01:00:39,100 Jafnvel ef þú notar aðeins einn lítill bæti í öllu blokk minni, 716 01:00:39,100 --> 01:00:42,850 stýrikerfi er að fara að gefa það fullt 4 kílóbæti. 717 01:00:42,850 --> 01:00:49,410 Svo hvað þýðir þetta er að ég gæti hafa - við skulum segja að þetta er stakkur minn. 718 01:00:49,410 --> 01:00:53,180 Þessi stakkur gæti verið aðskilin. Stafla mitt gæti verið megabæti og megabæti. 719 01:00:53,180 --> 01:00:55,020 Stafla mitt gæti verið gríðarlegur. 720 01:00:55,020 --> 01:01:00,220 En stafla sjálft þarf að vera skipt í einstökum síðum, 721 01:01:00,220 --> 01:01:09,010 sem ef við skoðum hérna skulum segja að þetta er RAM okkar, 722 01:01:09,010 --> 01:01:16,600 Ef ég hef 2 gígabæta vinnsluminni, þetta er raunverulegt heimilisfang 0 eins og 0 bæti af RAM minni, 723 01:01:16,600 --> 01:01:22,210 og þetta er 2 gígabæta alla leið niður. 724 01:01:22,210 --> 01:01:27,230 Þannig að þessi síða gæti samsvara þessu blokk hérna. 725 01:01:27,230 --> 01:01:29,400 Þessi síða gæti samsvara þessu blokk hérna. 726 01:01:29,400 --> 01:01:31,560 Þetta eitt gæti samsvara þessu einn hérna. 727 01:01:31,560 --> 01:01:35,540 Svo að stýrikerfið er frjálst að framselja líkamlegur minni 728 01:01:35,540 --> 01:01:39,320 til einstakra síðu geðþótta. 729 01:01:39,320 --> 01:01:46,180 Og það þýðir að ef þessi landamæri gerist að þræða fylki, 730 01:01:46,180 --> 01:01:50,070 fylki gerist að vera vinstri á þessu og rétt í þessari röð á síðu 731 01:01:50,070 --> 01:01:54,460 þá fylking er að fara að skipta í líkamlegur minni. 732 01:01:54,460 --> 01:01:59,280 Og svo þegar þú hættir forritið, þegar ferli lýkur, 733 01:01:59,280 --> 01:02:05,690 þessi kortlagning fá þurrkast út og þá er það frjálst að nota þessar litlu blokkir til annars. 734 01:02:14,730 --> 01:02:17,410 Fleiri spurningar? 735 01:02:17,410 --> 01:02:19,960 [Nemandi] músina tölur. >> Ó já. 736 01:02:19,960 --> 01:02:28,410 Strings var auðveldara, en að horfa á eitthvað eins ints, 737 01:02:28,410 --> 01:02:35,000 svo aftur til int x [4]; 738 01:02:35,000 --> 01:02:41,810 Hvort þetta er fylki eða hvort það bendi til malloced fjölbreytta 4 heiltölur 739 01:02:41,810 --> 01:02:47,060 það er að fara að meðhöndla á sama hátt. 740 01:02:50,590 --> 01:02:53,340 [Nemandi] Svo fylki eru á hrúga? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Fylki eru ekki á hrúga. >> [Nemandi] Ó. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Þessi tegund af array hefur tilhneigingu til að vera á mánudaginn 743 01:03:08,320 --> 01:03:12,220 nema þú lýst það á - hunsa alþjóðlegt breytur. Ekki nota alþjóðlegum breytur. 744 01:03:12,220 --> 01:03:16,280 Inni í aðgerð sem ég segi int x [4]; 745 01:03:16,280 --> 01:03:22,520 Það er að fara að búa til 4-heiltala blokk á mánudaginn fyrir þessa fylkingu. 746 01:03:22,520 --> 01:03:26,960 En þetta malloc (4 * sizeof (int)); er að fara að fara á hrúga. 747 01:03:26,960 --> 01:03:31,870 En eftir þessu sem ég er að nota X og P í nánast sömu leiðir, 748 01:03:31,870 --> 01:03:36,140 öðrum en þeim undantekningum sem ég sagði áður um að þú getur endurúthluta bls. 749 01:03:36,140 --> 01:03:40,960 Tæknilega eru stærðir þeirra nokkuð öðruvísi, en það er alveg óviðkomandi. 750 01:03:40,960 --> 01:03:43,310 Þú aldrei raunverulega nota stærð þeirra. 751 01:03:48,020 --> 01:03:56,810 The p ég gæti sagt p [3] = 2 eða x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Þú getur notað þau á nákvæmlega sama hátt. 753 01:03:59,680 --> 01:04:01,570 Svo bendi tölur núna - Já. 754 01:04:01,570 --> 01:04:07,390 [Nemandi] Ert þú ekki að gera P * ef þú ert með sviga? 755 01:04:07,390 --> 01:04:11,720 Festingar eru óbeina dereference. >> Lagi. 756 01:04:11,720 --> 01:04:20,200 Reyndar, líka það sem þú ert að segja með hægt að fá fjölvíða fylki 757 01:04:20,200 --> 01:05:02,650 með ábendingum, það sem þú getur gert er eitthvað eins og, segjum, int ** PP = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Ég ætla bara að skrifa það allt út fyrst. 759 01:05:37,880 --> 01:05:41,020 Ég vildi ekki að eitt. 760 01:05:41,020 --> 01:05:42,550 Allt í lagi. 761 01:05:42,550 --> 01:05:48,910 Það sem ég gerði hér er - Það ætti að vera bls [i]. 762 01:05:48,910 --> 01:05:53,680 Svo bls bendi á músina. 763 01:05:53,680 --> 01:06:02,420 Þú ert mallocing bls að benda á fjölda 5 int stjörnum. 764 01:06:02,420 --> 01:06:10,950 Svo í minni sem þú ert með á stafla bls 765 01:06:10,950 --> 01:06:20,150 Það er að fara að benda á fjölda 5 blokkir sem eru allt sjálfir ábendingum. 766 01:06:20,150 --> 01:06:28,210 Og svo þegar ég malloc niður hér malloc ég að hver þeirra einstaka ábendingum 767 01:06:28,210 --> 01:06:32,080 að benda til sérstakrar blokk 4 bæti á hrúga. 768 01:06:32,080 --> 01:06:35,870 Þannig að þetta bendir til 4 bæti. 769 01:06:37,940 --> 01:06:40,660 Og þetta bendir til mismunandi 4 bæti. 770 01:06:40,660 --> 01:06:43,200 >> Og öllum þeim benda á þeirra eigin 4 bæti. 771 01:06:43,200 --> 01:06:49,080 Þetta gefur mér leið til að gera fjölvíða hluti. 772 01:06:49,080 --> 01:06:58,030 Ég gæti sagt pp [3] [4], en nú er þetta ekki það sama og fjölvíða fylki 773 01:06:58,030 --> 01:07:05,390 því fjölvíða fylki það þýtt [3] [4] í einn á móti í x fylkisins. 774 01:07:05,390 --> 01:07:14,790 Þetta dereferences p, aðgangur þriðja vísitölu, þá dereferences sem 775 01:07:14,790 --> 01:07:20,790 og aðgangur - 4 væri ógildur - seinni vísitölu. 776 01:07:24,770 --> 01:07:31,430 En þegar við þurftum að int x [3] [4] en sem fjölvíða fylki 777 01:07:31,430 --> 01:07:35,740 og þegar þú tvöfaldur krappi það er í raun aðeins einn dereference, 778 01:07:35,740 --> 01:07:40,490 þú ert að elta einn músina og þá er móti, 779 01:07:40,490 --> 01:07:42,850 þetta er virkilega 2D tilvísanir. 780 01:07:42,850 --> 01:07:45,840 Þú fylgja 2 aðskildum ábendingum. 781 01:07:45,840 --> 01:07:50,420 Þannig að þetta gerir einnig tæknilega að hafa fjölvíða fylki 782 01:07:50,420 --> 01:07:53,550 þar sem hver einstaklingur array er mismunandi stærðum. 783 01:07:53,550 --> 01:07:58,000 Þannig að ég held að jagged fjölvíða fylki er hvað það er kallað 784 01:07:58,000 --> 01:08:01,870 því í raun fyrsta sem gæti bent til einhvers sem hefur 10 atriði, 785 01:08:01,870 --> 01:08:05,540 The second hlutur gæti bent til einhvers sem hefur 100 einingar. 786 01:08:05,540 --> 01:08:10,790 [Nemandi] Er einhver takmörk á fjölda af ábendingum er hægt að hafa 787 01:08:10,790 --> 01:08:14,290 benda öðrum ábendingum? >> Nei 788 01:08:14,290 --> 01:08:17,010 Hægt er að hafa int ***** p. 789 01:08:18,050 --> 01:08:23,760 Aftur músina tölur - >> [nemandi] Ó. >> Já. 790 01:08:23,760 --> 01:08:35,649 [Nemandi] Ef ég int *** p og þá geri ég dereferencing og ég segi p * er jöfn þetta gildi 791 01:08:35,649 --> 01:08:39,560 er það að fara bara að gera 1 stig dereferencing? >> Já. 792 01:08:39,560 --> 01:08:43,340 Svo ef ég vil fá aðgang að hlutur sem síðasta bendillinn er að benda á - 793 01:08:43,340 --> 01:08:46,210 Þá gerir *** p. >> Lagi. 794 01:08:46,210 --> 01:08:54,080 Þannig að þetta er p stig fyrir 1 blokk, benda til annars blokk, benda til annars sýna í reitnum. 795 01:08:54,080 --> 01:09:02,010 Síðan ef þú ert * p = eitthvað annað, þá ertu að breyta þessu 796 01:09:02,010 --> 01:09:13,640 að nú benda til annars sýna í reitnum. >> Lagi. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Og ef þær voru malloced, þá hefur nú lekið minni 798 01:09:17,649 --> 01:09:20,430 nema þú skyldir hafa mismunandi tilvísanir af þessu 799 01:09:20,430 --> 01:09:25,270 þar sem þú getur ekki fengið til baka þær sjálfur sem kastaði bara í burtu. 800 01:09:25,270 --> 01:09:29,550 Pointer tölur. 801 01:09:29,550 --> 01:09:36,310 int x [4], er að fara að úthluta fjölda 4 heiltölur 802 01:09:36,310 --> 01:09:40,670 þar sem x er að fara að benda á byrjun fylkisins. 803 01:09:40,670 --> 01:09:50,420 Svo þegar ég segi eitthvað eins og x [1], ég vil það að þýða að fara að annarri heiltölu í fylking, 804 01:09:50,420 --> 01:09:53,319 sem myndi vera svona einn. 805 01:09:53,319 --> 01:10:04,190 En í raun, það er 4 bæti í fylki þar sem þetta heiltala tekur upp 4 bæti. 806 01:10:04,190 --> 01:10:08,470 Svo á móti af 1 þýðir í raun á móti af 1 807 01:10:08,470 --> 01:10:12,030 sinnum the stærð af hvaða gerð af fylki. 808 01:10:12,030 --> 01:10:17,170 Þetta er fylki heiltalna, svo það veit að gera 1 sinni stærð int þegar það vill á móti. 809 01:10:17,170 --> 01:10:25,260 Hin setningafræði. Mundu að þetta er jafngilt * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Þegar ég segi Pointer + 1, hvað það skilar er heimilisfangið sem bendillinn er að geyma 811 01:10:35,250 --> 01:10:40,360 auk 1 sinnum the stærð af the tegund af músina. 812 01:10:40,360 --> 01:10:59,510 Svo ef x = ox100, þá x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Og þú getur misnota þetta og segja eitthvað eins og bleikju * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 og nú C er að fara til vera the sami tölu sem x. 815 01:11:23,050 --> 01:11:26,040 C er að fara að vera jafn ox100, 816 01:11:26,040 --> 01:11:31,490 en C + 1 er að fara að vera jafn ox101 817 01:11:31,490 --> 01:11:38,030 þar bendillinn tölur fer eftir tegund af músina sem þú ert að bæta við. 818 01:11:38,030 --> 01:11:45,390 Svo C + 1, hún lítur á C, það er bleikja músina, svo það er að fara að bæta við 1 sinnum stærð bleikju, 819 01:11:45,390 --> 01:11:48,110 sem er alltaf að fara að vera 1, þannig að þú færð 101, 820 01:11:48,110 --> 01:11:54,890 en ef ég geri x, sem er einnig enn 100, x + 1 er að fara að vera 104. 821 01:11:56,660 --> 01:12:06,340 [Nemandi] Hægt er að nota C + + til að fara músina með 1? 822 01:12:06,340 --> 01:12:09,810 Já, þú getur. 823 01:12:09,810 --> 01:12:16,180 Þú getur ekki gert það með x þar sem x er bara tákn, það er stöðug, þú getur ekki breytt x. 824 01:12:16,180 --> 01:12:22,610 >> En C gerist bara vera músina, þannig C + + er fullkomlega gild og það mun hækka um 1. 825 01:12:22,610 --> 01:12:32,440 Ef C var bara int *, þá er C + + væri 104. 826 01:12:32,440 --> 01:12:41,250 + + Er bendillinn tölur eins og C + 1 hefði gert músina tölur. 827 01:12:43,000 --> 01:12:48,870 Þetta er í raun hversu mikið af hlutum eins Mergesort - 828 01:12:49,670 --> 01:12:55,710 Í stað þess að búa til afrit af hlutum, getur þú í staðinn framhjá - 829 01:12:55,710 --> 01:13:02,400 Eins og ef ég vildi að fara framhjá þessu hálfan array - skulum eyða eitthvað af þessu. 830 01:13:04,770 --> 01:13:10,520 Við skulum segja að ég vildi að fara þessa hlið af the array í aðgerð. 831 01:13:10,520 --> 01:13:12,700 Hvað myndi ég fara til að virka? 832 01:13:12,700 --> 01:13:17,050 Ef ég framhjá x, ég liggur þetta netfang. 833 01:13:17,050 --> 01:13:23,780 En ég vil að fara framhjá þessu tiltekna tölu. Svo hvað á ég að fara? 834 01:13:23,780 --> 01:13:26,590 [Nemandi] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Svo x + 2. Já. 836 01:13:29,350 --> 01:13:31,620 Það er að fara að vera svona tölu. 837 01:13:31,620 --> 01:13:42,810 Þú munt líka mjög oft séð það sem x [2] og þá heimilisfang þess. 838 01:13:42,810 --> 01:13:47,850 Svo þú þarft að taka tölu af því vegna þess að krappi er óbeina dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] er átt við gildi sem er í þessum kassa, og þá þú vilt heimilisfang kassann, 840 01:13:53,250 --> 01:13:56,850 svo þú segir & x [2]. 841 01:13:56,850 --> 01:14:02,880 Svo er það hvernig eitthvað í Mergesort þar sem þú vilt fara hálfa listann eitthvað 842 01:14:02,880 --> 01:14:08,790 þú í raun bara framhjá & x [2], og nú eins langt og endurkvæma hringja er varðar, 843 01:14:08,790 --> 01:14:12,510 nýtt array mín byrjar þar. 844 01:14:12,510 --> 01:14:15,130 Síðustu spurningarnar mínútu. 845 01:14:15,130 --> 01:14:20,050 [Nemandi] Ef við ekki setja merkið eða - hvað er það kallað? >> Star? 846 01:14:20,050 --> 01:14:23,200 [Nemandi] Star. >> Tæknilega, dereference rekstraraðila, en - >> [nemandi] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Ef við gerum ekki setja stjörnu eða merkið, hvað gerist ef ég segi bara y = x og x er bendir? 848 01:14:29,310 --> 01:14:34,620 Hvað er tegund af y? >> [Nemandi] Ég ætla bara segja músina það er 2. 849 01:14:34,620 --> 01:14:38,270 Svo ef þú segir bara y = x, nú x og y að benda á það sama. >> [Nemandi] Point til sama. 850 01:14:38,270 --> 01:14:45,180 Og ef x er int músina? >> Það myndi kvarta vegna þess að þú getur ekki framselt ábendingum. 851 01:14:45,180 --> 01:14:46,540 [Nemandi] lagi. 852 01:14:46,540 --> 01:14:51,860 Mundu að ábendingum, jafnvel þó að við draga þá sem örvum, 853 01:14:51,860 --> 01:15:02,010 raun allt sem þeir geyma - int * x - í raun allt x er sögufrægur er eitthvað eins ox100, 854 01:15:02,010 --> 01:15:06,490 sem við koma til að tákna sem benda á blokk geymd við 100 manns. 855 01:15:06,490 --> 01:15:19,660 Svo þegar ég segi int * y = x, ég ætla bara að afrita ox100 í y, 856 01:15:19,660 --> 01:15:24,630 sem við erum bara að fara til að tákna sem y, einnig bendir til ox100. 857 01:15:24,630 --> 01:15:39,810 Og ef ég segi int i = (int) x, svo ég er að fara að geyma hvað verðmæti ox100 er 858 01:15:39,810 --> 01:15:45,100 inni um það, en nú það er að fara að túlka sem heiltala staðinn fyrir músina. 859 01:15:45,100 --> 01:15:49,310 En þú þarft að varpa eða annað það mun kvarta. 860 01:15:49,310 --> 01:15:53,300 [Nemandi] Svo áttu að greiða - 861 01:15:53,300 --> 01:16:00,290 Er það að fara að vera steypu int af X eða steypu int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] What? 863 01:16:03,700 --> 01:16:07,690 [Nemandi] lagi. Eftir þessum sviga er það að fara að vera x eða leitt þarna? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] heldur. x og y eru jafngildir. >> [Nemandi] lagi. 865 01:16:11,500 --> 01:16:14,390 Vegna þess að þeir eru báðir ábendingar. >> Já. 866 01:16:14,390 --> 01:16:21,050 [Nemandi] Þannig að það myndi geyma sextánskur 100 í heiltölu formi? >> [Bowden] Já. 867 01:16:21,050 --> 01:16:23,620 En ekki gildi hvað það bendir til. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Já. >> [Nemandi] Svo bara heimilisfang í heiltölu formi. Allt í lagi. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Ef þú vildir einhverjum furðulega ástæðu, 870 01:16:34,720 --> 01:16:38,900 þú gætir eingöngu að takast á við ábendingum og aldrei að takast á við heiltölur 871 01:16:38,900 --> 01:16:49,240 og bara vera eins og int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Síðan sem þú ert að fara að fá mjög ruglaður þegar bendillinn tölur byrjar að gerast. 873 01:16:53,000 --> 01:16:56,570 Þannig að tölurnar sem þeir geyma eru hégómi. 874 01:16:56,570 --> 01:16:58,940 Það er bara hvernig þú endar túlka þær. 875 01:16:58,940 --> 01:17:02,920 Þannig að ég er frjáls til að afrita ox100 úr int * á int 876 01:17:02,920 --> 01:17:07,790 og ég er frjáls til að tengja - þú líklega að fara að fá öskraði á fyrir ekki steypu - 877 01:17:07,790 --> 01:17:18,160 Ég er frjáls til að tengja eitthvað eins og (int *) ox1234 í þessu handahófskennt int *. 878 01:17:18,160 --> 01:17:25,480 Svo er ox123 jafn gild minni tölu sem er og y. 879 01:17:25,480 --> 01:17:32,060 & Y gerist aftur eitthvað sem er ansi mikið ox123. 880 01:17:32,060 --> 01:17:35,430 [Nemandi] Vildi að vera mjög flott leið til að fara frá sextánskur í aukastaf formi, 881 01:17:35,430 --> 01:17:39,230 eins og ef þú ert með músina og þú kastar eins og int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Þú getur í raun bara prenta nota eins og printf. 883 01:17:44,860 --> 01:17:50,300 Við skulum segja að ég hef int y = 100. 884 01:17:50,300 --> 01:18:02,700 Svo printf (% d \ n - eins og þú ættir nú þegar vita - prenta það sem heiltala,% x. 885 01:18:02,700 --> 01:18:05,190 Við munum bara prenta það sem sextánskur. 886 01:18:05,190 --> 01:18:10,760 Svo bendi ekki geymd sem sextánskur, 887 01:18:10,760 --> 01:18:12,960 og heiltala er ekki vistað sem aukastaf. 888 01:18:12,960 --> 01:18:14,700 Allt er geymt sem tvöfaldur. 889 01:18:14,700 --> 01:18:17,950 Það er bara að við tilhneigingu til að sýna ábendingar sem sextánskur 890 01:18:17,950 --> 01:18:23,260 því við hugsum um það í þessum 4-bæti blokkir, 891 01:18:23,260 --> 01:18:25,390 og minni heimilisföng tilhneigingu til að þekkja. 892 01:18:25,390 --> 01:18:28,890 Við erum eins, ef það byrjar með BF, þá gerist það að vera á mánudaginn. 893 01:18:28,890 --> 01:18:35,560 Svo er það bara túlkun okkar ábendingum sem sextánskur. 894 01:18:35,560 --> 01:18:39,200 Allt í lagi. Allar Síðustu spurningarnar? 895 01:18:39,200 --> 01:18:41,700 >> Ég kem hér aðeins eftir að ef þú hefur eitthvað annað. 896 01:18:41,700 --> 01:18:46,070 Og það er í lok þess. 897 01:18:46,070 --> 01:18:48,360 >> [Nemandi] Yay! [Lófaklapp] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]