1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Pjesa 4 - më të rehatshme] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Universiteti i Harvardit] 3 00:00:04,850 --> 00:00:07,370 [Kjo është CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Ne kemi një quiz nesër, në rast se ju djema nuk e di se. 5 00:00:14,810 --> 00:00:20,970 Kjo është në thelb çdo gjë që ju mund të keni parë në klasë ose duhet të keni parë në klasë. 6 00:00:20,970 --> 00:00:26,360 Kjo përfshin pointers, edhe pse ata janë një temë shumë të kohëve të fundit. 7 00:00:26,360 --> 00:00:29,860 Ju duhet të paktën të kuptojnë nivelet e larta të tyre. 8 00:00:29,860 --> 00:00:34,760 Çdo gjë që ishte zhdukur gjatë në klasë ju duhet të kuptoni për quiz. 9 00:00:34,760 --> 00:00:37,320 Pra, nëse ju keni pyetje mbi to, ju mund të pyesni ata tani. 10 00:00:37,320 --> 00:00:43,280 Por kjo do të jetë një sesion shumë nxënës e udhëhequr nga ku ju djema të kërkoni pyetje, 11 00:00:43,280 --> 00:00:45,060 kështu që shpresojmë se njerëzit kanë pyetje. 12 00:00:45,060 --> 00:00:48,020 A ka ndokush pyetje? 13 00:00:49,770 --> 00:00:52,090 Po. >> [Student] Mund të ju shkoni mbi pointers përsëri? 14 00:00:52,090 --> 00:00:54,350 Unë do të shkoj për pointers. 15 00:00:54,350 --> 00:00:59,180 Të gjitha variablave tuaj domosdoshmërisht jetojnë në kujtesë, 16 00:00:59,180 --> 00:01:04,450 por zakonisht ju mos u bëni merak për këtë dhe ju vetëm thoni x + 2 + 3 dhe y 17 00:01:04,450 --> 00:01:07,080 dhe përpiluesit do të kuptoj se ku gjërat janë duke jetuar për ju. 18 00:01:07,080 --> 00:01:12,990 Pasi ju jeni që kanë të bëjnë me pointers, tani ju jeni duke përdorur ato në mënyrë eksplicite adresat e memories. 19 00:01:12,990 --> 00:01:19,800 Kështu që një variable të vetme do vetëm ndonjëherë të jetojnë në një adresë të vetme në çdo kohë të dhënë. 20 00:01:19,800 --> 00:01:24,040 Nëse ne duam të shpallë një tregues, se çfarë është lloji do të duken si? 21 00:01:24,040 --> 00:01:26,210 >> Unë dua të deklaroj një p akrep. Çfarë do të duken si tip? 22 00:01:26,210 --> 00:01:33,530 [Student] int * f. Po >>. Pra, int * p. 23 00:01:33,530 --> 00:01:38,030 Dhe si mund ta bëni atë pikë për të x? >> [Student] ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Pra simbol është quajtur fjalë adresa e operatorit. 25 00:01:45,300 --> 00:01:50,460 Kështu që kur unë them dhe x është marrë adresën e kujtesës x ndryshueshme. 26 00:01:50,460 --> 00:01:56,790 Kështu që tani unë kam p akrep, dhe kudo në kodin tim unë mund të përdorni p * 27 00:01:56,790 --> 00:02:02,960 ose unë mund të përdorni X dhe ajo do të jetë gjë e saktë të njëjtën. 28 00:02:02,960 --> 00:02:09,520 (P *). Çfarë është kjo duke bërë? Çfarë do të thotë se ylli? 29 00:02:09,520 --> 00:02:13,120 [Student] Kjo do të thotë një vlerë në atë pikë. Po >>. 30 00:02:13,120 --> 00:02:17,590 Pra, nëse ne shikojmë në të, ajo mund të jetë shumë i dobishëm për të nxjerrë jashtë diagramet 31 00:02:17,590 --> 00:02:22,230 ku kjo është një kuti të vogël të memories për x, i cili ndodh që të ketë vlerën 4, 32 00:02:22,230 --> 00:02:25,980 atëherë ne kemi një kuti të vogël të memories për p, 33 00:02:25,980 --> 00:02:31,590 dhe kështu pikë të p x, kështu që ne kemi nxjerrë një shigjetë nga p në x. 34 00:02:31,590 --> 00:02:40,270 Pra, kur ne themi p * ne jemi duke thënë se të shkojnë në kutinë që është p. 35 00:02:40,270 --> 00:02:46,480 Yll është ndiqni arrow dhe pastaj bëni çfarë të doni me atë kuti të drejtë atje. 36 00:02:46,480 --> 00:03:01,090 Kështu që unë mund të them * p = 7; dhe që do të shkojnë në kutinë që është x dhe ndryshim që në 7. 37 00:03:01,090 --> 00:03:13,540 Ose unë mund të them int z = * p * 2; Kjo është konfuze, sepse kjo është yll yll. 38 00:03:13,540 --> 00:03:19,230 Një yll është dereferencing p, ylli tjetër është shumëzuar me 2. 39 00:03:19,230 --> 00:03:26,780 Njoftim unë mund të ketë ashtu si edhe zëvendësoi p * me x. 40 00:03:26,780 --> 00:03:29,430 Ju mund të përdorni ato në të njëjtën mënyrë. 41 00:03:29,430 --> 00:03:38,000 Dhe pastaj më vonë unë mund të ketë pikë p për një gjë krejtësisht të re. 42 00:03:38,000 --> 00:03:42,190 Unë mund të them vetëm p = &z; 43 00:03:42,190 --> 00:03:44,940 Deri tani p asnjë pikë më shumë për të x, ajo tregon për z. 44 00:03:44,940 --> 00:03:50,510 Dhe çdo herë që unë të bëjë p * është e njëjtë si duke bërë z. 45 00:03:50,510 --> 00:03:56,170 Pra, gjëja e dobishme në lidhje me këtë është edhe kemi filluar të hyrë në funksionet. 46 00:03:56,170 --> 00:03:59,790 >> Kjo është lloj i kotë për të deklaruar një tregues që pikë për diçka 47 00:03:59,790 --> 00:04:03,140 dhe pastaj ju jeni vetëm dereferencing atë 48 00:04:03,140 --> 00:04:06,060 kur ju mund të ketë përdorur ndryshore origjinale për të filluar me. 49 00:04:06,060 --> 00:04:18,190 Por kur ju merrni në funksionet - kështu që le të themi që ne kemi disa funksion, int foo, 50 00:04:18,190 --> 00:04:32,810 që merr një tregues dhe vetëm bën p * = 6; 51 00:04:32,810 --> 00:04:39,990 Ashtu siç e pamë më parë me swap, ju nuk mund të bëjë një shkëmbim efektiv dhe një funksion të veçantë 52 00:04:39,990 --> 00:04:45,180 vetëm me kalimin e integers, sepse çdo gjë në C është gjithmonë kalon nga vlera. 53 00:04:45,180 --> 00:04:48,360 Madje edhe kur ju jeni duke kaluar pointers që ju jeni duke kaluar nga vlera. 54 00:04:48,360 --> 00:04:51,940 Kjo ndodh pikërisht kështu që këto vlera janë adresat e kujtesës. 55 00:04:51,940 --> 00:05:00,770 Kështu që kur unë them foo (p), unë jam duke kaluar në treguesin në funksion foo 56 00:05:00,770 --> 00:05:03,910 dhe pastaj foo është duke bërë * p = 6; 57 00:05:03,910 --> 00:05:08,600 Pra, brenda këtij funksioni, p * është ende e barabartë me x, 58 00:05:08,600 --> 00:05:12,720 por unë nuk mund të përdorë x brenda e atë funksion sepse nuk është scoped brenda këtij funksioni. 59 00:05:12,720 --> 00:05:19,510 Pra * p = 6 është e vetmja mënyrë që unë mund të hyni në një ndryshore lokale nga një tjetër funksion. 60 00:05:19,510 --> 00:05:23,600 Ose, edhe, pointers janë mënyra e vetme që unë mund të hyni në një ndryshore lokale nga një tjetër funksion. 61 00:05:23,600 --> 00:05:31,600 [Student] Le të thonë se ju të kërkuar për të kthyer një akrep. Pikërisht si ju bëni këtë? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Kthimi një tregues si në diçka si int y = 3; kthimi dhe y? >> [Student] Yeah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okay. Ju kurrë nuk duhet ta bëjë këtë. Kjo është e keqe. 64 00:05:48,480 --> 00:05:59,480 Unë mendoj se kam parë në këto slides leksion ju keni filluar duke parë këtë diagram tërë e kujtesës 65 00:05:59,480 --> 00:06:02,880 ku deri këtu ju keni marrë adresën e memories 0 66 00:06:02,880 --> 00:06:09,550 dhe këtu poshtë keni adresa e kujtesës 4 koncerte apo 2 në 32. 67 00:06:09,550 --> 00:06:15,120 Pra, atëherë ju keni marrë disa sende dhe disa sende dhe pastaj ju duhet rafte tuaj 68 00:06:15,120 --> 00:06:21,780 dhe ju keni marrë tog tuaj, që ju vetëm filluar të mësuar rreth, në rritje deri. 69 00:06:21,780 --> 00:06:24,390 [Student] A nuk është grumbull mbi rafte? 70 00:06:24,390 --> 00:06:27,760 >> Po. Tog është në krye, nuk është ajo? >> [Student] E pra, ai vendos 0 në krye. 71 00:06:27,760 --> 00:06:30,320 [Student] Oh, ai vendos 0 në krye. >> [Student] Oh, në rregull. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: Kudo me CS50 ju jeni duke shkuar për të parë atë në këtë mënyrë. >> [Student] Okay. 73 00:06:36,060 --> 00:06:40,290 Është vetëm se, kur ju jeni të parë duke parë oxhaqet, 74 00:06:40,290 --> 00:06:45,000 si kur ju mendoni për një pirg të mendoni për gjëra të stacking në krye të njëri-tjetrit. 75 00:06:45,000 --> 00:06:50,810 Pra, ne priren të rrokullisje këtë rreth në mënyrë rafte është në rritje deri si një pirg normalisht do 76 00:06:50,810 --> 00:06:55,940 në vend të rafte varur poshtë. >> [Student] A nuk e mal teknikisht rriten shumë, pse? 77 00:06:55,940 --> 00:07:01,100 Kjo varet nga ajo që ju them me rriten. 78 00:07:01,100 --> 00:07:04,010 Rafte dhe tog gjithmonë rritet në drejtime të kundërta. 79 00:07:04,010 --> 00:07:09,420 Një turrë është gjithmonë në rritje deri në kuptimin që ajo është në rritje deri 80 00:07:09,420 --> 00:07:12,940 drejt adresat larta kujtesës, dhe është në rritje të grumbullosh poshtë 81 00:07:12,940 --> 00:07:17,260 në atë që është në rritje drejt adresave të kujtesës të ulëta. 82 00:07:17,260 --> 00:07:20,250 Kështu lartë është 0 dhe në fund është adresa e larta kujtesës. 83 00:07:20,250 --> 00:07:26,390 Ata janë të dy në rritje, vetëm në kundërshtimin drejtime. 84 00:07:26,390 --> 00:07:29,230 [Student] Unë vetëm do të thotë se për shkak se ju tha ju vënë rafte në fund 85 00:07:29,230 --> 00:07:33,640 sepse ajo duket më intuitive, sepse për rafte të fillojë në krye të një grumbull, 86 00:07:33,640 --> 00:07:37,520 tog është në krye të vetë shumë, kështu që that's - >> Yeah. 87 00:07:37,520 --> 00:07:44,960 Ju gjithashtu mendoj tog si u rritur dhe më të mëdha, por më shumë rafte. 88 00:07:44,960 --> 00:07:50,280 Pra rafte është ai që ne lloj i duan të tregojnë rritje deri. 89 00:07:50,280 --> 00:07:55,390 Por kudo që ju shikoni përndryshe do të tregojë adresën 0 në krye 90 00:07:55,390 --> 00:07:59,590 dhe adresa lartë memorie në fund, kështu që kjo është pikëpamja juaj e zakonshme e kujtesës. 91 00:07:59,590 --> 00:08:02,100 >> A keni një pyetje? 92 00:08:02,100 --> 00:08:04,270 [Student] A mund të na thoni më shumë rreth një grumbulli gurësh? 93 00:08:04,270 --> 00:08:06,180 Po. Unë do të shkoj në se në një të dytë. 94 00:08:06,180 --> 00:08:12,220 Së pari, duke shkuar prapa në pse kthimit dhe y është një gjë e keqe, 95 00:08:12,220 --> 00:08:18,470 në rafte ju keni një bandë e kornizave rafte të cilat përfaqësojnë të gjitha funksionet 96 00:08:18,470 --> 00:08:20,460 të cilat janë quajtur. 97 00:08:20,460 --> 00:08:27,990 Pra, duke injoruar gjërat e mëparshme, në krye të rafte tuaj është gjithmonë do të jetë funksioni kryesor 98 00:08:27,990 --> 00:08:33,090 pasi që është funksioni i parë që është duke u quajtur. 99 00:08:33,090 --> 00:08:37,130 Dhe pastaj kur ju telefononi një tjetër funksion, rafte do të rritet poshtë. 100 00:08:37,130 --> 00:08:41,640 Pra, nëse unë e quaj disa funksion, foo, dhe ajo merr vet kuadrin e saj rafte, 101 00:08:41,640 --> 00:08:47,280 ajo mund të thërrasë një funksion, bar, ajo merr vet kuadrin e saj rafte. 102 00:08:47,280 --> 00:08:49,840 Dhe bar mund të jetë gjithkund rekursive dhe se mund ta quajmë veten, 103 00:08:49,840 --> 00:08:54,150 dhe kështu që thirrja e dytë për bar do të marrë vetë kuadrin e saj rafte. 104 00:08:54,150 --> 00:08:58,880 Dhe kështu që ajo shkon në këto korniza rafte janë të gjithë variablat lokale 105 00:08:58,880 --> 00:09:03,450 dhe të gjithë argumentet funksion që - 106 00:09:03,450 --> 00:09:08,730 Çdo gjëra që janë në vend për këtë funksion scoped të shkuar në këto korniza rafte. 107 00:09:08,730 --> 00:09:21,520 Kështu që do të thotë kur kam thënë diçka si bar është një funksion, 108 00:09:21,520 --> 00:09:29,270 Unë jam vetëm duke shkuar për të deklaruar një numër të plotë dhe pastaj kthehen një tregues për atë numër të plotë. 109 00:09:29,270 --> 00:09:33,790 Pra, ku bën y jetuar? 110 00:09:33,790 --> 00:09:36,900 [Student] y jeton në bar. >> [Bowden] Yeah. 111 00:09:36,900 --> 00:09:45,010 Diku në këtë shesh të vogël të memories është një katror littler që ka y në të. 112 00:09:45,010 --> 00:09:53,370 Kur të kthehem dhe y, unë jam kthyer një tregues për këtë bllok të vogël të kujtesës. 113 00:09:53,370 --> 00:09:58,400 Por atëherë kur një funksion i kthimit, korniza e saj rafte merr popped off rafte. 114 00:10:01,050 --> 00:10:03,530 Dhe kjo është arsyeja pse ajo që quhet rafte. 115 00:10:03,530 --> 00:10:06,570 Është si strukturën e të dhënave rafte, nëse ju e dini se çfarë është. 116 00:10:06,570 --> 00:10:11,580 Ose edhe si një pirg e tabaka është gjithmonë shembull, 117 00:10:11,580 --> 00:10:16,060 kryesore do të shkojë në fund, atëherë funksioni parë që ju telefononi do të shkojë në krye të kësaj, 118 00:10:16,060 --> 00:10:20,400 dhe ju nuk mund të merrni Kthehu tek Qendrori deri sa të ktheheni nga të gjitha funksionet të cilat janë quajtur 119 00:10:20,400 --> 00:10:22,340 që janë vendosur në krye të saj. 120 00:10:22,340 --> 00:10:28,650 >> [Student] Pra, nëse ju bëni bëri kthehen dhe y, vlera që është subjekt për të ndryshuar pa paralajmërim. 121 00:10:28,650 --> 00:10:31,290 Po, it's - >> [Student] Kjo mund të jetë overwritten. Po >>. 122 00:10:31,290 --> 00:10:34,660 Është plotësisht - Nëse ju provoni dhe - 123 00:10:34,660 --> 00:10:38,040 Kjo do të jetë një bar int * për shkak se ajo është kthyer një tregues, 124 00:10:38,040 --> 00:10:41,310 kështu llojin e saj është kthimi * int. 125 00:10:41,310 --> 00:10:46,500 Nëse ju provoni të përdorni vlerën e kthimit të këtij funksioni, është sjellja papërcaktuar 126 00:10:46,500 --> 00:10:51,770 për shkak se tregues tregon në kujtesë e keqe. >> [Student] Okay. 127 00:10:51,770 --> 00:11:01,250 Pra, çfarë nëse, për shembull, ju deklaruar int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Kjo është më mirë. Po. 129 00:11:03,740 --> 00:11:07,730 [Student] Ne biseduam rreth asaj se si kur ne tërhiqni gjëra për Recycle Bin tonë 130 00:11:07,730 --> 00:11:11,750 ata nuk janë shuar në fakt, ne vetëm të humbasin pointers tyre. 131 00:11:11,750 --> 00:11:15,550 Pra, në këtë rast nuk kemi të vërtetë fshihet vlerën apo është ende atje në kujtesë? 132 00:11:15,550 --> 00:11:19,130 Për pjesën më të madhe, ajo do të jetë ende atje. 133 00:11:19,130 --> 00:11:24,220 Por le të thonë se ne të ndodhë për të thirrur një funksion tjetër, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz do të marrë vetë kuadrin e saj rafte këtu. 135 00:11:28,990 --> 00:11:31,470 Ajo do të jetë overwriting të gjitha të këtij stuff, 136 00:11:31,470 --> 00:11:34,180 dhe pastaj më vonë në qoftë se ju provoni dhe të përdorni treguesin që mori para, 137 00:11:34,180 --> 00:11:35,570 ajo nuk do të jetë vlera e njëjtë. 138 00:11:35,570 --> 00:11:38,150 Ajo do të ketë ndryshuar vetëm sepse ju e quajti Baz funksion. 139 00:11:38,150 --> 00:11:43,080 [Student] Por nuk kishte ne, ne ende do të merrni 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Në të gjitha gjasat, ju do. 141 00:11:44,990 --> 00:11:49,670 Por ju nuk mund të mbështetet në atë. C thotë vetëm sjelljen e padefinuar. 142 00:11:49,670 --> 00:11:51,920 >> [Student] Oh, ajo bën. Rregull. 143 00:11:51,920 --> 00:11:58,190 Pra, kur ju duan të kthehen një tregues, ky është vendi ku malloc vjen në përdorim. 144 00:12:00,930 --> 00:12:15,960 Unë jam me shkrim në fakt vetëm të kthehet malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Ne do të shkojë mbi malloc më shumë në një të dytë, por ideja e malloc është e gjitha e variablave tuaj lokale 146 00:12:24,050 --> 00:12:26,760 gjithmonë të shkojnë në rafte. 147 00:12:26,760 --> 00:12:31,570 Çdo gjë që është malloced shkon në grumbull, dhe ajo do të përgjithmonë dhe gjithmonë të jetë në tog 148 00:12:31,570 --> 00:12:34,490 derisa ju në mënyrë eksplicite liruar atë. 149 00:12:34,490 --> 00:12:42,130 Pra, kjo do të thotë se kur ju malloc diçka, ajo do të mbijetojnë pas kthimit funksion. 150 00:12:42,130 --> 00:12:46,800 [Student] A do të mbijetojë, pasi programi ndalesa running? Nr >> 151 00:12:46,800 --> 00:12:53,180 Mirë, kështu që ajo do të jetë aty deri sa programi është mbi të gjitha mënyra bërë running. Po >>. 152 00:12:53,180 --> 00:12:57,510 Ne mund të shkojë mbi detajet e asaj që ndodh kur programi ndalesa running. 153 00:12:57,510 --> 00:13:02,150 Ju mund të kenë nevojë për t'i kujtuar mua, por kjo është një gjë e ndarë krejtësisht. 154 00:13:02,150 --> 00:13:04,190 [Student] Pra malloc krijon një akrep? Po >>. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [Student] Unë mendoj malloc cakton një bllok i kujtesës që një tregues mund të përdorni. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Unë dua që diagram përsëri. >> [Student] Pra ky funksion punon, pse? 157 00:13:19,610 --> 00:13:26,430 [Student] Yeah, malloc cakton një bllok i kujtesës që ju mund të përdorni, 158 00:13:26,430 --> 00:13:30,470 dhe pastaj ajo kthehet adresën e bllokut të parë të kësaj memorie. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Yeah. Kështu që kur ju malloc, ju jeni grabbing disa bllok e kujtesës 160 00:13:36,750 --> 00:13:38,260 që është aktualisht në tog. 161 00:13:38,260 --> 00:13:43,040 Nëse tog është shumë e vogël, atëherë tog është vetëm do të rritet, dhe ajo rritet në këtë drejtim. 162 00:13:43,040 --> 00:13:44,650 Pra, le të themi tog është shumë e vogël. 163 00:13:44,650 --> 00:13:49,960 Atëherë ajo është gati për të rritet pak dhe të kthehen një tregues për këtë bllok që vetëm u rrit. 164 00:13:49,960 --> 00:13:55,130 Kur ju stuff lirë, ju jeni bërë më shumë hapësirë ​​në tog, 165 00:13:55,130 --> 00:14:00,030 kështu atëherë a vonë thirrje për malloc mund të ripërdorimin atë kujtim që ju kishte liruar më parë. 166 00:14:00,030 --> 00:14:09,950 Gjëja më e rëndësishme në lidhje me malloc dhe të lirë është se ajo ju jep kontroll të plotë 167 00:14:09,950 --> 00:14:12,700 gjatë jetës së këto blloqe kujtesës. 168 00:14:12,700 --> 00:14:15,420 Variablat globale janë gjithmonë të gjallë. 169 00:14:15,420 --> 00:14:18,500 Variablat lokale janë gjallë brenda fushëveprimit të tyre. 170 00:14:18,500 --> 00:14:22,140 Sa më shpejt si ju shkoni kaluar një mbajtëse kaçurrel, variablat lokale janë të vdekur. 171 00:14:22,140 --> 00:14:28,890 Malloced memorie është i gjallë kur ju dëshironi që ajo të jetë gjallë 172 00:14:28,890 --> 00:14:33,480 dhe pastaj është lëshuar kur ju them se do të lirohet. 173 00:14:33,480 --> 00:14:38,420 Ata në të vërtetë janë vetëm 3 lloje të memories, të vërtetë. 174 00:14:38,420 --> 00:14:41,840 Ka menaxhimit automatik kujtesës, e cila është rafte. 175 00:14:41,840 --> 00:14:43,840 Gjëra të ndodhë për ju automatikisht. 176 00:14:43,840 --> 00:14:46,910 Kur ju thoni x int, kujtesës është ndarë për x int. 177 00:14:46,910 --> 00:14:51,630 Kur x shkon jashtë fushëveprimit, kujtesës është bonifikuar për x. 178 00:14:51,630 --> 00:14:54,790 Pastaj ka menaxhimi dinamike e kujtesës, e cila është ajo malloc është, 179 00:14:54,790 --> 00:14:56,740 e cila është kur ju keni kontroll. 180 00:14:56,740 --> 00:15:01,290 Ju vendosni kur kujtesa dinamike duhet dhe nuk duhet të ndahen. 181 00:15:01,290 --> 00:15:05,050 Dhe pastaj nuk ka statike, që thjesht do të thotë se ai jeton përgjithmonë, 182 00:15:05,050 --> 00:15:06,610 e cila është ajo variablave globale janë. 183 00:15:06,610 --> 00:15:10,240 Ata janë vetëm gjithmonë në kujtesën. 184 00:15:10,960 --> 00:15:12,760 >> Pyetje? 185 00:15:14,490 --> 00:15:17,230 [Student] A mund të përcaktojë një bllok vetëm duke përdorur formatimin e teksteve kaçurrel 186 00:15:17,230 --> 00:15:21,220 por jo që të ketë një deklaratë apo nëse një deklaratë kohë ose diçka të tillë? 187 00:15:21,220 --> 00:15:29,130 Ju mund të përcaktojë një bllok si në një funksion, por që ka formatimin e teksteve kaçurrel shumë. 188 00:15:29,130 --> 00:15:32,100 [Student] Pra, ju nuk mund të ketë vetëm si një palë të rastit të formatimin e teksteve kaçurrel në kodin tuaj 189 00:15:32,100 --> 00:15:35,680 që kanë variabla lokale? >> Po, mundeni. 190 00:15:35,680 --> 00:15:45,900 Brenda bar int ne mund të kemi {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Kjo është menduar të jetë e drejtë këtu. 192 00:15:48,440 --> 00:15:52,450 Por që plotësisht përcakton fushëveprimin e int y. 193 00:15:52,450 --> 00:15:57,320 Pas kësaj mbajtëse dytë kaçurrel, y nuk mund të përdoret më. 194 00:15:57,910 --> 00:16:00,630 Ju pothuajse asnjëherë ta bëjë këtë, pse. 195 00:16:02,940 --> 00:16:07,370 Getting back me atë që ndodh kur një programi përfundon, 196 00:16:07,370 --> 00:16:18,760 nuk është lloj i gënjeshtrës keqkuptim / gjysma që ne të japim në mënyrë që të bëjë vetëm gjërat më të lehtë. 197 00:16:18,760 --> 00:16:24,410 Ne ju them se kur ju siguroj kujtesë 198 00:16:24,410 --> 00:16:29,860 ju jeni caktimin e një copë e RAM për atë ndryshueshme. 199 00:16:29,860 --> 00:16:34,190 Por ju nuk jeni me të vërtetë të drejtpërdrejtë prekur RAM ndonjëherë në programet tuaja. 200 00:16:34,190 --> 00:16:37,490 Nëse ju mendoni për atë, se si unë e nxora - 201 00:16:37,490 --> 00:16:44,330 Dhe në fakt, në qoftë se ju shkoni nëpër në gdb ju do të shihni të njëjtën gjë. 202 00:16:51,120 --> 00:16:57,590 Pavarësisht se sa herë ju drejtuar programin tuaj apo se çfarë programi ju jeni running, 203 00:16:57,590 --> 00:16:59,950 rafte është gjithmonë do të fillojë - 204 00:16:59,950 --> 00:17:06,510 ju jeni gjithmonë do të shohim variablave rreth oxbffff diçka adresave. 205 00:17:06,510 --> 00:17:09,470 Kjo është zakonisht diku në atë rajon. 206 00:17:09,470 --> 00:17:18,760 Por si mund të ketë ndoshta 2 programe pointers në kujtesën e njëjtë? 207 00:17:20,640 --> 00:17:27,650 [Student] Ka disa përcaktimi arbitrar i oxbfff ku është menduar të jetë në RAM 208 00:17:27,650 --> 00:17:31,320 që në fakt mund të jenë në vende të ndryshme në varësi të kur funksioni është quajtur. 209 00:17:31,320 --> 00:17:35,920 Po. Termi është kujtesës virtuale. 210 00:17:35,920 --> 00:17:42,250 Ideja është që çdo proces vetëm, çdo program të vetëm që po kandidon në kompjuterin tuaj 211 00:17:42,250 --> 00:17:49,450 ka vet - le të supozojmë 32 bit - hapësirë ​​plotësisht i pavarur adresa. 212 00:17:49,450 --> 00:17:51,590 Kjo është hapësira adresa. 213 00:17:51,590 --> 00:17:56,220 Ajo ka veta plotësisht të pavarur 4 gigabajt të përdorur. 214 00:17:56,220 --> 00:18:02,220 >> Pra, nëse ju drejtuar 2 programe në të njëjtën kohë, ky program sheh 4 gigabajt në vetvete, 215 00:18:02,220 --> 00:18:04,870 ky program sheh 4 gigabajt në vetvete, 216 00:18:04,870 --> 00:18:07,720 dhe kjo është e pamundur për këtë program për dereference një akrep 217 00:18:07,720 --> 00:18:10,920 dhe përfundojnë me kujtesën nga ky program. 218 00:18:10,920 --> 00:18:18,200 Dhe çfarë kujtesës virtuale është është një hartë nga një hapësirë ​​proceseve adresë 219 00:18:18,200 --> 00:18:20,470 për gjërat aktuale në RAM. 220 00:18:20,470 --> 00:18:22,940 Kështu që është deri në sistemin tuaj operativ të dini se, 221 00:18:22,940 --> 00:18:28,080 hej, kur ky djalë dereferences pointer oxbfff, se me të vërtetë do të thotë 222 00:18:28,080 --> 00:18:31,040 se ai dëshiron RAM bajt 1000, 223 00:18:31,040 --> 00:18:38,150 ndërsa nëse ky program dereferences oxbfff, ai me të vërtetë dëshiron RAM bajt 10000. 224 00:18:38,150 --> 00:18:41,590 Ata mund të jenë në mënyrë arbitrare larg. 225 00:18:41,590 --> 00:18:48,730 Kjo është edhe e vërtetë të gjërave brenda një hapësire të vetme proceset e adresave. 226 00:18:48,730 --> 00:18:54,770 Pra, si ai i sheh të gjitha 4 gigabajt për vete, por le të themi - 227 00:18:54,770 --> 00:18:57,290 [Student] A çdo proces të vetëm - 228 00:18:57,290 --> 00:19:01,350 Le të thonë se ju keni një kompjuter me vetëm 4 gigabajt të RAM. 229 00:19:01,350 --> 00:19:06,430 A çdo proces të vetëm të shohin tërë 4 gigabajt? Po >>. 230 00:19:06,430 --> 00:19:13,060 Por 4 gigabajt sheh është një gënjeshtër. 231 00:19:13,060 --> 00:19:20,460 Është vetëm se mendon se i ka të gjitha kujtesën këtë, sepse ajo nuk e di se çdo proces tjetër ekziston. 232 00:19:20,460 --> 00:19:28,140 Ai vetëm do të përdorin sa më shumë memorie si ajo vërtetë ka nevojë. 233 00:19:28,140 --> 00:19:32,340 Sistemi operativ nuk do të japë RAM në këtë proces 234 00:19:32,340 --> 00:19:35,750 në qoftë se ajo nuk është duke përdorur ndonjë kujtim në këtë rajon të tërë. 235 00:19:35,750 --> 00:19:39,300 Kjo nuk do të japë atë kujtim për atë rajon. 236 00:19:39,300 --> 00:19:54,780 Por ideja është që - unë jam duke u përpjekur për të menduar për - Unë nuk mund të mendoj për një analogji. 237 00:19:54,780 --> 00:19:56,780 Analogjitë janë të vështirë. 238 00:19:57,740 --> 00:20:02,700 Një nga çështjet e kujtesës virtuale apo një nga gjërat që e zgjidhjes 239 00:20:02,700 --> 00:20:06,810 është se proceset duhet të jenë plotësisht në dijeni të njëri-tjetrit. 240 00:20:06,810 --> 00:20:12,140 Dhe kështu që ju mund të shkruani ndonjë program që vetëm dereferences ndonjë akrep, 241 00:20:12,140 --> 00:20:19,340 doja vetëm të shkruaj një program që thotë se * (ox1234), 242 00:20:19,340 --> 00:20:22,890 Adresa dereferencing dhe kjo është kujtesa 1234. 243 00:20:22,890 --> 00:20:28,870 >> Por është deri në sistemin operativ të atëhershëm të përkthyer se çfarë do të thotë 1234. 244 00:20:28,870 --> 00:20:33,960 Pra, nëse ndodh 1234 të jetë një adresë e vlefshme e kujtesës për këtë proces, 245 00:20:33,960 --> 00:20:38,800 si ajo është në rafte apo diçka, atëherë kjo do të kthehen vlerën e kujtesës atë adresë 246 00:20:38,800 --> 00:20:41,960 sa i përket procesit të di. 247 00:20:41,960 --> 00:20:47,520 Por në qoftë se 1234 nuk është një adresë e vlefshme, siç ndodh në tokë 248 00:20:47,520 --> 00:20:52,910 në disa pjesë të vogël të kujtesës këtu, që është përtej rafte dhe përtej tog 249 00:20:52,910 --> 00:20:57,200 dhe ju nuk e kanë përdorur me të vërtetë këtë, atëherë kjo është kur ju merrni gjëra të tilla si segfaults 250 00:20:57,200 --> 00:21:00,260 sepse ju jeni të prekur kujtesës që ju nuk duhet të jetë prekur. 251 00:21:07,180 --> 00:21:09,340 Kjo është gjithashtu e vërtetë - 252 00:21:09,340 --> 00:21:15,440 Një 32-bit sistemit, 32 bit do të thotë që ju keni 32 bit për të përcaktuar një adresë memorie. 253 00:21:15,440 --> 00:21:22,970 Kjo është arsyeja pse pointers janë 8 bytes sepse 32 bit janë 8 bytes - ose 4 bytes. 254 00:21:22,970 --> 00:21:25,250 Pointers janë 4 bytes. 255 00:21:25,250 --> 00:21:33,680 Kështu që kur ju shikoni një tregues si oxbfffff, që është - 256 00:21:33,680 --> 00:21:40,080 Brenda çdo program të caktuar vetëm ju mund të ndërtojë çdo treguesin arbitrar, 257 00:21:40,080 --> 00:21:46,330 diku nga ox0 të tëmthit 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Student] A nuk ju them se ata janë 4 bytes? Po >>. 259 00:21:49,180 --> 00:21:52,730 [Student] Pastaj çdo bajt do të ketë - >> [Bowden] Hexadecimal. 260 00:21:52,730 --> 00:21:59,360 Hexadecimal - 5, 6, 7, 8. Pra pointers ju do të jeni gjithmonë të parë në heksadecimal. 261 00:21:59,360 --> 00:22:01,710 Kjo është vetëm se si ne klasifikimin pointers. 262 00:22:01,710 --> 00:22:05,240 Çdo 2 shifrat e heksadecimal është 1 bajt. 263 00:22:05,240 --> 00:22:09,600 Kështu që nuk do të jetë 8 digits hexadecimal për 4 bytes. 264 00:22:09,600 --> 00:22:14,190 Pra, çdo tregues të vetme në një sistem të 32-bit do të jetë 4 bytes, 265 00:22:14,190 --> 00:22:18,550 që do të thotë se në procesin e juaj ju mund të ndërtojë ndonjë arbitrare 4 bytes 266 00:22:18,550 --> 00:22:20,550 dhe të bëjë një tregues nga ajo, 267 00:22:20,550 --> 00:22:32,730 që do të thotë se për aq sa ajo është në dijeni, ajo mund të trajtojë një 2 të tërë ndaj 32 bytes të kujtesës. 268 00:22:32,730 --> 00:22:34,760 Edhe pse ajo nuk ka të vërtetë të kenë qasje në se, 269 00:22:34,760 --> 00:22:40,190 edhe në qoftë se kompjuteri juaj ka vetëm 512 MB, ajo mendon se ajo ka shumë se kujtesa. 270 00:22:40,190 --> 00:22:44,930 Dhe sistemi operativ është mjaft i zgjuar se ajo vetëm do të ndajë atë që ju në të vërtetë nevojë. 271 00:22:44,930 --> 00:22:49,630 Ajo nuk ka vetëm të shkuar, oh, një proces të ri: 4 koncerte. 272 00:22:49,630 --> 00:22:51,930 >> Po. >> [Student] Çfarë do të thotë kau? Përse shkruani? 273 00:22:51,930 --> 00:22:54,980 Kjo është vetëm simbol për heksadecimal. 274 00:22:54,980 --> 00:22:59,590 Kur ju shihni një numër të fillojë me kaun, gjërat janë të njëpasnjëshme heksadecimal. 275 00:23:01,930 --> 00:23:05,760 [Student] Ju u shpjeguar se çfarë ndodh kur një program përfundon. Po >>. 276 00:23:05,760 --> 00:23:09,480 Çfarë ndodh kur një program përfundon është sistemi operativ 277 00:23:09,480 --> 00:23:13,600 vetëm fshin mappings që ajo ka për këto adresa, dhe kjo është ajo. 278 00:23:13,600 --> 00:23:17,770 Sistemi operativ tani mund të jap vetëm se kujtesa për një tjetër program për t'u përdorur. 279 00:23:17,770 --> 00:23:19,490 [Student] Okay. 280 00:23:19,490 --> 00:23:24,800 Kështu që kur ju ndajë diçka në tog ose variablave rafte apo globale apo ndonjë gjë, 281 00:23:24,800 --> 00:23:27,010 ata të gjithë vetëm të zhduket sa më shpejt që programi mbaron 282 00:23:27,010 --> 00:23:32,120 për shkak se sistemi operativ është tani të lirë për të dhënë atë kujtim për çdo proces tjetër. 283 00:23:32,120 --> 00:23:35,150 [Student] Edhe pse ka ndoshta ende vlerat e shkruara në? Po >>. 284 00:23:35,150 --> 00:23:37,740 Vlerat janë të ngjarë ende atje. 285 00:23:37,740 --> 00:23:41,570 Është vetëm ajo do të jetë e vështirë për të marrë me ta. 286 00:23:41,570 --> 00:23:45,230 Është shumë më e vështirë për të marrë me ta se ajo është për të marrë në një skedë fshihet 287 00:23:45,230 --> 00:23:51,450 sepse lloji fshihet dosja e ulet atje për një kohë të gjatë dhe hard drive është shumë e madhe. 288 00:23:51,450 --> 00:23:54,120 Kështu ajo do të prishësh pjesë të ndryshme të kujtesës 289 00:23:54,120 --> 00:23:58,640 para se të ndodhë që të prishësh copë e kujtesës që se dosja përdorur të jetë në. 290 00:23:58,640 --> 00:24:04,520 Por memorie kryesore, RAM, ju ciklit nëpërmjet një shumë të shpejtë, 291 00:24:04,520 --> 00:24:08,040 kështu ajo do të jetë shumë shpejt overwritten. 292 00:24:10,300 --> 00:24:13,340 Pyetjet për këtë apo ndonjë gjë tjetër? 293 00:24:13,340 --> 00:24:16,130 [Student] Kam pyetje në lidhje me një temë tjetër. Mirë >>. 294 00:24:16,130 --> 00:24:19,060 A ka ndokush pyetje për këtë? 295 00:24:20,170 --> 00:24:23,120 >> Rregull. Tema të ndryshme. >> [Student] Okay. 296 00:24:23,120 --> 00:24:26,550 Unë kam qenë duke shkuar nëpër disa nga testet praktikë, 297 00:24:26,550 --> 00:24:30,480 dhe në një prej tyre është folur për sizeof 298 00:24:30,480 --> 00:24:35,630 dhe vlera që kthehet apo lloje të ndryshme ndryshueshme. Po >>. 299 00:24:35,630 --> 00:24:45,060 Dhe ai tha se të dy int dhe afat kthimi 4 të dyja, kështu që ata janë të dyja 4 bytes gjatë. 300 00:24:45,060 --> 00:24:48,070 A ka ndonjë dallim në mes një int dhe një të gjatë, apo është e njëjta gjë? 301 00:24:48,070 --> 00:24:50,380 Po, ka një dallim. 302 00:24:50,380 --> 00:24:52,960 Standardi C - 303 00:24:52,960 --> 00:24:54,950 Unë jam me siguri do të mess up. 304 00:24:54,950 --> 00:24:58,800 Standardi C është vetëm si ajo C është, dokumentacioni zyrtar i C. 305 00:24:58,800 --> 00:25:00,340 Kjo është ajo që ai thotë. 306 00:25:00,340 --> 00:25:08,650 Pra standardi C vetëm thotë se një char do të përgjithmonë dhe gjithmonë të jetë 1 bajt. 307 00:25:10,470 --> 00:25:19,040 Gjithçka pas kësaj - një të shkurtër është gjithmonë përkufizohet vetëm si më e madhe se ose e barabartë me një char. 308 00:25:19,040 --> 00:25:23,010 Kjo mund të jetë më i madh se në mënyrë rigoroze, por jo pozitive. 309 00:25:23,010 --> 00:25:31,940 Një int definohet vetëm si më e madhe se ose e barabartë me një të shkurtër. 310 00:25:31,940 --> 00:25:36,210 Dhe një kohë të gjatë është përcaktuar ashtu si është më e madhe se ose e barabartë me një int. 311 00:25:36,210 --> 00:25:41,600 Dhe një kohë të gjatë është më e madhe se ose e barabartë me një kohë të gjatë. 312 00:25:41,600 --> 00:25:46,610 Pra, e vetmja gjë që përcakton standardi C është renditja relative e çdo gjëje. 313 00:25:46,610 --> 00:25:54,880 Shuma aktuale e kujtesës që gjërat të marrin në përgjithësi është deri në zbatimin, 314 00:25:54,880 --> 00:25:57,640 por kjo është goxha e mirë përcaktuar në këtë pikë. >> [Student] Okay. 315 00:25:57,640 --> 00:26:02,490 Pra, pantallona të shkurtra janë pothuajse gjithmonë do të jetë 2 bytes. 316 00:26:04,920 --> 00:26:09,950 Ints janë pothuajse gjithmonë do të jetë 4 bytes. 317 00:26:12,070 --> 00:26:15,340 Longs gjatë janë pothuajse gjithmonë do të jetë 8 bytes. 318 00:26:17,990 --> 00:26:23,160 Dhe dëshiron, kjo varet nga ajo nëse ju jeni duke përdorur një 32-bit or 64-bit të sistemit. 319 00:26:23,160 --> 00:26:27,450 Kështu që një kohë të gjatë do të korrespondojnë me llojin e sistemit. 320 00:26:27,450 --> 00:26:31,920 Nëse jeni duke përdorur një sistem të 32-bit si Appliance, ajo do të jetë 4 bytes. 321 00:26:34,530 --> 00:26:42,570 Nëse jeni duke përdorur një 64-bit si një shumë të kompjuterëve të fundit, ajo do të jetë 8 bytes. 322 00:26:42,570 --> 00:26:45,230 >> Ints janë pothuajse gjithmonë 4 bytes në këtë pikë. 323 00:26:45,230 --> 00:26:47,140 Longs gjatë janë pothuajse gjithmonë 8 bytes. 324 00:26:47,140 --> 00:26:50,300 Në të kaluarën, ints përdoret për të të jetë vetëm 2 bytes. 325 00:26:50,300 --> 00:26:56,840 Por vini re se ky plotësisht i përmbush të gjitha këtyre marrëdhënieve më të madhe se dhe të barabartë për të. 326 00:26:56,840 --> 00:27:01,280 Për aq kohë është e lejuar të përkryer që të jetë të njëjtën madhësi si një numër të plotë, 327 00:27:01,280 --> 00:27:04,030 dhe kjo është e lejuar gjithashtu të jetë të njëjtën madhësi si një kohë të gjatë. 328 00:27:04,030 --> 00:27:11,070 Dhe kjo ndodh pikërisht kështu që të jetë që në 99,999% e sistemeve të, ajo do të jetë e barabartë me 329 00:27:11,070 --> 00:27:15,800 ose një int apo një kohë të gjatë. Kjo varet vetëm 32-bit or 64-bit. >> [Student] Okay. 330 00:27:15,800 --> 00:27:24,600 Në gjithandej, sa është pika decimal të caktuar në drejtim të bit? 331 00:27:24,600 --> 00:27:27,160 Ashtu si binar? Po >>. 332 00:27:27,160 --> 00:27:30,570 Ju nuk keni nevojë të dini se për CS50. 333 00:27:30,570 --> 00:27:32,960 Ti as nuk mësojnë që në 61. 334 00:27:32,960 --> 00:27:37,350 Ju nuk mund të mësojnë që me të vërtetë në çdo kurs. 335 00:27:37,350 --> 00:27:42,740 Kjo është vetëm një përfaqësim. 336 00:27:42,740 --> 00:27:45,440 I harroj ndarje e saktë bit. 337 00:27:45,440 --> 00:27:53,380 Ideja e pikës notuese është që ju të caktojë një numër të caktuar të bit për të përfaqësuar - 338 00:27:53,380 --> 00:27:56,550 Në thelb, çdo gjë është në simbol shkencore. 339 00:27:56,550 --> 00:28:05,600 Pra, ju ndajë një numër të caktuar të bit për të përfaqësuar numrin e vetë, si 1,2345. 340 00:28:05,600 --> 00:28:10,200 Unë kurrë nuk mund të përfaqësojnë një numër me shifra më shumë se 5. 341 00:28:12,200 --> 00:28:26,300 Pastaj ju gjithashtu ndajë një numër specifik i bit në mënyrë që ajo tenton të jetë si 342 00:28:26,300 --> 00:28:32,810 ju mund të shkoni deri në një numër të caktuar, si që është eksponenti më i madh ju mund të keni, 343 00:28:32,810 --> 00:28:36,190 dhe ju vetëm mund të shkojnë deri në një eksponent të caktuar, 344 00:28:36,190 --> 00:28:38,770 si që është eksponenti më i vogël ju mund të keni. 345 00:28:38,770 --> 00:28:44,410 >> Unë nuk e mbani mend të saktë bit mënyrë janë caktuar për të gjitha këto vlera, 346 00:28:44,410 --> 00:28:47,940 por një numër i caktuar i bit janë të dedikuar për 1,2345, 347 00:28:47,940 --> 00:28:50,930 një numër i caktuar i bit janë të dedikuar për eksponent, 348 00:28:50,930 --> 00:28:55,670 dhe kjo është e mundur vetëm për të përfaqësuar një eksponent i një madhësie të caktuar. 349 00:28:55,670 --> 00:29:01,100 [Student] Dhe një të dyfishtë? Është se si një noton ekstra të gjatë? Po >>. 350 00:29:01,100 --> 00:29:07,940 Është e njëjta gjë si një float, përveç tani ju jeni duke përdorur në vend të 8 bytes 4 bytes. 351 00:29:07,940 --> 00:29:11,960 Tani ju do të jetë në gjendje të përdorin shifra 9 ose 10 numra, 352 00:29:11,960 --> 00:29:16,630 dhe kjo do të jetë në gjendje të shkojnë deri në 300 në vend të 100. >> [Student] Okay. 353 00:29:16,630 --> 00:29:21,550 Dhe gjithandej edhe 4 bytes. Po >>. 354 00:29:21,550 --> 00:29:27,520 E pra, përsëri, kjo ndoshta varet përgjithshëm mbi zbatimin e përgjithshëm, 355 00:29:27,520 --> 00:29:30,610 por gjithandej janë 4 bytes, dyshe janë 8. 356 00:29:30,610 --> 00:29:33,440 Dyshe janë quajtur të dyfishtë për shkak se ata janë të dyfishtë madhësinë e gjithandej. 357 00:29:33,440 --> 00:29:38,380 [Student] Okay. Dhe po aty dyfishtë dyshe? Nuk ka >>. 358 00:29:38,380 --> 00:29:43,660 Unë mendoj se - >> [Student] Ashtu si dëshiron të gjata? Po >>. Nuk ma ha mendja. Po. 359 00:29:43,660 --> 00:29:45,950 [Student] Në testin e vitit të kaluar ka pasur një pyetje në lidhje me funksionin kryesor 360 00:29:45,950 --> 00:29:49,490 pasur nevojë të jetë pjesë e programit tuaj. 361 00:29:49,490 --> 00:29:52,310 Përgjigja ishte se ajo nuk duhet të jetë pjesë e programit tuaj. 362 00:29:52,310 --> 00:29:55,100 Në atë situatë? Kjo është ajo që unë pashë. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Duket - >> [Student] Çfarë situata? 364 00:29:59,090 --> 00:30:02,880 A keni problem? >> [Student] Yeah, unë mund të patjetër të tërheqë atë. 365 00:30:02,880 --> 00:30:07,910 Ajo nuk duhet të jetë, teknikisht, por në thelb ajo do të jetë. 366 00:30:07,910 --> 00:30:10,030 [Student] unë pashë një në një vit e ndryshme. 367 00:30:10,030 --> 00:30:16,220 Ajo ishte si Vërtetë ose False: A të vlefshme - >> Oh, një file c.? 368 00:30:16,220 --> 00:30:18,790 . [Student] Çdo skedar duhet të ketë c - [si folëse në një herë - pakuptueshëm] 369 00:30:18,790 --> 00:30:21,120 Rregull. Pra, kjo është e veçantë. 370 00:30:21,120 --> 00:30:26,800 >> Një. Fotografi c vetëm duhet të përmbajë funksione. 371 00:30:26,800 --> 00:30:32,400 Ju mund të përpilojë një skedar në kodin e makinës, binar, çfarëdo, 372 00:30:32,400 --> 00:30:36,620 pa qenë ekzekutues ende. 373 00:30:36,620 --> 00:30:39,420 Një ekzekutiv i vlefshëm duhet të ketë një funksion kryesor. 374 00:30:39,420 --> 00:30:45,460 Ju mund të shkruani 100 funksione në 1 dosje, por jo kryesore 375 00:30:45,460 --> 00:30:48,800 dhe pastaj përpilojnë atë poshtë për binar, 376 00:30:48,800 --> 00:30:54,460 pastaj ju shkruani një skedar që ka vetëm kryesor, por ai kërkon një bandë e këtyre funksioneve 377 00:30:54,460 --> 00:30:56,720 në këtë skedar binar mbi këtu. 378 00:30:56,720 --> 00:31:01,240 Dhe kështu që kur ju jeni duke e bërë të ekzekutueshme, kjo është ajo që e bën linker 379 00:31:01,240 --> 00:31:05,960 është ajo kombinon këto 2 fotografi binare në një ekzekutues. 380 00:31:05,960 --> 00:31:11,400 Pra, a. Fotografi c nuk ka nevojë që të ketë një funksion kryesor në të gjitha. 381 00:31:11,400 --> 00:31:19,220 Dhe në bazë të kodit të mëdha ju do të shihni mijëra e dosjeve. 1 c dhe skedari kryesor. 382 00:31:23,960 --> 00:31:26,110 Më shumë pyetje? 383 00:31:29,310 --> 00:31:31,940 [Student] Nuk ishte një tjetër pyetje. 384 00:31:31,940 --> 00:31:36,710 Ai tha se është bërë një përpilues. Vërtetë ose False? 385 00:31:36,710 --> 00:31:42,030 Dhe përgjigja ishte e rreme, dhe kam kuptuar pse kjo nuk është si tingëllimë. 386 00:31:42,030 --> 00:31:44,770 Por çfarë ne e quajmë të bëni nëse kjo nuk është? 387 00:31:44,770 --> 00:31:49,990 Të bëjë në thelb është vetëm - Unë mund të shoh saktësisht se çfarë ajo e quan atë. 388 00:31:49,990 --> 00:31:52,410 Por ajo vetëm shkon komandat. 389 00:31:53,650 --> 00:31:55,650 Bërë. 390 00:31:58,240 --> 00:32:00,870 Unë mund të tërheqë këtë ide. Po. 391 00:32:10,110 --> 00:32:13,180 Oh, po. Të bëjë gjithashtu e bën këtë. 392 00:32:13,180 --> 00:32:17,170 Kjo thotë se qëllimi i ndërmarrjes të bëjë është të përcaktojë automatikisht 393 00:32:17,170 --> 00:32:19,610 cila pjesë e një programi të madh duhet të recompiled 394 00:32:19,610 --> 00:32:22,350 dhe të nxjerrë komandat për të përpiluar ato. 395 00:32:22,350 --> 00:32:27,690 Ju mund të bëni të bëni fotografi që janë absolutisht të madh. 396 00:32:27,690 --> 00:32:33,210 Bëni duket në vulave kohore e dosjeve dhe, si e thamë më përpara, 397 00:32:33,210 --> 00:32:36,930 ju mund të përpilojnë dosjet individuale poshtë, dhe kjo nuk është deri sa ju të merrni të linker 398 00:32:36,930 --> 00:32:39,270 se ata janë vënë së bashku në një ekzekutues. 399 00:32:39,270 --> 00:32:43,810 Pra, nëse ju keni 10 fotografi të ndryshme dhe ju bëni një ndryshim në 1 prej tyre, 400 00:32:43,810 --> 00:32:47,870 atëherë çfarë të bëjë është që do të bëni është vetëm që 1 fotografi recompile 401 00:32:47,870 --> 00:32:50,640 dhe pastaj relink gjithçka së bashku. 402 00:32:50,640 --> 00:32:53,020 Por kjo është shumë më e dumber se kaq. 403 00:32:53,020 --> 00:32:55,690 Është e deri tek ju për të krejtësisht të përcaktuar se kjo është ajo që duhet të bëni. 404 00:32:55,690 --> 00:32:59,560 Ajo nga default ka aftësinë për të njohur këtë stuff pullë kohë, 405 00:32:59,560 --> 00:33:03,220 por ju mund të shkruani një skedar të bëni për të bërë asgjë. 406 00:33:03,220 --> 00:33:09,150 Ju mund të shkruani një skedar të bëjë në mënyrë që kur ju shkruani bërë atë vetëm të cd në një tjetër directory. 407 00:33:09,150 --> 00:33:15,560 Unë kam qenë duke u irrituar sepse gjithçka litar brenda Appliance tim 408 00:33:15,560 --> 00:33:21,740 dhe pastaj kam parë PDF nga Mac. 409 00:33:21,740 --> 00:33:30,720 >> Kështu që unë shkoj në Finder dhe unë mund të shkoj, Connect to Server, 410 00:33:30,720 --> 00:33:36,950 dhe unë të lidheni me serverin është Appliance time, dhe pastaj kam hapur deri PDF 411 00:33:36,950 --> 00:33:40,190 që merr hartuar nga LaTeX. 412 00:33:40,190 --> 00:33:49,320 Por unë ishte duke u frustruar, sepse çdo herë të vetme që unë e nevojshme për të rifreskoni PDF, 413 00:33:49,320 --> 00:33:53,900 Unë kisha për të kopje atë në një directory të veçantë që ajo mund të ketë qasje 414 00:33:53,900 --> 00:33:57,710 dhe ajo ishte duke u bezdisshëm. 415 00:33:57,710 --> 00:34:02,650 Pra, në vend që unë shkroi një skedar të bërë, të cilën ju keni për të përcaktuar se si i bën gjërat. 416 00:34:02,650 --> 00:34:06,130 Si ju bëni në këtë është PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Ashtu si çdo skedar tjetër të bëjë - ose I guess ju nuk e keni parë fotografi të bërë, 418 00:34:10,090 --> 00:34:13,510 por ne kemi në një skedar Appliance globale bëjë që vetëm thotë, 419 00:34:13,510 --> 00:34:16,679 nëse ju jeni hartimin e një skedar C, përdorni tingëllimë. 420 00:34:16,679 --> 00:34:20,960 Dhe kështu këtu në dosjen time të bëjë që kam bërë unë them, 421 00:34:20,960 --> 00:34:25,020 Vlerësoni këtë fotografi ju jeni do të duan për të hartuar me PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Dhe kështu kjo është LaTeX PDF që e bën hartimin. 423 00:34:27,889 --> 00:34:31,880 Nuk është bërë hartimin. Është vetëm drejtimin këto komanda në rend kam specifikuar. 424 00:34:31,880 --> 00:34:36,110 Pra, ajo shkon latex PDF, ajo kopje atë në directory unë dua që ajo të jetë kopjohet, 425 00:34:36,110 --> 00:34:38,270 ajo CD-në directory dhe bën gjëra të tjera, 426 00:34:38,270 --> 00:34:42,380 por të gjitha ajo nuk është e njohur kur një skedar ndryshime, 427 00:34:42,380 --> 00:34:45,489 dhe në qoftë se ajo ndryshon, atëherë ajo do të kandidojë komandat që ajo është menduar për të kandiduar 428 00:34:45,489 --> 00:34:48,760 kur ndryshimet e file. >> [Student] Okay. 429 00:34:50,510 --> 00:34:54,420 Unë nuk e di se ku të bëjnë fotografi globale janë për mua për të kontrolluar atë. 430 00:34:57,210 --> 00:35:04,290 Pyetje të tjera? Çdo gjë nga e kaluara kuize? Çdo gjëra akrep? 431 00:35:06,200 --> 00:35:08,730 Ka gjëra delikate me pointers si - 432 00:35:08,730 --> 00:35:10,220 Unë nuk jam do të jetë në gjendje të gjejnë një pyetje quiz në të - 433 00:35:10,220 --> 00:35:16,250 por ashtu si ky lloj gjë. 434 00:35:19,680 --> 00:35:24,060 Sigurohuni që ju kuptoni se kur them int * x * y - 435 00:35:24,890 --> 00:35:28,130 Kjo nuk është saktësisht asgjë këtu, I guess. 436 00:35:28,130 --> 00:35:32,140 Por si * x * y, ato janë 2 variablave që janë në rafte. 437 00:35:32,140 --> 00:35:37,220 Kur them x = malloc (sizeof (int)), x është ende një ndryshore në rafte, 438 00:35:37,220 --> 00:35:41,180 malloc është një bllok gjatë në grumbull, dhe ne jemi të pasur pikë x në tog. 439 00:35:41,180 --> 00:35:43,900 >> Pra, diçka që në pikat rafte në tog. 440 00:35:43,900 --> 00:35:48,100 Kurdo që ju malloc asgjë, ju jeni në mënyrë të pashmangshme ruajtjen atë në brendësi të një akrep. 441 00:35:48,100 --> 00:35:55,940 Kështu që akrep është në rafte, blloku malloced është në tog. 442 00:35:55,940 --> 00:36:01,240 Shumë njerëz të marrë hutuar dhe thonë int * x = malloc, x është në tog. 443 00:36:01,240 --> 00:36:04,100 Nr Çfarë x tregon është në tog. 444 00:36:04,100 --> 00:36:08,540 x vetvete është në rafte, përveç nëse për çfarëdo arsye ju keni x të jetë një variabël globale, 445 00:36:08,540 --> 00:36:11,960 në të cilin rast kjo ndodh të jetë në një rajon tjetër të kujtesës. 446 00:36:13,450 --> 00:36:20,820 Pra mbajtja, këto kuti diagramet dhe shigjetë janë mjaft të zakonshme për quiz. 447 00:36:20,820 --> 00:36:25,740 Ose në qoftë se ajo nuk është në quiz 0, ajo do të jetë në quiz 1. 448 00:36:27,570 --> 00:36:31,940 Ju duhet të dini të gjitha këto, hapat në hartimin e 449 00:36:31,940 --> 00:36:35,740 që keni pasur për t'iu përgjigjur pyetjeve mbi ato. Po. 450 00:36:35,740 --> 00:36:38,940 [Student] A mund të shkoj këtyre hapave - >> Sigurisht. 451 00:36:48,340 --> 00:36:58,640 Para hapat dhe hartimin kemi preprocessing, 452 00:36:58,640 --> 00:37:16,750 përpilimin, montimin, dhe lidh. 453 00:37:16,750 --> 00:37:21,480 Preprocessing. Çfarë do të bëni? 454 00:37:29,720 --> 00:37:32,290 Ajo është hapi më i lehtë në - mirë, jo si - 455 00:37:32,290 --> 00:37:35,770 që nuk do të thotë se duhet të jetë e qartë, por është hapi më i lehtë. 456 00:37:35,770 --> 00:37:38,410 Ju djema mund të zbatojë atë për veten tuaj. Po. 457 00:37:38,410 --> 00:37:43,410 [Student] Merrni atë që ju keni në tuaj përfshin si kjo dhe ajo kopje dhe pastaj përcakton gjithashtu. 458 00:37:43,410 --> 00:37:49,250 Ajo duket për gjëra të tilla si # include # define dhe, 459 00:37:49,250 --> 00:37:53,800 dhe kjo vetëm kopje dhe pastat çka ata vërtetë do të thotë. 460 00:37:53,800 --> 00:37:59,240 Pra, kur ju thoni # include cs50.h, preprocessor është kopjimi dhe pasting cs50.h 461 00:37:59,240 --> 00:38:01,030 në atë linjë. 462 00:38:01,030 --> 00:38:06,640 Kur ju thoni # define x të jetë 4, preprocessor shkon përmes programit të tërë 463 00:38:06,640 --> 00:38:10,400 dhe zëvendëson të gjitha instancat e X me 4. 464 00:38:10,400 --> 00:38:17,530 Pra preprocessor merr një skedar të vlefshme C dhe rezultatet e një skedar të vlefshme C 465 00:38:17,530 --> 00:38:20,300 ku gjërat janë kopjuar dhe ngjit. 466 00:38:20,300 --> 00:38:24,230 Kështu që tani përpilimit. Çfarë do të bëni? 467 00:38:25,940 --> 00:38:28,210 [Student] Ajo shkon nga C në binar. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Ajo nuk ka shkuar gjatë gjithë rrugës për binar. 469 00:38:30,970 --> 00:38:34,220 [Student] Për kodin e makinës pastaj? >> Kjo nuk është kod makine. 470 00:38:34,220 --> 00:38:35,700 [Student] Kuvendit? Kuvendi >>. 471 00:38:35,700 --> 00:38:38,890 Ajo shkon në Kuvend para se ajo shkon gjitha mënyra për të kodit C, 472 00:38:38,890 --> 00:38:45,010 dhe gjuhët më të bëjë diçka si kjo. 473 00:38:47,740 --> 00:38:50,590 Marr çdo gjuhë të nivelit të lartë, dhe në qoftë se ju jeni do të hartojnë atë, 474 00:38:50,590 --> 00:38:52,390 është e mundshme që të përpilojnë në hapa. 475 00:38:52,390 --> 00:38:58,140 Së pari, ai do të hartojë Python në C, atëherë ajo do të hartojë C në Kuvend, 476 00:38:58,140 --> 00:39:01,600 dhe pastaj Kuvendi do të merrni përkthyer në binar. 477 00:39:01,600 --> 00:39:07,800 Pra hartimin do të sjellë atë nga C në Kuvend. 478 00:39:07,800 --> 00:39:12,130 Fjala hartimin zakonisht do të thotë duke e çuar atë nga një nivel më të lartë 479 00:39:12,130 --> 00:39:14,340 në një gjuhë programimi të ulët të nivelit. 480 00:39:14,340 --> 00:39:19,190 Pra, ky është hapi i vetëm në hartimin, ku ju të filloni me një gjuhë të nivelit të lartë 481 00:39:19,190 --> 00:39:23,270 dhe do të përfundojë deri në një gjuhë të nivelit të ulët, dhe kjo është arsyeja pse është quajtur hapi hartimin. 482 00:39:25,280 --> 00:39:33,370 [Student] Gjatë përpilimit, le të thonë se ju keni bërë # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 A do të recompile përpilues the cs50.h, si funksionet që janë në atje, 484 00:39:42,190 --> 00:39:45,280 dhe përkthyer që në kodin e Kuvendit, si edhe, 485 00:39:45,280 --> 00:39:50,830 apo do të kopjoni dhe ngjisni diçka që është para-Kuvendi? 486 00:39:50,830 --> 00:39:56,910 cs50.h do pretty kurrë shumë të përfundojnë në Kuvend. 487 00:39:59,740 --> 00:40:03,680 Stuff like prototypes funksion dhe gjërat janë vetëm për ju që të jenë të kujdesshëm. 488 00:40:03,680 --> 00:40:09,270 Ai garanton se përpiluesit mund të shikoni gjëra si ju jeni duke bërë thirrje funksionet 489 00:40:09,270 --> 00:40:12,910 me lloje të drejtën e kthimit dhe argumentet e duhura dhe sende. 490 00:40:12,910 --> 00:40:18,350 >> Pra cs50.h do të preprocessed në dosje, dhe pastaj kur ajo e përpilimit 491 00:40:18,350 --> 00:40:22,310 ajo është hedhur në thelb larg, pasi ajo e bën të sigurt se çdo gjë është duke u quajtur të saktë. 492 00:40:22,310 --> 00:40:29,410 Por funksionet e përcaktuara në bibliotekë CS50, të cilat janë të ndara nga cs50.h, 493 00:40:29,410 --> 00:40:33,610 ata nuk do të hartohet ndaras. 494 00:40:33,610 --> 00:40:37,270 Kjo në fakt do të zbresë në hapin e lidh, kështu që ne do të merrni për të që në një të dytë. 495 00:40:37,270 --> 00:40:40,100 Por së pari, çfarë është grumbulluar? 496 00:40:41,850 --> 00:40:44,500 [Student] Kuvendit për binar? Po >>. 497 00:40:46,300 --> 00:40:48,190 Grumbulluar. 498 00:40:48,190 --> 00:40:54,710 Ne nuk e quajmë atë përpilimin sepse Kuvendi është shumë shumë një përkthim i pastër binar. 499 00:40:54,710 --> 00:41:00,230 Nuk ka logjikë shumë pak në vazhdim e sipër nga Kuvendi në binar. 500 00:41:00,230 --> 00:41:03,180 Është vetëm si shikuar deri në një tryezë, oh, ne kemi këtë udhëzim; 501 00:41:03,180 --> 00:41:06,290 që korrespondon me binar 01.110. 502 00:41:10,200 --> 00:41:15,230 Dhe kështu fotografi që në përgjithësi rezultatet janë grumbulluar. Fotografi o. 503 00:41:15,230 --> 00:41:19,020 Dhe. Fotografi o janë ato që ne u thënë më parë, 504 00:41:19,020 --> 00:41:21,570 si një 'file' nuk ka nevojë të ketë një funksion kryesor. 505 00:41:21,570 --> 00:41:27,640 Çdo file mund të jetë përpiluar deri në një skedar. O sa kohë që ajo është një file i vlefshëm C. 506 00:41:27,640 --> 00:41:30,300 Ajo mund të jetë përpiluar poshtë për të. O. 507 00:41:30,300 --> 00:41:43,030 Tani, është ajo që lidh të vërtetë sjell një bandë e. Fotografi o dhe i sjell ata në një ekzekutues. 508 00:41:43,030 --> 00:41:51,110 Dhe kështu që ajo lidh bën është që ju mund të mendoni për bibliotekën e CS50 si një skedar. O. 509 00:41:51,110 --> 00:41:56,980 Kjo është një file binar hartuar tashmë. 510 00:41:56,980 --> 00:42:03,530 Dhe kështu që kur ju hartojnë dosjen tuaj, hello.c tuaj, e cila e quan getString, 511 00:42:03,530 --> 00:42:06,360 hello.c merr poshtë për të hartuar hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o është tani në binar. 513 00:42:08,910 --> 00:42:12,830 Ai përdor getString, kështu që ajo ka nevojë për të shkuar mbi të cs50.o, 514 00:42:12,830 --> 00:42:16,390 dhe linker smooshes ato së bashku dhe kopjon getString në këtë dosje 515 00:42:16,390 --> 00:42:20,640 dhe vjen me një ekzekutues që ka të gjitha funksionet që i duhen. 516 00:42:20,640 --> 00:42:32,620 Pra cs50.o nuk është në fakt një file o, por është mjaft afër se nuk ka asnjë ndryshim thelbësor. 517 00:42:32,620 --> 00:42:36,880 Pra lidh vetëm sjell një bandë e dosjeve bashku 518 00:42:36,880 --> 00:42:41,390 se vete përmban të gjitha funksionet që unë duhet të përdorni 519 00:42:41,390 --> 00:42:46,120 dhe krijon ekzekutueshme që vërtetë do të kandidojë. 520 00:42:48,420 --> 00:42:50,780 >> Dhe kështu kjo është edhe ajo që ne kemi qenë të thënë para 521 00:42:50,780 --> 00:42:55,970 ku ju mund të ketë 1000. fotografi c, ju hartojë të gjithë ata për të. fotografi o, 522 00:42:55,970 --> 00:43:00,040 të cilat ndoshta do të marrë një kohë, atëherë ju të ndryshojë 1. fotografi c. 523 00:43:00,040 --> 00:43:05,480 Ju vetëm duhet të përpiluar këtë dosje. 1 c dhe pastaj çdo gjë tjetër, relink 524 00:43:05,480 --> 00:43:07,690 Lidhje gjithçka kthehet së bashku. 525 00:43:09,580 --> 00:43:11,430 [Student] Kur ne jemi lidh kemi shkruar lcs50? 526 00:43:11,430 --> 00:43:20,510 Po, ashtu-lcs50. Se sinjalet flamur në linker që ju duhet të lidhin në këtë bibliotekë. 527 00:43:26,680 --> 00:43:28,910 Pyetje? 528 00:43:41,310 --> 00:43:46,860 Kemi kaluar mbi binare përveç se 5 sekonda në leksionin e parë? 529 00:43:50,130 --> 00:43:53,010 Nuk ma ha mendja. 530 00:43:55,530 --> 00:43:58,820 Ju duhet të dini të gjitha OS madhe që ne kemi shkuar mbi, 531 00:43:58,820 --> 00:44:02,670 dhe ju duhet të jetë në gjendje për të, nëse ju dha një funksion, 532 00:44:02,670 --> 00:44:09,410 ju duhet të jetë në gjendje të thonë se kjo është e madhe O, përafërsisht. Ose mirë, i madh o është i përafërt. 533 00:44:09,410 --> 00:44:15,300 Pra, nëse ju shihni mbivendosur për sythe mbi looping numër të njëjtë të gjërave, 534 00:44:15,300 --> 00:44:22,260 si int i, i > [Student] n katror. >> Ajo tenton të jetë n katror. 535 00:44:22,260 --> 00:44:25,280 Nëse keni mbivendosur trefishtë, ajo tenton të jetë n Cubed. 536 00:44:25,280 --> 00:44:29,330 Kështu që lloj i gjë që ju duhet të jetë në gjendje për të vënë në dukje menjëherë. 537 00:44:29,330 --> 00:44:33,890 Ju duhet të dini lloj futje dhe lloj lloj flluskë dhe të shkrihej dhe të gjithë ata. 538 00:44:33,890 --> 00:44:41,420 Është më e lehtë për të kuptuar pse ata janë ata n katror dhe n log n dhe të gjithë e që 539 00:44:41,420 --> 00:44:47,810 sepse unë mendoj se ka qenë në një quiz një vit ku ne thelb ju dha 540 00:44:47,810 --> 00:44:55,050 një zbatim i lloj flluskë dhe i tha: "Cili është koha drejtimin e këtij funksioni?" 541 00:44:55,050 --> 00:45:01,020 Pra, nëse ju njohin atë si lloj flluskë, atëherë ju mund të thoni menjëherë n katror. 542 00:45:01,020 --> 00:45:05,470 Por në qoftë se ju vetëm shikoni në atë, ju nuk keni nevojë edhe për të realizuar atë të lloj flluskë; 543 00:45:05,470 --> 00:45:08,990 vetëm ju mund të thonë se kjo është bërë këtë dhe këtë. Kjo është n katror. 544 00:45:12,350 --> 00:45:14,710 [Student] A ka ndonjë shembuj të vështira që ju mund të dalë me të, 545 00:45:14,710 --> 00:45:20,370 si një ide të ngjashme të parafytyruar se? 546 00:45:20,370 --> 00:45:24,450 >> Unë nuk mendoj se ne do të ju jap ndonjë shembull të vështira. 547 00:45:24,450 --> 00:45:30,180 Lloj flluskë gjë është gati aq e vështirë sa ne do të shkojnë, 548 00:45:30,180 --> 00:45:36,280 dhe madje edhe se, për aq kohë sa ju e kuptoni se ju jeni iterating mbi array 549 00:45:36,280 --> 00:45:41,670 për çdo element në grup, i cili është do të jetë diçka që është n katror. 550 00:45:45,370 --> 00:45:49,940 Ka pyetje të përgjithshme, si të drejtë këtu kemi - Oh. 551 00:45:55,290 --> 00:45:58,530 Vetëm ditën tjetër, Doug pohoi, "unë kam shpikur një algoritmi që mund të zgjidhur një sërë 552 00:45:58,530 --> 00:46:01,780 "E numrave n në O (log n) koha!" 553 00:46:01,780 --> 00:46:04,900 Pra, si mund ta dimë se kjo është e pamundur? 554 00:46:04,900 --> 00:46:08,850 [Përgjigja e padëgjueshme Student] >> Yeah. 555 00:46:08,850 --> 00:46:13,710 Në shumë pak, ju duhet të prekë çdo element në grup, 556 00:46:13,710 --> 00:46:16,210 kështu që është e pamundur për të zgjidhur një sërë - 557 00:46:16,210 --> 00:46:20,850 Nëse çdo gjë është në rregull Unsorted, atëherë ju do të jeni të prekur gjithçka në grup, 558 00:46:20,850 --> 00:46:25,320 kështu që është e pamundur për të bërë atë në më pak se o n. 559 00:46:27,430 --> 00:46:30,340 [Student] Ju na tregoi se shembullin e të qenit në gjendje për ta bërë atë në të O n 560 00:46:30,340 --> 00:46:33,920 në qoftë se ju përdorni një shumë të kujtesës. Po >>. 561 00:46:33,920 --> 00:46:37,970 Dhe that's - harroj atë that's - A është numëruar lloj? 562 00:46:47,360 --> 00:46:51,330 Hmm. Kjo është një algoritmi integer klasifikim. 563 00:46:59,850 --> 00:47:05,100 Unë kam qenë në kërkim për emrin e veçantë për këtë se unë nuk mund të kujtohet javën e kaluar. 564 00:47:05,100 --> 00:47:13,000 Po. Këto janë llojet e llojeve që mund të kryejnë gjëra në Big O e n. 565 00:47:13,000 --> 00:47:18,430 Por ka kufizime, si ju mund të përdorin vetëm integers deri në një numër të caktuar. 566 00:47:20,870 --> 00:47:24,560 Plus, nëse ju jeni duke u përpjekur për të zgjidhur diçka that's - 567 00:47:24,560 --> 00:47:30,750 Nëse array juaj është 012, -12, 151, 4 milion, 568 00:47:30,750 --> 00:47:35,120 pastaj se elementi i vetëm do të krejtësisht të prishin tërë klasifikim. 569 00:47:42,060 --> 00:47:44,030 >> Pyetje? 570 00:47:49,480 --> 00:47:58,870 [Student] Nëse ju keni një funksion gjithkund rekursive dhe vetëm ajo bën thirrje gjithkund rekursive 571 00:47:58,870 --> 00:48:02,230 brenda një deklarate të kthimit, që është recursive bisht, 572 00:48:02,230 --> 00:48:07,360 dhe kështu nuk do që përdorin shumë memorie gjatë duhur 573 00:48:07,360 --> 00:48:12,550 ose të paktën do të përdorë memorie si një përsëritës krahasueshme zgjidhje? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Po. 575 00:48:14,530 --> 00:48:19,840 Ajo do të ngjarë të jetë disi të ngadalshme, por jo të vërtetë. 576 00:48:19,840 --> 00:48:23,290 Bisht rekursive është shumë e mirë. 577 00:48:23,290 --> 00:48:32,640 Looking përsëri në korniza rafte, le të thonë se ne kemi kryesor 578 00:48:32,640 --> 00:48:42,920 dhe ne kemi bar int (int x) ose diçka. 579 00:48:42,920 --> 00:48:52,310 Kjo nuk është një funksion përsosur rekursive, por bar kthimi (x - 1). 580 00:48:52,310 --> 00:48:57,620 Pra natyrisht, kjo është me të meta. Ju duhet rastet bazë dhe sende. 581 00:48:57,620 --> 00:49:00,360 Por, ideja këtu është se ky është bisht rekursive, 582 00:49:00,360 --> 00:49:06,020 që do të thotë kur e quan atë bar kryesor do të merrni kuadrin e saj rafte. 583 00:49:09,550 --> 00:49:12,440 Në këtë kuadër rafte atje do të jetë një bllok të vogël të kujtesës 584 00:49:12,440 --> 00:49:17,490 që korrespondon me x saj argument. 585 00:49:17,490 --> 00:49:25,840 Dhe kështu që le të themi që ndodh kryesore për të thirrur bar (100); 586 00:49:25,840 --> 00:49:30,050 Pra x do të fillojë sa më 100. 587 00:49:30,050 --> 00:49:35,660 Nëse përpiluesit e pranon se ky është një funksion recursive bisht, 588 00:49:35,660 --> 00:49:38,540 atëherë kur bën thirrje bar saj recursive për të penguar, 589 00:49:38,540 --> 00:49:45,490 vend për të bërë një kornizë të re rafte, i cili është ku fillon rafte në rritje në masë të madhe, 590 00:49:45,490 --> 00:49:48,220 në fund ajo do të kandidojë në tog dhe pastaj ju merrni segfaults 591 00:49:48,220 --> 00:49:51,590 sepse memoria fillon colliding. 592 00:49:51,590 --> 00:49:54,830 >> Pra, në vend të bërë vetë kuadrin e saj rafte, ajo mund të kuptojnë, 593 00:49:54,830 --> 00:49:59,080 hej, unë kurrë nuk duhet të vërtetë për të ardhur përsëri në këtë kuadër rafte, 594 00:49:59,080 --> 00:50:08,040 kështu që në vend që unë vetëm do të zëvendësojë këtë argument me 99 dhe pastaj të fillojë bar të gjithë. 595 00:50:08,040 --> 00:50:11,810 Dhe pastaj ajo do të bëjë atë përsëri dhe ajo do të arrijë bar kthimit (x - 1), 596 00:50:11,810 --> 00:50:17,320 dhe në vend të bërë një kornizë të re rafte, ai thjesht do të zëvendësojë argumentin e tij aktuale me 98 597 00:50:17,320 --> 00:50:20,740 dhe pastaj hidhen përsëri në fillim të bar. 598 00:50:23,860 --> 00:50:30,430 Këto operacione, duke zëvendësuar atë vlerë 1 në rafte dhe hedhur përsëri në fillim, 599 00:50:30,430 --> 00:50:32,430 janë mjaft të efektshme. 600 00:50:32,430 --> 00:50:41,500 Pra, jo vetëm që është përdorimi i njëjtë kujtesës si një funksion të veçantë e cila është përsëritës 601 00:50:41,500 --> 00:50:45,390 sepse ju jeni vetëm duke përdorur 1 kornizë rafte, por ju nuk jeni duke vuajtur me dobësi 602 00:50:45,390 --> 00:50:47,240 e të pasurit për të thirrur funksionet. 603 00:50:47,240 --> 00:50:50,240 Funksionet e quajtur mund të jetë disi e shtrenjtë për shkak se ajo ka të bëjë gjithë këtë përbërje 604 00:50:50,240 --> 00:50:52,470 dhe teardown dhe e gjithë kjo stuff. 605 00:50:52,470 --> 00:50:58,160 Pra, kjo është e mirë recursion bisht. 606 00:50:58,160 --> 00:51:01,170 [Student] Pse nuk krijon hapa të reja? 607 00:51:01,170 --> 00:51:02,980 Sepse ai e kupton se nuk ka nevojë për të. 608 00:51:02,980 --> 00:51:07,800 Thirrja për bar është vetëm kthimin e thirrjes rekursive. 609 00:51:07,800 --> 00:51:12,220 Kështu që nuk ka nevojë të bëjë asgjë me vlerën e kthimit. 610 00:51:12,220 --> 00:51:15,120 Është vetëm do të kthehen menjëherë atë. 611 00:51:15,120 --> 00:51:20,530 Pra, kjo është vetëm do të zëvendësojë argumentin e vet dhe të fillojnë të gjatë. 612 00:51:20,530 --> 00:51:25,780 Dhe gjithashtu, në qoftë se ju nuk keni versionin e bisht rekursive, 613 00:51:25,780 --> 00:51:31,460 atëherë ju merrni të gjitha këto bare ku kur ky bar Kthim 614 00:51:31,460 --> 00:51:36,010 ajo ka për t'u kthyer vlerën e saj me këtë, atëherë kjo bar kthen menjëherë 615 00:51:36,010 --> 00:51:39,620 dhe vlerën e saj kthehet në këtë, atëherë ajo është vetëm do të kthehen menjëherë 616 00:51:39,620 --> 00:51:41,350 dhe vlerën e saj kthehet në këtë një të tillë. 617 00:51:41,350 --> 00:51:45,350 Pra, ju jeni të shpëtuar këtë popping të gjitha këto gjëra jashtë të rafte 618 00:51:45,350 --> 00:51:48,730 që vlera kthimi është vetëm do të kaluar gjithë rrugën back up anyway. 619 00:51:48,730 --> 00:51:55,400 Pra, pse të mos vetëm të zëvendësojë argumentin tonë me argumentin përditësuar dhe të fillojnë të gjatë? 620 00:51:57,460 --> 00:52:01,150 Nëse funksioni nuk është recursive bisht, nëse ju bëni diçka si - 621 00:52:01,150 --> 00:52:07,530 [Studenti] nëse bar (x + 1). Po >>. 622 00:52:07,530 --> 00:52:11,770 >> Pra, nëse ju vënë atë në gjendje, atëherë ju jeni duke bërë diçka me vlerë e kthimit. 623 00:52:11,770 --> 00:52:16,260 Apo edhe nëse ju vetëm bëni kthimin 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Deri tani bar (x - 1) duhet të kthehen në mënyrë që ajo të llogaritur 2 herë se vlera, 625 00:52:23,560 --> 00:52:26,140 kështu që tani ai ka nevojë për vetë kuadrin e saj të veçantë rafte, 626 00:52:26,140 --> 00:52:31,180 dhe tani, pa marrë parasysh sa e vështirë ju provoni, ju jeni do të duhet të - 627 00:52:31,180 --> 00:52:34,410 Kjo nuk është bishti rekursive. 628 00:52:34,410 --> 00:52:37,590 [Student] A unë të përpiqet për të sjellë një recursion të synojnë për një bisht recursion - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Në një botë ideale, por në CS50 ju nuk keni për të. 630 00:52:43,780 --> 00:52:49,280 Në mënyrë që të merrni recursion bisht, në përgjithësi, ju ngritur një argument shtesë 631 00:52:49,280 --> 00:52:53,550 ku bar do të marrë x int y në 632 00:52:53,550 --> 00:52:56,990 dhe y korrespondon me gjë fundit që ju doni të ktheheni. 633 00:52:56,990 --> 00:53:03,650 Pra, atëherë kjo ju do të jeni të kthehen bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Pra, kjo është vetëm një nivel të lartë si ju transformojnë gjërat të jenë bisht rekursive. 635 00:53:09,810 --> 00:53:13,790 Por argumenti ekstra - 636 00:53:13,790 --> 00:53:17,410 Dhe pastaj në fund, kur të keni arritur rastin tuaj bazë, ju vetëm të kthehet y 637 00:53:17,410 --> 00:53:22,740 sepse ju keni qenë të akumulojnë gjithë kohës vlerën e kthimit që ju dëshironi. 638 00:53:22,740 --> 00:53:27,280 Ju lloj kanë bërë atë iteratively por duke përdorur thirrje gjithkund rekursive. 639 00:53:32,510 --> 00:53:34,900 Pyetje? 640 00:53:34,900 --> 00:53:39,890 [Student] Ndoshta rreth aritmetike akrep, si kur duke përdorur vargjet. Sigurisht >>. 641 00:53:39,890 --> 00:53:43,610 Aritmetike pointer. 642 00:53:43,610 --> 00:53:48,440 Kur duke përdorur vargje është e lehtë, sepse vargjet janë yjet char, 643 00:53:48,440 --> 00:53:51,860 chars janë përgjithmonë dhe gjithmonë një bajt vetme, 644 00:53:51,860 --> 00:53:57,540 dhe kështu aritmetike tregues është i barabartë me aritmetike të rregullt, kur ju jeni që kanë të bëjnë me vargjet. 645 00:53:57,540 --> 00:54:08,790 Le të them vetëm char * s = "hello". 646 00:54:08,790 --> 00:54:11,430 Pra, ne kemi një bllok në kujtesë. 647 00:54:19,490 --> 00:54:22,380 Ajo ka nevojë për 6 bytes sepse ju gjithmonë duhet The Terminator null. 648 00:54:22,380 --> 00:54:28,620 Dhe char * s do të pikë në fillim të këtij grup. 649 00:54:28,620 --> 00:54:32,830 Pra s pikë atje. 650 00:54:32,830 --> 00:54:36,710 Tani, kjo është në thelb si çdo grup punon, 651 00:54:36,710 --> 00:54:40,780 pavarësisht nëse kjo ishte një kthim nga malloc ose nëse kjo është në rafte. 652 00:54:40,780 --> 00:54:47,110 Çdo grup në thelb është një tregues për fillimin e array, 653 00:54:47,110 --> 00:54:53,640 dhe pastaj çdo operacion array, çdo Indexing, është vetëm duke shkuar në atë grup të caktuar një kompensuar. 654 00:54:53,640 --> 00:55:05,360 >> Pra, kur them diçka si ve [3], kjo do të s dhe duke numëruar 3 chars in 655 00:55:05,360 --> 00:55:12,490 Kështu s [3], ne kemi 0, 1, 2, 3, kështu s [3] do te referohen te kete l. 656 00:55:12,490 --> 00:55:20,460 [Student] Dhe ne mund të arrijë vlerën e njëjtë duke bërë s + 3 dhe pastaj kllapat yll? 657 00:55:20,460 --> 00:55:22,570 Po. 658 00:55:22,570 --> 00:55:26,010 Kjo është ekuivalente me * (S + 3); 659 00:55:26,010 --> 00:55:31,240 dhe që është përgjithmonë dhe gjithmonë e barabartë pa marrë parasysh atë që bëni ju. 660 00:55:31,240 --> 00:55:34,070 Ju kurrë nuk duhet të përdorni sintaksë parantezë. 661 00:55:34,070 --> 00:55:37,770 Ju mund të përdorni përherë * (s + 3) sintaksë. 662 00:55:37,770 --> 00:55:40,180 Njerëzit kanë tendencë për të si sintaksë parantezë, edhe pse. 663 00:55:40,180 --> 00:55:43,860 [Student] Pra, të gjitha vargjeve të vërtetë janë vetëm pointers. 664 00:55:43,860 --> 00:55:53,630 Ka një dallim të vogël, kur them int x [4]; >> [Student] A që krijojnë e kujtesës? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Kjo do të krijojë 4 ints në rafte, kështu që 16 bytes përgjithshëm. 666 00:56:03,320 --> 00:56:05,700 Kjo do të krijojë 16 bytes në rafte. 667 00:56:05,700 --> 00:56:09,190 x nuk është ruajtur kudo. 668 00:56:09,190 --> 00:56:13,420 Kjo është vetëm një simbol duke iu referuar fillimit të gjë. 669 00:56:13,420 --> 00:56:17,680 Sepse ju e shpalli rrjet brenda këtij funksioni, 670 00:56:17,680 --> 00:56:22,340 çfarë përpiluesit do të bëni është që vetëm të zëvendësojë të gjitha instancat e ndryshueshme x 671 00:56:22,340 --> 00:56:26,400 me ku kjo ka ndodhur për të zgjedhur për të vënë këto 16 bytes. 672 00:56:26,400 --> 00:56:30,040 Ajo nuk mund ta bëjë këtë me char * S sepse s është një pointer aktuale. 673 00:56:30,040 --> 00:56:32,380 Ajo është e lirë për të pastaj të tregojnë për gjëra të tjera. 674 00:56:32,380 --> 00:56:36,140 x është një konstante. Ju nuk mund të ketë atë pikë për një grup të ndryshme. >> [Student] Okay. 675 00:56:36,140 --> 00:56:43,420 Por kjo ide, ky indeksim, është i njëjtë pavarësisht nëse kjo është një koleksion tradicional 676 00:56:43,420 --> 00:56:48,230 ose në qoftë se kjo është një tregues për diçka ose nëse kjo është një tregues për një grup malloced. 677 00:56:48,230 --> 00:56:59,770 Dhe në fakt, ajo është aq e barabartë se kjo është gjithashtu e njëjta gjë. 678 00:56:59,770 --> 00:57:05,440 Ajo në fakt përkthehet vetëm atë që është brenda e kllapa dhe çfarë ka mbetur nga kllapa, 679 00:57:05,440 --> 00:57:07,970 shton ato së bashku, dhe dereferences. 680 00:57:07,970 --> 00:57:14,710 Pra, kjo është po aq e vlefshme sa * (s + 3) ose s [3]. 681 00:57:16,210 --> 00:57:22,090 [Student] Mund të keni pointers për të treguar 2-dimensionale vargjeve? 682 00:57:22,090 --> 00:57:27,380 >> Është e vështirë. Tradicionalisht, nr. 683 00:57:27,380 --> 00:57:34,720 Një 2-dimensionale array është vetëm një 1-dimensional array me disa sintaksë përshtatshëm 684 00:57:34,720 --> 00:57:54,110 sepse kur them int x [3] [3], kjo është me të vërtetë vetëm 1 grup me 9 vlerave. 685 00:57:55,500 --> 00:58:03,000 Dhe kështu që kur unë indeksi, përpiluesit e di se çfarë dua të them. 686 00:58:03,000 --> 00:58:13,090 Nëse unë them x [1] [2], ai e di që unë dua të shkoj në rreshtin e dytë, kështu që ajo do të kaloni 3 parë, 687 00:58:13,090 --> 00:58:17,460 dhe pastaj ajo dëshiron Gjëja e dytë në atë, kështu që ajo do të marrë këtë një të tillë. 688 00:58:17,460 --> 00:58:20,480 Por ajo është ende vetëm një e vetme-dimensional array. 689 00:58:20,480 --> 00:58:23,660 Dhe kështu që nëse kam kërkuar për të caktojë një tregues për këtë grup, 690 00:58:23,660 --> 00:58:29,770 Unë do të thoja int * p = x; 691 00:58:29,770 --> 00:58:33,220 Lloji i x është vetëm - 692 00:58:33,220 --> 00:58:38,280 Kjo është lloj i ashpër duke thënë se x pasi ajo është vetëm një simbol dhe kjo nuk është një variabël aktuale, 693 00:58:38,280 --> 00:58:40,140 por kjo është vetëm një * int. 694 00:58:40,140 --> 00:58:44,840 x është vetëm një tregues për fillimin e kësaj. >> [Student] Okay. 695 00:58:44,840 --> 00:58:52,560 Dhe kështu që unë nuk do të jetë në gjendje për të hyrë [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Unë mendoj se ka sintaksë të veçantë për shpalljen një tregues, 697 00:58:58,370 --> 00:59:12,480 diçka qesharake si int (* p [-. diçka absolutisht qesharake që unë nuk e di edhe. 698 00:59:12,480 --> 00:59:17,090 Por ka një sintaksë për shpalljen si pointers me kllapa dhe gjëra. 699 00:59:17,090 --> 00:59:22,960 Ajo nuk mund edhe të ju lejojnë të bëni këtë. 700 00:59:22,960 --> 00:59:26,640 Unë mund të shikojnë prapa në diçka që do të më thoni të vërtetën. 701 00:59:26,640 --> 00:59:34,160 Unë do të shikoni për më vonë, nëse ka një sintaksë për pikë. Por ju nuk do të shihni atë. 702 00:59:34,160 --> 00:59:39,670 Dhe edhe sintaksa është aq arkaik se në qoftë se ju përdorni atë, njerëzit do të habitur. 703 00:59:39,670 --> 00:59:43,540 Vargjeve shumëdimensionale janë mjaft të rralla si ajo është. 704 00:59:43,540 --> 00:59:44,630 Ju pretty much - 705 00:59:44,630 --> 00:59:48,490 E pra, nëse ju jeni duke bërë gjëra matrix se nuk do të jenë të rralla, 706 00:59:48,490 --> 00:59:56,730 por në C ju jeni të rrallë do të jetë duke përdorur vargjeve shumëdimensionale. 707 00:59:57,630 --> 01:00:00,470 Po. >> [Student] Le të thonë se ju keni një koleksion të vërtetë të gjatë. 708 01:00:00,470 --> 01:00:03,900 >> Pra në kujtesë virtuale kjo do të duket të jetë mbi të gjitha të njëpasnjëshme, 709 01:00:03,900 --> 01:00:05,640 si elemente të drejtë tjetër për njëri-tjetrin, 710 01:00:05,640 --> 01:00:08,770 por në kujtesën fizike, do të jetë e mundur që kjo të jetë ndarë? Po >>. 711 01:00:08,770 --> 01:00:16,860 Si punon kujtesës virtuale është vetëm ndan - 712 01:00:19,220 --> 01:00:24,860 Njësia e ndarjes është një faqe, e cila ka tendencë të jetë 4 kilobytes, 713 01:00:24,860 --> 01:00:29,680 dhe kështu kur një proces i thotë, hej, unë dua të përdorni këtë kujtesë, 714 01:00:29,680 --> 01:00:35,970 sistemi operativ do të ndajë atë 4 kilobytes për këtë bllok të vogël të kujtesës. 715 01:00:35,970 --> 01:00:39,100 Edhe në qoftë se ju përdorni vetëm një bajt vetme të vogël në gjithë bllokun e kujtesës, 716 01:00:39,100 --> 01:00:42,850 sistemi operativ do të dhënë atë të plotë 4 kilobytes. 717 01:00:42,850 --> 01:00:49,410 Pra, çfarë do të thotë kjo është që unë mund të ketë - le të thonë se kjo është rafte ime. 718 01:00:49,410 --> 01:00:53,180 Kjo rafte mund të ndahen. Rafte im mund të jetë megabajt dhe megabajt. 719 01:00:53,180 --> 01:00:55,020 Rafte im mund të jetë i madh. 720 01:00:55,020 --> 01:01:00,220 Por rafte vetë duhet të jetë ndarë në faqet individuale, 721 01:01:00,220 --> 01:01:09,010 që nëse ne shikojmë në gjatë këtu, le të thonë se kjo është RAM tonë, 722 01:01:09,010 --> 01:01:16,600 nëse kam 2 gigabajt RAM, kjo është adresa aktuale 0 si bajt 0 RAM tim, 723 01:01:16,600 --> 01:01:22,210 dhe kjo është 2 gigabajt të gjithë rrugën poshtë këtu. 724 01:01:22,210 --> 01:01:27,230 Pra, kjo faqe mund të korrespondojnë me këtë bllok gjatë këtu. 725 01:01:27,230 --> 01:01:29,400 Kjo faqe mund të korrespondojnë me këtë bllok gjatë këtu. 726 01:01:29,400 --> 01:01:31,560 Ky i fundit mund të korrespondojnë me këtë gjatë këtu. 727 01:01:31,560 --> 01:01:35,540 Pra sistemi operativ është i lirë të caktojë kujtesës fizike 728 01:01:35,540 --> 01:01:39,320 për çdo faqe individual arbitrare. 729 01:01:39,320 --> 01:01:46,180 Dhe kjo do të thotë se në qoftë se kjo ndodh kufitare të pushtoj një grup, 730 01:01:46,180 --> 01:01:50,070 një koleksion ndodh të jetë lënë nga kjo dhe e drejta e këtij urdhri të një faqe, 731 01:01:50,070 --> 01:01:54,460 pastaj se array do të jetë i ndarë në kujtesën fizike. 732 01:01:54,460 --> 01:01:59,280 Dhe pastaj kur ju lë programin, kur procesi përfundon, 733 01:01:59,280 --> 01:02:05,690 këto mappings merrni shuar dhe pastaj është e lirë për të përdorur këto blloqe pak për gjëra të tjera. 734 01:02:14,730 --> 01:02:17,410 Më shumë pyetje? 735 01:02:17,410 --> 01:02:19,960 [Student] aritmetike pointer. Oh yeah >>. 736 01:02:19,960 --> 01:02:28,410 Vargjet ishin më të lehtë, por duke kërkuar në diçka si ints, 737 01:02:28,410 --> 01:02:35,000 Pra, përsëri në int x [4]; 738 01:02:35,000 --> 01:02:41,810 Nëse kjo është një grup ose nëse kjo është një tregues për një grup prej 4 malloced integers, 739 01:02:41,810 --> 01:02:47,060 ajo do të trajtohet në të njëjtën mënyrë. 740 01:02:50,590 --> 01:02:53,340 [Student] Pra vargjeve janë në tog? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Vargjeve nuk janë në tog. >> [Student] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ky lloj i array tenton të jetë në rafte 743 01:03:08,320 --> 01:03:12,220 nëse ju shpalli atë në - injorimit variablave globale. Mos përdorni variabla globale. 744 01:03:12,220 --> 01:03:16,280 Brenda një funksion që unë them int x [4]; 745 01:03:16,280 --> 01:03:22,520 Kjo do të krijojë një bllok 4-integer në rafte për këtë koleksion. 746 01:03:22,520 --> 01:03:26,960 Por kjo malloc (4 * sizeof (int)); do të shkojë në tog. 747 01:03:26,960 --> 01:03:31,870 Por pas këtë pikë unë mund të përdorni x dhe p në shumë e shumë të njëjtën mënyrë, 748 01:03:31,870 --> 01:03:36,140 përveç përjashtimeve të kam thënë më parë në lidhje me ju mund të reassign p. 749 01:03:36,140 --> 01:03:40,960 Teknikisht, madhësive të tyre janë disi të ndryshme, por kjo është krejtësisht e parëndësishme. 750 01:03:40,960 --> 01:03:43,310 Ju kurrë nuk fakt përdorin madhësive të tyre. 751 01:03:48,020 --> 01:03:56,810 P unë mund them p [3] = 2; ose x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Ju mund të përdorni ato pikërisht në të njëjtën mënyrë. 753 01:03:59,680 --> 01:04:01,570 Pra aritmetike treguesin tani - Po. 754 01:04:01,570 --> 01:04:07,390 [Student] A nuk keni për të bërë p * nëse keni kllapa? 755 01:04:07,390 --> 01:04:11,720 Kllapa janë një dereference nënkuptuar. Mirë >>. 756 01:04:11,720 --> 01:04:20,200 Në fakt, edhe atë që ju jeni duke thënë se me të ju mund të merrni vargjeve shumëdimensionale 757 01:04:20,200 --> 01:05:02,650 me pointers, çfarë mund të bëni ju është diçka si, le të themi, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Unë vetëm do të shkruaj të gjitha nga e para. 759 01:05:37,880 --> 01:05:41,020 Unë nuk dua që një të tillë. 760 01:05:41,020 --> 01:05:42,550 Rregull. 761 01:05:42,550 --> 01:05:48,910 Çfarë kam bërë këtu është - Kjo duhet të jetë pp [i]. 762 01:05:48,910 --> 01:05:53,680 Kështu pp është një akrep tek një pointer. 763 01:05:53,680 --> 01:06:02,420 Ju jeni mallocing pp të tregojnë për një grup prej 5 yje të mundshëm Int. 764 01:06:02,420 --> 01:06:10,950 Pra, në kujtim të keni në fq rafte 765 01:06:10,950 --> 01:06:20,150 Ajo do të tregojnë për një grup prej 5 blloqe të cilat janë të gjitha vetë pointers. 766 01:06:20,150 --> 01:06:28,210 Dhe atëherë kur unë malloc këtu poshtë, unë malloc se secili prej këtyre pointers individuale 767 01:06:28,210 --> 01:06:32,080 duhet të tregojnë për një bllok të veçantë prej 4 bytes në tog. 768 01:06:32,080 --> 01:06:35,870 Pra, kjo tregon për 4 bytes. 769 01:06:37,940 --> 01:06:40,660 Dhe kjo në një pikë të ndryshme 4 bytes. 770 01:06:40,660 --> 01:06:43,200 >> Dhe të gjithë ata tregojnë për të tyre 4 bytes. 771 01:06:43,200 --> 01:06:49,080 Kjo më jep një mënyrë për të bërë gjëra shumëdimensionale. 772 01:06:49,080 --> 01:06:58,030 Unë mund të them f [3] [4], por tani kjo nuk është e njëjta gjë si vargjeve shumëdimensionale 773 01:06:58,030 --> 01:07:05,390 sepse vargjeve shumëdimensionale është përkthyer [3] [4] në një të vetme kompensuar në x grup. 774 01:07:05,390 --> 01:07:14,790 Kjo p dereferences, accesses indeksin e tretë, atëherë dereferences se 775 01:07:14,790 --> 01:07:20,790 dhe accesses - 4 do të jetë i pavlefshëm - indeksi i dytë. 776 01:07:24,770 --> 01:07:31,430 Ndërsa kur kemi pasur int x [3] [4] para se si një grup shumëdimensional 777 01:07:31,430 --> 01:07:35,740 dhe kur ju të dyfishtë kllapa është me të vërtetë vetëm një dereference vetme, 778 01:07:35,740 --> 01:07:40,490 ju jeni pas një tregues të vetëm dhe pastaj një kompensuar, 779 01:07:40,490 --> 01:07:42,850 kjo është me të vërtetë referenca 2D. 780 01:07:42,850 --> 01:07:45,840 Ju do të ndiqni 2 pointers të veçanta. 781 01:07:45,840 --> 01:07:50,420 Pra, kjo gjithashtu teknikisht ju lejon të keni vargjeve shumëdimensionale 782 01:07:50,420 --> 01:07:53,550 ku secili grup individ është të madhësive të ndryshme. 783 01:07:53,550 --> 01:07:58,000 Kështu që unë mendoj se vargjeve shumëdimensionale dehur është ajo që quhet 784 01:07:58,000 --> 01:08:01,870 që me të vërtetë gjëja e parë që mund të tregojnë për diçka që ka 10 elemente, 785 01:08:01,870 --> 01:08:05,540 Gjëja e dytë që mund të tregojnë për diçka që ka 100 elemente. 786 01:08:05,540 --> 01:08:10,790 [Student] A ka ndonjë kufizim për numrin e pointers ju mund të keni 787 01:08:10,790 --> 01:08:14,290 duke treguar për pointers të tjera? Nr >> 788 01:08:14,290 --> 01:08:17,010 Ju mund të keni int ***** p. 789 01:08:18,050 --> 01:08:23,760 Kthehu tek aritmetike akrep - >> [Student] Oh. Po >>. 790 01:08:23,760 --> 01:08:35,649 [Student] Nëse unë kam int *** p dhe pastaj të bëj një dereferencing dhe unë them * p është e barabartë me vlerën e kësaj, 791 01:08:35,649 --> 01:08:39,560 është ajo vetëm do të bëjë 1 nivelin e dereferencing? Po >>. 792 01:08:39,560 --> 01:08:43,340 Pra, nëse unë dua të hyj në gjë që treguesin e fundit është vënë në - 793 01:08:43,340 --> 01:08:46,210 Pastaj ju bëni p ***. Mirë >>. 794 01:08:46,210 --> 01:08:54,080 Pra, kjo është pika p deri në 1 bllok, pikë për një bllok, një tjetër pikë për të bllokut. 795 01:08:54,080 --> 01:09:02,010 Pastaj në qoftë se ju bëni * p = diçka tjetër, atëherë ju jeni duke ndryshuar këtë 796 01:09:02,010 --> 01:09:13,640 tani tregojnë për një bllok të ndryshme. Mirë >>. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Dhe në qoftë se këto ishin malloced, atëherë ju keni rrjedhur tani kujtesë 798 01:09:17,649 --> 01:09:20,430 nëse ju ndodh që të ketë referenca të ndryshme të këtyre 799 01:09:20,430 --> 01:09:25,270 që ju nuk mund të kthehet në ato ato që ju vetëm hodhën larg. 800 01:09:25,270 --> 01:09:29,550 Aritmetike pointer. 801 01:09:29,550 --> 01:09:36,310 int x [4]; do të ndajë një rrjet të integers 4 802 01:09:36,310 --> 01:09:40,670 ku x është duke shkuar për pikë në fillim të array. 803 01:09:40,670 --> 01:09:50,420 Pra, kur them diçka si x [1], unë dua që ajo të thotë të shkojnë në numër të plotë dytë në grup, 804 01:09:50,420 --> 01:09:53,319 i cili do të jetë ky një. 805 01:09:53,319 --> 01:10:04,190 Por me të vërtetë, kjo është 4 bytes në grup pasi kjo integer merr 4 bytes. 806 01:10:04,190 --> 01:10:08,470 Kështu që një kompensuar nga 1 të vërtetë nënkupton një kompensuar nga 1 807 01:10:08,470 --> 01:10:12,030 herë madhësia e çfarëdo lloji i array është. 808 01:10:12,030 --> 01:10:17,170 Ky është një grup i integers, kështu që ajo di të bëjë 1 herë madhësinë e int kur ajo dëshiron për të kompensuar. 809 01:10:17,170 --> 01:10:25,260 Sintaksa tjera. Mos harroni se kjo është ekuivalente me * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kur them treguesin + 1, ajo që kthehet është adresa që treguesin është ruajtur 811 01:10:35,250 --> 01:10:40,360 plus 1 herë madhësia e llojit të akrep. 812 01:10:40,360 --> 01:10:59,510 Pra, nëse x = ox100, pastaj x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Dhe ju mund të abuzojnë me këtë dhe thonë diçka si char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 dhe tani c do të jetë adresa e njëjtë si x. 815 01:11:23,050 --> 01:11:26,040 c do të jetë e barabartë me ox100, 816 01:11:26,040 --> 01:11:31,490 por c + 1 do të jetë e barabartë me ox101 817 01:11:31,490 --> 01:11:38,030 pasi aritmetike tregues varet nga lloji i treguesin që ju janë shtuar për të. 818 01:11:38,030 --> 01:11:45,390 Pra, c + 1, ajo duket në c, kjo është një tregues char, kështu që ajo do të shtojë 1 herë madhësinë e shkrumb, 819 01:11:45,390 --> 01:11:48,110 e cila është gjithmonë do të jetë 1, kështu që ju të merrni 101, 820 01:11:48,110 --> 01:11:54,890 ndërsa nëse unë bëj x, e cila është gjithashtu ende 100, x + 1 do të jetë 104. 821 01:11:56,660 --> 01:12:06,340 [Student] Mund të përdorni C + +, në mënyrë për të përparuar treguesin tuaj me 1? 822 01:12:06,340 --> 01:12:09,810 Po, mundeni. 823 01:12:09,810 --> 01:12:16,180 Ju nuk mund të bëjë që me x x, sepse është vetëm një simbol, kjo është një konstante, ju nuk mund të ndryshoni x. 824 01:12:16,180 --> 01:12:22,610 >> Por c ndodh të jetë vetëm një tregues, në mënyrë c + + është krejtësisht i vlefshëm dhe ai do të rritje deri në 1. 825 01:12:22,610 --> 01:12:32,440 Në qoftë se c ishin vetëm një int *, pastaj c + + do të jetë 104. 826 01:12:32,440 --> 01:12:41,250 + + Nuk aritmetike pointer ashtu si c + 1 do të ketë bërë aritmetikë akrep. 827 01:12:43,000 --> 01:12:48,870 Kjo është në fakt si një shumë gjëra të tilla si lloj Merge - 828 01:12:49,670 --> 01:12:55,710 Në vend të krijuar kopje të gjëra, ju mund të kalojë në vend - 829 01:12:55,710 --> 01:13:02,400 Ashtu si në qoftë se unë të kërkuar për të kaluar këtë gjysmën e grup - le të fshijë disa nga këtë. 830 01:13:04,770 --> 01:13:10,520 Le të thonë se unë të kërkuar për të kaluar këtë anë të grup në një funksion. 831 01:13:10,520 --> 01:13:12,700 Çfarë do që unë të kalojë në atë funksion? 832 01:13:12,700 --> 01:13:17,050 Nëse unë të kalojë X, unë jam duke kaluar këtë adresë. 833 01:13:17,050 --> 01:13:23,780 Por unë dua që të kalojë këtë adresë të veçantë. Pra, çfarë duhet të kalojë? 834 01:13:23,780 --> 01:13:26,590 [Student] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Pra, x + 2. Po. 836 01:13:29,350 --> 01:13:31,620 Kjo do të jetë në këtë adresë. 837 01:13:31,620 --> 01:13:42,810 Ju gjithashtu shumë shpesh e shohin atë si x [2] dhe pastaj adresën e se. 838 01:13:42,810 --> 01:13:47,850 Kështu që ju duhet për të marrë adresën e saj, sepse është një parantezë dereference nënkuptuar. 839 01:13:47,850 --> 01:13:53,250 x [2] i referohet vlerës që është në këtë kuti, dhe pastaj ju doni adresën e atë kuti, 840 01:13:53,250 --> 01:13:56,850 kështu që ju thoni dhe x [2]. 841 01:13:56,850 --> 01:14:02,880 Pra, kjo është se si diçka në lloj bashkojë ku ju doni të kalojë gjysmë listën për diçka 842 01:14:02,880 --> 01:14:08,790 ju me të vërtetë vetëm të kalojë & x [2], dhe tani sa i përket thirrjes rekursive është i shqetësuar, 843 01:14:08,790 --> 01:14:12,510 array ime e re fillon atje. 844 01:14:12,510 --> 01:14:15,130 Pyetjet minutën e fundit. 845 01:14:15,130 --> 01:14:20,050 [Student] Nëse ne nuk e vënë një simbol apo - çfarë është ajo quhet? Star >>? 846 01:14:20,050 --> 01:14:23,200 [Student] Star. Teknikisht >>, operatori dereference, por - >> [Student] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Nëse ne nuk e vënë një yll apo një simbol, çfarë ndodh në qoftë se unë them vetëm y = x dhe x është një akrep? 848 01:14:29,310 --> 01:14:34,620 Çfarë është lloji i y? >> [Student] Unë do të them vetëm tregues ajo e 2. 849 01:14:34,620 --> 01:14:38,270 Pra, nëse ju vetëm thoni y = x, tani x dhe y pika të njëjtën gjë. >> [Student] Pika të njëjtën gjë. 850 01:14:38,270 --> 01:14:45,180 Dhe në qoftë se x është një tregues int? Kjo do të ankohen >> sepse ju nuk mund të caktoni pointers. 851 01:14:45,180 --> 01:14:46,540 [Student] Okay. 852 01:14:46,540 --> 01:14:51,860 Mos harroni se pointers, edhe pse ne të tërheqë ata si shigjeta, 853 01:14:51,860 --> 01:15:02,010 të gjithë ata me të vërtetë dyqan - int * x - x vërtetë të gjithë është magazinimin është diçka si ox100, 854 01:15:02,010 --> 01:15:06,490 që ne të ndodhë për të përfaqësuar si duke treguar për të bllokut të ruajtura në 100. 855 01:15:06,490 --> 01:15:19,660 Kështu që kur unë them int * y = x, unë jam vetëm kopjimi ox100 në y, 856 01:15:19,660 --> 01:15:24,630 të cilat ne jemi vetëm duke shkuar për të përfaqësuar si y, gjithashtu duke treguar ox100. 857 01:15:24,630 --> 01:15:39,810 Dhe në qoftë se unë them int i = (int) x, atëherë unë do të ruajtur çdo gjë që është vlera e ox100 858 01:15:39,810 --> 01:15:45,100 në brendësi të tij, por tani ajo do të interpretohet si një numër të plotë në vend të një akrep. 859 01:15:45,100 --> 01:15:49,310 Por ju duhet të hedhura apo tjetër ajo do të ankohen. 860 01:15:49,310 --> 01:15:53,300 [Student] Pra, do të thotë për të hedhur - 861 01:15:53,300 --> 01:16:00,290 Është ajo do të hedh int x, ose e hedh int y te? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Çfarë? 863 01:16:03,700 --> 01:16:07,690 [Student] Okay. Pas këtyre kllapa është atje do të jetë një x apo ay aty? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Ose. x dhe y janë ekuivalente. >> [Student] Okay. 865 01:16:11,500 --> 01:16:14,390 Sepse ata janë të dy pointers. Po >>. 866 01:16:14,390 --> 01:16:21,050 [Student] Pra, kjo do të ruajë 100 hexadecimal në formë integer? >> [Bowden] Yeah. 867 01:16:21,050 --> 01:16:23,620 Por jo vlera e çfarëdo qoftë ajo tregon. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Yeah. >> [Student] Pra, vetëm adresa në formë integer. Rregull. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Nëse ju të kërkuar për të për disa arsye të çuditshme, 870 01:16:34,720 --> 01:16:38,900 ju mund vetëm të merren me pointers dhe kurrë nuk merren me integers 871 01:16:38,900 --> 01:16:49,240 dhe vetëm të jetë si int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Pastaj ju jeni do të merrni hutuar me të vërtetë dikur aritmetike pointer fillon ndodh. 873 01:16:53,000 --> 01:16:56,570 Pra, numri që ata dyqan janë të pakuptimta. 874 01:16:56,570 --> 01:16:58,940 Kjo është vetëm se si ju deri në fund interpretimit të tyre. 875 01:16:58,940 --> 01:17:02,920 Kështu që unë jam i lirë të kopjoni ox100 nga një int * në një int, 876 01:17:02,920 --> 01:17:07,790 dhe unë jam i lirë të caktojë - you're ndoshta do të merrni yelled at për të mos hedh - 877 01:17:07,790 --> 01:17:18,160 Unë jam i lirë të caktojë diçka si (int *) ox1234 në këtë int * arbitrare. 878 01:17:18,160 --> 01:17:25,480 Pra ox123 është vetëm si një adresë e vlefshme memorie si është dhe y. 879 01:17:25,480 --> 01:17:32,060 Dhe y ndodh të kthehen diçka që është shumë e shumë ox123. 880 01:17:32,060 --> 01:17:35,430 [Student] A do që të jetë një mënyrë për të vërtetë të ftohtë, për të shkuar nga heksadecimal në formë decimale, 881 01:17:35,430 --> 01:17:39,230 si në qoftë se ju keni një tregues dhe ju hedhin atë si një int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Ju mund të vërtetë vetëm të shtypura duke përdorur si printf. 883 01:17:44,860 --> 01:17:50,300 Le të thonë se unë kam int y = 100. 884 01:17:50,300 --> 01:18:02,700 Pra printf (% d \ n - si ju duhet të dini - se si të shtypura një numër të plotë, x%. 885 01:18:02,700 --> 01:18:05,190 Ne vetëm do të shtypura atë si heksadecimal. 886 01:18:05,190 --> 01:18:10,760 Pra, një tregues nuk është ruajtur si heksadecimal, 887 01:18:10,760 --> 01:18:12,960 dhe një numër i plotë nuk është ruajtur si decimal. 888 01:18:12,960 --> 01:18:14,700 Gjithçka është e ruajtur si binar. 889 01:18:14,700 --> 01:18:17,950 Është vetëm se ne priren për të treguar si pointers heksadecimal 890 01:18:17,950 --> 01:18:23,260 sepse ne mendojmë gjërat në këto 4-byte blloqe, 891 01:18:23,260 --> 01:18:25,390 dhe adresat e kujtesës priren të jenë të njohur. 892 01:18:25,390 --> 01:18:28,890 Ne jemi si, në qoftë se ajo fillon me BF, atëherë ajo që ndodh të jetë në rafte. 893 01:18:28,890 --> 01:18:35,560 Pra, kjo është vetëm interpretimi ynë i pointers si heksadecimal. 894 01:18:35,560 --> 01:18:39,200 Rregull. Çdo pyetje të fundit? 895 01:18:39,200 --> 01:18:41,700 >> Unë do të jem këtu për një grimë, pasi në qoftë se ju keni asgjë tjetër. 896 01:18:41,700 --> 01:18:46,070 Dhe kjo është fundi i kësaj. 897 01:18:46,070 --> 01:18:48,360 >> [Student] Yay! [Duartrokitje] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]