1 00:00:00,000 --> 00:00:01,110 >> [Speel van musiek] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 David J. Malan Alle regte. 4 00:00:11,650 --> 00:00:15,610 Dit is CS50, en dit is die einde van die week Vier. 5 00:00:15,610 --> 00:00:19,420 En een van die onderwerpe vandag is dié van digitale forensiese, 6 00:00:19,420 --> 00:00:20,989 die kuns van die herstel van inligting. 7 00:00:20,989 --> 00:00:22,780 En inderdaad, selfs al jy in die midde 8 00:00:22,780 --> 00:00:25,070 nou van Vrede by Three en Breakout, volgende week, 9 00:00:25,070 --> 00:00:27,880 Die fokus sal wees op juis hierdie domein. 10 00:00:27,880 --> 00:00:30,686 >> So een van die coolste werk wat ek ooit gehad het, was terug in die nagraadse skool, 11 00:00:30,686 --> 00:00:33,560 toe ek besig was om die plaaslike Middlesex County Distrik Prokureur se 12 00:00:33,560 --> 00:00:34,950 kantoor, doen forensiese werk. 13 00:00:34,950 --> 00:00:37,450 So in wese, die Massachusetts Staat polisie, op die geleentheid, 14 00:00:37,450 --> 00:00:40,100 wanneer op gevalle sou bring in dinge soos hardeskywe 15 00:00:40,100 --> 00:00:42,185 en diskettes en geheue kaarte en dies meer. 16 00:00:42,185 --> 00:00:44,060 En hulle sal hulle oorhandig aan my en my mentor, 17 00:00:44,060 --> 00:00:48,070 en ons doel was om getuienis te vind, As daar enige, op hierdie media. 18 00:00:48,070 --> 00:00:50,700 Nou, kan jy dit gesien het 'n kykie van hierdie wêreld van forensiese 19 00:00:50,700 --> 00:00:53,000 in die media, TV en films. 20 00:00:53,000 --> 00:00:55,730 Maar die werk wat ek gehad het, en daresay daardie wêreld 21 00:00:55,730 --> 00:00:57,550 is nie heeltemal soos jy dit sal sien. 22 00:00:57,550 --> 00:01:00,794 Kom ons neem 'n blik op wat jy het waarskynlik gesien. 23 00:01:00,794 --> 00:01:01,460 [Video speel] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Nou, laat ons kry 'n goeie blik op jou. 26 00:01:05,380 --> 00:01:06,850 >> [Speel van musiek] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Hold Dit. 29 00:01:12,932 --> 00:01:13,657 Begin dit terug. 30 00:01:13,657 --> 00:01:14,733 >> Hoekom mag 'n minuut. 31 00:01:14,733 --> 00:01:15,233 Gaan regs. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Daar. 34 00:01:16,870 --> 00:01:17,369 Vries dit. 35 00:01:17,369 --> 00:01:17,930 -Volledig-skerm. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Vries dit. 38 00:01:18,875 --> 00:01:20,160 -Tighten Op, sal jy? 39 00:01:20,160 --> 00:01:22,126 >> Vector in daardie man deur die agterwiel. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom In reg hier op hierdie plek. 41 00:01:24,435 --> 00:01:28,580 >> -Met die regte toerusting, die beeld kan vergroot word en geslyp. 42 00:01:28,580 --> 00:01:29,330 >> -Wat Is dit? 43 00:01:29,330 --> 00:01:30,780 >> -Dit Is 'n verbetering program. 44 00:01:30,780 --> 00:01:32,170 >> -Kan Jy duidelik dat tot enige? 45 00:01:32,170 --> 00:01:33,070 >> -Ek Weet nie. 46 00:01:33,070 --> 00:01:34,150 Kom ons verbeter dit. 47 00:01:34,150 --> 00:01:35,440 >> Verbeter Artikel A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Ek versterk die detail, and-- 50 00:01:38,562 --> 00:01:40,020 -Ek Dink daar is genoeg om te verbeter. 51 00:01:40,020 --> 00:01:40,976 Stel dit aan my skerm. 52 00:01:40,976 --> 00:01:42,559 >> -Ek Versterk die weerspieëling in haar oë. 53 00:01:42,559 --> 00:01:44,322 -Laat Se loop dit deur video verbetering. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Kan jy dié? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Op. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -I've Werk op die besinning. 58 00:01:49,458 --> 00:01:50,402 >> Hulle vernietig iemand se besinning. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Daar Is 'n weerspieëling van die man se gesig. 61 00:01:52,870 --> 00:01:53,694 >> -Die weerspieëling! 62 00:01:53,694 --> 00:01:54,610 -Daar Is 'n weerspieëling. 63 00:01:54,610 --> 00:01:55,880 -Zoom In die spieël. 64 00:01:55,880 --> 00:01:57,860 Jy kan sien 'n weerspieëling. 65 00:01:57,860 --> 00:01:59,630 >> -Kan Jy verbeter die beeld van hier af? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Kan Jy dit verbeter? 68 00:02:01,210 --> 00:02:02,190 -Kan Jy dit verbeter? 69 00:02:02,190 --> 00:02:03,066 -Kan Ons verbeter dit? 70 00:02:03,066 --> 00:02:03,898 -Kan Jy dit verbeter? 71 00:02:03,898 --> 00:02:04,740 -Hold Op 'n tweede. 72 00:02:04,740 --> 00:02:05,281 Ek sal verbeter. 73 00:02:05,281 --> 00:02:06,470 -Zoom Op die deur. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 -Move In. 77 00:02:08,509 --> 00:02:09,340 -Meer. 78 00:02:09,340 --> 00:02:10,094 Hoekom mag, stop. 79 00:02:10,094 --> 00:02:10,750 -Stop. 80 00:02:10,750 --> 00:02:11,250 -Pause Dit. 81 00:02:11,250 --> 00:02:13,542 -Rotate Ons 75 grade rondom die vertikale, asseblief. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -Stop. 84 00:02:16,127 --> 00:02:19,330 Gaan terug na die gedeelte oor die deur weer. 85 00:02:19,330 --> 00:02:21,420 >> -Got 'N beeld verbete wat bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -Maybe Ons kan gebruik om die Pradeep Singh metode om te sien in die vensters. 87 00:02:24,420 --> 00:02:25,902 >> -Die sagteware is die staat van die kuns. 88 00:02:25,902 --> 00:02:26,866 >> -Die eiewaarde af. 89 00:02:26,866 --> 00:02:29,758 >> -Met die regte kombinasie van algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> -He Se geneem verligting algoritmes na die volgende vlak, 91 00:02:32,168 --> 00:02:34,110 en ek kan gebruik om hulle te verbeter die foto. 92 00:02:34,110 --> 00:02:36,840 >> -Lock Op en vergroot die z-as. 93 00:02:36,840 --> 00:02:37,351 >> Verbeter. 94 00:02:37,351 --> 00:02:37,850 Verbeter. 95 00:02:37,850 --> 00:02:38,720 Verbeter. 96 00:02:38,720 --> 00:02:40,070 -Freeze En te verbeter. 97 00:02:40,070 --> 00:02:43,420 [Einde video speel] 98 00:02:43,420 --> 00:02:45,830 David J. Malan So dit is al die woorde, maar hulle was nie 99 00:02:45,830 --> 00:02:47,870 gebruik in sinne korrek. 100 00:02:47,870 --> 00:02:52,370 En inderdaad in die toekoms, enige tyd, asseblief, jy hoor iemand sê die woord, 101 00:02:52,370 --> 00:02:54,250 "Verbeter," giggel net 'n bietjie. 102 00:02:54,250 --> 00:02:57,190 Want wanneer jy probeer om te verbeter, byvoorbeeld, dit is wat gebeur. 103 00:02:57,190 --> 00:02:58,580 >> So hier is 'n pragtige foto. 104 00:02:58,580 --> 00:02:59,720 Dit is CS50 se eie Daven. 105 00:02:59,720 --> 00:03:03,740 En veronderstel dat ons wou fokus op die vonkel in sy oog, 106 00:03:03,740 --> 00:03:05,870 of die weerspieëling van die slegte ou wat duidelik 107 00:03:05,870 --> 00:03:07,820 gevang deur die sekuriteit kamera. 108 00:03:07,820 --> 00:03:10,330 Dit is wat gebeur wanneer jy zoom in op 'n beeld wat 109 00:03:10,330 --> 00:03:14,060 het slegs 'n beperkte aantal bisse wat verband hou met dit. 110 00:03:14,060 --> 00:03:15,420 >> Dit is wat jy sou kry. 111 00:03:15,420 --> 00:03:19,190 En inderdaad, in Daven se oog is maar vier, miskien ses pixels 112 00:03:19,190 --> 00:03:22,110 wat komponeer presies wat is daar flikkering. 113 00:03:22,110 --> 00:03:25,890 So Probleem Stel Vier uiteindelik sal jy verken die wêreld, veral 114 00:03:25,890 --> 00:03:28,090 deur die aard van iets ons noem lêer I / O, waar 115 00:03:28,090 --> 00:03:31,000 i / o is net 'n fancy manier sê toevoer en afvoer. 116 00:03:31,000 --> 00:03:34,280 >> So tot dusver al die interaksies ons met 'n rekenaar gehad het 117 00:03:34,280 --> 00:03:36,770 het grootliks met jou klawerbord en die skerm, 118 00:03:36,770 --> 00:03:40,770 maar nie so baie met die hardeskyf, of spaar van lêers buite die mense wat jy 119 00:03:40,770 --> 00:03:41,620 jouself skryf. 120 00:03:41,620 --> 00:03:44,570 Jou programme dusver het nie skep en spaar, 121 00:03:44,570 --> 00:03:46,270 en afhangende van hul eie lêers. 122 00:03:46,270 --> 00:03:47,150 >> Wel, wat is 'n lêer? 123 00:03:47,150 --> 00:03:48,105 Wel, iets soos 'n JPEG. 124 00:03:48,105 --> 00:03:50,520 Dit is 'n beeld wat jy mag het of oplaai na Facebook, 125 00:03:50,520 --> 00:03:51,690 of sien op enige plek op die web. 126 00:03:51,690 --> 00:03:54,460 Trouens, die foto het ons net saag van Daven was 'n JPEG. 127 00:03:54,460 --> 00:03:57,570 En wat is interessant oor lêers soos JPEG 128 00:03:57,570 --> 00:04:02,170 is dat hulle geïdentifiseer kan word, Tipies, deur sekere patrone van stukkies. 129 00:04:02,170 --> 00:04:05,200 >> Met ander woorde, wat is dit wat onderskei 'n JPEG van 'n GIF 130 00:04:05,200 --> 00:04:08,109 van 'n PING van 'n Woord dokument van 'n Excel-lêer? 131 00:04:08,109 --> 00:04:09,900 Wel, dit is net verskillende patrone van stukkies. 132 00:04:09,900 --> 00:04:12,820 En die verskillende patrone is gewoonlik aan die begin van die lêers. 133 00:04:12,820 --> 00:04:18,200 >> Sodat wanneer jou rekenaar 'n Woord oopmaak Doc, of wanneer 'n rekenaar 'n JPEG oopmaak, 134 00:04:18,200 --> 00:04:20,940 dit lyk tipies by die eerste paar stukkies in die lêer. 135 00:04:20,940 --> 00:04:24,059 En as dit erken 'n patroon, dit sê, o, dit is 'n beeld. 136 00:04:24,059 --> 00:04:25,850 Laat my vertoon dit te die gebruiker as 'n grafiese. 137 00:04:25,850 --> 00:04:27,870 Of, o, dit lyk soos 'n Word doc. 138 00:04:27,870 --> 00:04:30,480 Laat my toe om dit vir die gebruiker as 'n opstel. 139 00:04:30,480 --> 00:04:33,020 >> So byvoorbeeld, JPEG, dit blyk, is 140 00:04:33,020 --> 00:04:35,460 redelik gesofistikeerde onder die enjinkap. 141 00:04:35,460 --> 00:04:40,140 Maar die eerste drie grepe in die meeste elke JPEG begin met hierdie drie nommers. 142 00:04:40,140 --> 00:04:44,680 So byte nul, een, en twee is, in die meeste elke JPEG, 255, dan is die aantal 143 00:04:44,680 --> 00:04:46,675 216, dan is die getal 255. 144 00:04:46,675 --> 00:04:48,990 >> En wat sal jy in staat wees om om te begin doen volgende week 145 00:04:48,990 --> 00:04:52,920 is eintlik skeer onder die kap van lêers soos JPEG 146 00:04:52,920 --> 00:04:57,210 en soos bitmap lêers, en sien wat altyd daar vir so lank 147 00:04:57,210 --> 00:04:58,650 as jy het al met behulp van 'n rekenaar. 148 00:04:58,650 --> 00:05:01,860 >> Maar wat is daar gewoonlik nie geskryf soos desimale getalle soos hierdie. 149 00:05:01,860 --> 00:05:04,620 Rekenaar wetenskaplikes doen nie geneig om te praat in desimaal. 150 00:05:04,620 --> 00:05:06,139 Hulle het nie regtig praat nie in binêre. 151 00:05:06,139 --> 00:05:07,930 Tipies, wanneer ons wil getalle uit te druk, 152 00:05:07,930 --> 00:05:10,710 ons eintlik gebruik heksadesimale, wat jy kan onthou 153 00:05:10,710 --> 00:05:13,027 van, sê, Probleem Stel Een, wat uitgedaag 154 00:05:13,027 --> 00:05:14,610 om te dink oor 'n ander stelsel. 155 00:05:14,610 --> 00:05:17,170 >> Ons, natuurlik, is bekend met desimale, zero deur nege. 156 00:05:17,170 --> 00:05:18,215 Ons het gepraat oor binêre. 157 00:05:18,215 --> 00:05:20,710 En ons het nie regtig om dit te gebruik veel hier 158 00:05:20,710 --> 00:05:22,470 uit, want rekenaars sal gebruik nie. 159 00:05:22,470 --> 00:05:24,900 Maar programmeerders sal baie dikwels, maar nie altyd nie, 160 00:05:24,900 --> 00:05:29,360 gebruik heksadesimale, wat net beteken jy het 16 letters in jou alfabet, 161 00:05:29,360 --> 00:05:31,330 teenoor twee of 10. 162 00:05:31,330 --> 00:05:34,530 >> So hoe reken jy na hoër as nege in heksadesimaal? 163 00:05:34,530 --> 00:05:41,120 Jy gaan van 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, net deur konvensie. 164 00:05:41,120 --> 00:05:43,540 Maar wat is die sleutel is dat elke hierdie is 'n enkele simbool. 165 00:05:43,540 --> 00:05:44,340 Daar is geen 10. 166 00:05:44,340 --> 00:05:48,400 Daar is geen 11 per se nie, want elke van jou syfers, net soos in desimale 167 00:05:48,400 --> 00:05:51,940 en net soos in binêre, moet net 'n enkele karakter, deur konvensie. 168 00:05:51,940 --> 00:05:55,280 >> So, wat dan is die alfabet ons het tot ons beskikking vir heksadesimaal. 169 00:05:55,280 --> 00:05:58,600 So, wat nie 'n JPEG lyk as jy was daardie eerste drie uit te skryf 170 00:05:58,600 --> 00:06:01,980 grepe nie as desimale maar byvoorbeeld as heksadesimale? 171 00:06:01,980 --> 00:06:03,640 En hoekom is Hex al wat nuttig? 172 00:06:03,640 --> 00:06:05,290 >> Wel, 'n vinnige blik op 'n voorbeeld. 173 00:06:05,290 --> 00:06:09,030 So as ek skryf uit die stukkies wat stel hierdie desimale numbers-- 174 00:06:09,030 --> 00:06:12,450 hierdie dalk 'n bietjie verroes wees nou van 'n paar weke terug, 175 00:06:12,450 --> 00:06:14,820 maar die linker een en regte een is redelik maklik. 176 00:06:14,820 --> 00:06:17,990 255 was die grootste getal wat ons kon stel met agt stukkies. 177 00:06:17,990 --> 00:06:18,820 Dit was al kinders. 178 00:06:18,820 --> 00:06:21,320 Dus is die enigste een wat effens interessant is, is die middelste een. 179 00:06:21,320 --> 00:06:24,700 En as jy soort van doen uit die wiskunde, sal jy aflei dat, wel, 180 00:06:24,700 --> 00:06:27,949 dat patroon van een en nulle verteenwoordig 216. 181 00:06:27,949 --> 00:06:30,240 So laat ons net bepaal vir nou dat dit korrek is. 182 00:06:30,240 --> 00:06:31,730 Maar hoekom is dit interessant? 183 00:06:31,730 --> 00:06:33,970 >> Wel, 'n greep, natuurlik, is agt stukkies. 184 00:06:33,970 --> 00:06:38,980 En dit blyk dat as jy dink van 'n greep as twee stukke van vier stukkies, 185 00:06:38,980 --> 00:06:39,500 soos hierdie. 186 00:06:39,500 --> 00:06:41,000 Laat my net 'n bietjie ruimte. 187 00:06:41,000 --> 00:06:42,550 So voor, na. 188 00:06:42,550 --> 00:06:46,520 Ek het net bygevoeg 'n paar wit spasie ter wille van hier visualisering se. 189 00:06:46,520 --> 00:06:51,840 Hoe kan ons nou in te stel, sê, heksadesimale elke quad van stukkies, 190 00:06:51,840 --> 00:06:52,880 elke stel van vier stukkies? 191 00:06:52,880 --> 00:06:56,420 >> So byvoorbeeld, aan die linkerkant Nou, ons het 1111 in die program nie. 192 00:06:56,420 --> 00:07:00,420 Wat is dat die getal in desimale, As jy dit doen uit die wiskunde? 193 00:07:00,420 --> 00:07:03,780 Jy het die mense plek, die twee-twee plek, die viere plek, en die agts plek. 194 00:07:03,780 --> 00:07:04,341 >> Publiek: 15. 195 00:07:04,341 --> 00:07:05,340 David J. MALAN: Dit is 15. 196 00:07:05,340 --> 00:07:08,340 So as ons dit doen agt plus vier plus twee plus een, kry ons 15. 197 00:07:08,340 --> 00:07:11,790 So kan ek hier neer te skryf 15 1111, maar die hele punt hier 198 00:07:11,790 --> 00:07:13,190 is heksadesimaal, nie desimaal. 199 00:07:13,190 --> 00:07:17,310 So in plaas van af te skryf 15, 1-5, Ek is van plan om dit te skryf in blok is, 200 00:07:17,310 --> 00:07:22,311 wat as jy dink terug, as jy ' zero deur f, wat 15 gaan wees? 201 00:07:22,311 --> 00:07:22,810 Publiek: f. 202 00:07:22,810 --> 00:07:24,434 David J. Malan So dit blyk dit se f. 203 00:07:24,434 --> 00:07:29,140 En jy kan uitwerk wat deur te sê, Wel, as 'n 10, dan is OK, f is 15. 204 00:07:29,140 --> 00:07:33,250 So ja, kan ons herskryf dieselfde stel van die nommers as f f. 205 00:07:33,250 --> 00:07:35,750 En dan as ons 'n bietjie van wiskunde, ons sal aflei dat dit is d. 206 00:07:35,750 --> 00:07:38,650 Agt is redelik maklik nie, want ons het 'n mens in die agts plek. 207 00:07:38,650 --> 00:07:40,620 En dan het ons nog 'n paar f f se. 208 00:07:40,620 --> 00:07:44,669 >> So, wat mense geneig is om te doen deur die konvensie wanneer hulle heksadesimaal is hulle net 209 00:07:44,669 --> 00:07:47,710 skryf dit 'n bietjie meer saaklik, ontslae te raak van die meeste van die wit spasie. 210 00:07:47,710 --> 00:07:50,890 En net super duidelik te wees lesers dat dit heksadesimaal, 211 00:07:50,890 --> 00:07:54,670 die eenvoudige konvensie onder mens is jy nul skryf 212 00:07:54,670 --> 00:07:58,000 x, wat geen betekenis ander as 'n visuele identifikasie van, 213 00:07:58,000 --> 00:07:59,590 hier kom 'n blok is nommer. 214 00:07:59,590 --> 00:08:04,210 >> En dan, jy sit die twee syfers f f in hierdie geval is, dan d a, dan is f f. 215 00:08:04,210 --> 00:08:06,700 So lang storie kort, heksadesimale net geneig 216 00:08:06,700 --> 00:08:11,990 nuttig te wees, want elkeen van sy syfers, zero deur f, perfek lyne 217 00:08:11,990 --> 00:08:13,880 met 'n patroon van vier stukkies. 218 00:08:13,880 --> 00:08:18,080 >> So as jy twee heksadesimale syfers, zero deur F, weer en weer, 219 00:08:18,080 --> 00:08:20,256 wat gee jou volkome agt stukkies of een byte. 220 00:08:20,256 --> 00:08:22,380 So dit is waarom dit is geneig om te wees konvensionele nuttig. 221 00:08:22,380 --> 00:08:24,990 Daar is geen intellektuele inhoud regtig verder as dit, 222 00:08:24,990 --> 00:08:27,010 anders as die werklike nut. 223 00:08:27,010 --> 00:08:29,310 >> Nou JPEG is nie die enigste Lêerformaat vir grafiese. 224 00:08:29,310 --> 00:08:33,230 Jy sal onthou dat daar lêers soos dié in die wêreld, 225 00:08:33,230 --> 00:08:34,830 ten minste 'n paar jaar terug. 226 00:08:34,830 --> 00:08:37,580 >> So dit was eintlik geïnstalleer in Windows XP 227 00:08:37,580 --> 00:08:39,960 op miljoene rekenaars regoor die wêreld. 228 00:08:39,960 --> 00:08:43,000 En dit was 'n bitmap lêer, BMP. 229 00:08:43,000 --> 00:08:47,690 En 'n bitmap lêer, as jy die volgende sien week, beteken net 'n patroon van punte, 230 00:08:47,690 --> 00:08:51,710 pixels as hulle geroep het, 'n kaart op stukkies, regtig. 231 00:08:51,710 --> 00:08:55,160 >> So, wat is interessant, al is, oor hierdie formaat, BMP, is 232 00:08:55,160 --> 00:08:58,590 dat onder die enjinkap, dit het meer as net drie grepe 233 00:08:58,590 --> 00:09:01,020 dat sy kop komponeer, so te spreek, het die eerste paar byt. 234 00:09:01,020 --> 00:09:03,330 Dit lyk eintlik 'n bietjie ingewikkeld met die eerste oogopslag. 235 00:09:03,330 --> 00:09:04,704 En jy sal sien dit in die P stel. 236 00:09:04,704 --> 00:09:06,810 En om iets veral uit die nou 237 00:09:06,810 --> 00:09:10,720 is nie so belangrik nie, as net die feit wat aan die begin van elke bitmap 238 00:09:10,720 --> 00:09:13,823 lêer, 'n grafiese formaat, Daar is 'n hele klomp van die nommers. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nou Microsoft, die skrywer van hierdie formaat, 241 00:09:16,720 --> 00:09:18,820 geneig diegene te roep dinge nie ints en karakters 242 00:09:18,820 --> 00:09:22,259 en dryf, maar woorde en d woorde en verlang en grepe. 243 00:09:22,259 --> 00:09:23,800 So hulle is net verskillende datatipes. 244 00:09:23,800 --> 00:09:25,170 Hulle is verskillende name vir dieselfde ding. 245 00:09:25,170 --> 00:09:26,740 Maar jy sal sien dat in P Stel Vier. 246 00:09:26,740 --> 00:09:31,450 >> Maar dit is net om te sê dat as 'n mens dubbel-kliek 'n paar .BMP lêer op sy 247 00:09:31,450 --> 00:09:35,015 of haar hardeskyf, en 'n venster oop up wat hom of haar dat die beeld, 248 00:09:35,015 --> 00:09:38,500 wat gebeur het, omdat die bedryfstelsel stelsel vermoedelik opgemerk nie net 249 00:09:38,500 --> 00:09:41,460 die .BMP lêer uitbreiding in die naam, 250 00:09:41,460 --> 00:09:45,010 maar ook die feit dat daar is 'n paar konvensie na die patroon van stukkies 251 00:09:45,010 --> 00:09:47,490 aan die begin van daardie bitmap lêer. 252 00:09:47,490 --> 00:09:50,270 >> Maar laat ons nou fokus op so 'n ingewikkelde lêer, 253 00:09:50,270 --> 00:09:52,120 maar op iets soos hierdie. 254 00:09:52,120 --> 00:09:55,190 Veronderstel hier in gedit, ek net die begin 255 00:09:55,190 --> 00:09:57,070 van 'n program wat is redelik maklik. 256 00:09:57,070 --> 00:09:58,860 Ek het 'n paar sluit tot bo-op. 257 00:09:58,860 --> 00:10:02,120 Nou het ek include "structs.h", maar Ek sal terug kom in 'n oomblik. 258 00:10:02,120 --> 00:10:03,974 Maar dit is nuttig vir nou. 259 00:10:03,974 --> 00:10:05,890 So dit is 'n program wat gaan om te implementeer 260 00:10:05,890 --> 00:10:07,335 soos die registrateur se databasis. 261 00:10:07,335 --> 00:10:09,710 So 'n databasis van studente, en elke student in die wêreld 262 00:10:09,710 --> 00:10:13,190 het 'n naam en 'n huis en waarskynlik 'n paar ander dinge, maar ons sal dit eenvoudig hou. 263 00:10:13,190 --> 00:10:15,140 Elke student het 'n naam en 'n huis. 264 00:10:15,140 --> 00:10:17,700 >> So as ek wou 'n te skryf program wie se doel in die lewe 265 00:10:17,700 --> 00:10:19,860 was net te Itereer van nul tot drie, 266 00:10:19,860 --> 00:10:22,070 As daar is drie studente aan die Harvard Universiteit. 267 00:10:22,070 --> 00:10:25,350 En ek wil net te kry, met behulp van GetString, elke student se naam en huis 268 00:10:25,350 --> 00:10:26,600 en dan net druk diegene wat nie. 269 00:10:26,600 --> 00:10:28,630 >> Dit is soort van soos Week Een, Week Twee dinge nou, 270 00:10:28,630 --> 00:10:30,810 waar ek wil net 'n vir lus of iets soos dit. 271 00:10:30,810 --> 00:10:34,500 En ek wil GetString te roep 'n paar keer, en dan druk f 'n paar keer. 272 00:10:34,500 --> 00:10:37,340 So, hoe kan ek dit doen, al is, wanneer beide 'n naam en 'n huis 273 00:10:37,340 --> 00:10:39,070 betrokke is vir elke student? 274 00:10:39,070 --> 00:10:42,830 >> So my eerste instink mag wees om so iets te doen. 275 00:10:42,830 --> 00:10:49,620 Ek kan sê eers goed, gee my, sê, 'n verskeidenheid van snare name genoem. 276 00:10:49,620 --> 00:10:51,530 En ek wil nie 'n Kodeer drie hier. 277 00:10:51,530 --> 00:10:53,064 Wat wil ek nie daar te vestig? 278 00:10:53,064 --> 00:10:55,730 So STUDENTE, want dit is net 'n konstante verklaar by die top, 279 00:10:55,730 --> 00:10:57,860 net sodat ek nie hoef te hardcode drie in verskeie plekke. 280 00:10:57,860 --> 00:11:00,859 Op hierdie manier, kan ek dit verander een plek, en dit raak 'n verandering oral. 281 00:11:00,859 --> 00:11:04,470 En dan, kan ek doen string huisves studente. 282 00:11:04,470 --> 00:11:10,250 >> En nou, kan ek iets soos doen for (int i = 0; i 00:11:14,390 So ek vinnig tik, maar dit is waarskynlik vertroud sintaksis nou. 284 00:11:14,390 --> 00:11:17,030 >> En nou, dit was meer onlangs. 285 00:11:17,030 --> 00:11:22,890 As ek wil om te sit in die i-de student se naam, ek dink ek doen dit. 286 00:11:22,890 --> 00:11:26,480 En dan, nie name maar huise hakies-i. 287 00:11:26,480 --> 00:11:29,930 Ek doen dit, GetString, en laat my terug te gaan en op te los hierdie lyn. 288 00:11:29,930 --> 00:11:30,430 Stem jy saam? 289 00:11:30,430 --> 00:11:31,200 Stem nie saam nie? 290 00:11:31,200 --> 00:11:32,366 Dit is nie baie gebruikersvriendelik. 291 00:11:32,366 --> 00:11:33,890 Ek het nie die gebruiker wat om te doen het. 292 00:11:33,890 --> 00:11:36,520 >> Maar nou, as ek ook wou later, laat 293 00:11:36,520 --> 00:11:40,060 sê, druk hierdie dinge out-- so TODO later. 294 00:11:40,060 --> 00:11:42,330 Ek gaan more met doen this-- hierdie waarskynlik IS 295 00:11:42,330 --> 00:11:45,970 'n korrekte implementering van om name en huise, drie 296 00:11:45,970 --> 00:11:48,870 van hulle totaal van elkeen, van 'n gebruiker. 297 00:11:48,870 --> 00:11:51,280 >> Maar dit is nie baie goed ontwerp, reg? 298 00:11:51,280 --> 00:11:55,220 Wat as 'n student nie net 'n naam en 'n huis nie, maar ook 'n ID-nommer, 299 00:11:55,220 --> 00:11:57,770 en 'n telefoonnommer, en 'n e-posadres, 300 00:11:57,770 --> 00:12:00,280 en miskien 'n tuisblad, en miskien 'n Twitter hanteer, 301 00:12:00,280 --> 00:12:03,730 en 'n aantal ander besonderhede wat verband hou met 'n student of 'n persoon, 302 00:12:03,730 --> 00:12:04,610 meer in die algemeen. 303 00:12:04,610 --> 00:12:07,720 Hoe sal ons begin by te voeg funksie van hierdie program? 304 00:12:07,720 --> 00:12:14,080 >> Wel, ek voel soos die eenvoudigste manier om die iets wil doen, kom ons sê, 305 00:12:14,080 --> 00:12:16,490 int ids studente. 306 00:12:16,490 --> 00:12:18,380 So ek kan al hul ID's daar. 307 00:12:18,380 --> 00:12:22,240 En dan, vir iets soos telefoonnommers, 308 00:12:22,240 --> 00:12:24,400 Ek is nie seker hoe om te verteenwoordig wat net nog nie. 309 00:12:24,400 --> 00:12:30,280 So laat ons gaan voort en net noem hierdie Twitters studente wat hulle 310 00:12:30,280 --> 00:12:33,550 is 'n bietjie vreemd, but-- en 'n klomp meer velde. 311 00:12:33,550 --> 00:12:36,360 >> Ek het begin om effektief kopieer en plak hier. 312 00:12:36,360 --> 00:12:39,416 En dit gaan mooi groei lomp redelik vinnig, reg? 313 00:12:39,416 --> 00:12:42,290 Sou dit nie lekker wees as daar in die wêreld 'n data struktuur bekend 314 00:12:42,290 --> 00:12:45,600 nie as 'n int of 'n string, maar iets 'n hoër vlak, 'n abstraksie, so 315 00:12:45,600 --> 00:12:47,570 te praat, bekend as 'n student? 316 00:12:47,570 --> 00:12:50,220 C het nie kom met 'n ingeboude funksies vir studente, 317 00:12:50,220 --> 00:12:52,260 Maar wat as ek wou dit so te gee? 318 00:12:52,260 --> 00:12:55,640 >> Wel, dit blyk, ek gaan 'n lêer genaamd structs.h hier oop te maak, 319 00:12:55,640 --> 00:12:57,090 en jy kan presies dit te doen. 320 00:12:57,090 --> 00:12:58,290 En ons gaan om te begin doen dit nou. 321 00:12:58,290 --> 00:13:01,490 En onder die kap van P van drie, jy reeds doen dit nou. 322 00:13:01,490 --> 00:13:05,920 Daar is nie so iets soos 'n g rect of 'n g ovaal in die programmeertaal C. 323 00:13:05,920 --> 00:13:10,570 >> Mense by Stanford geïmplementeer diegene data tipes deur die gebruik van hierdie benadering hier 324 00:13:10,570 --> 00:13:13,900 verklaar hul eie nuwe data tipes gebruik om 'n nuwe navraag 325 00:13:13,900 --> 00:13:16,744 genoem struct en 'n ander een wat geroep is typedef. 326 00:13:16,744 --> 00:13:19,660 En inderdaad, selfs al is die sintaksis lyk 'n bietjie anders as dinge 327 00:13:19,660 --> 00:13:23,550 ons reeds gesien het, in beginsel, dit is super eenvoudig. 328 00:13:23,550 --> 00:13:25,297 >> Dit beteken net "'n soort definieer." 329 00:13:25,297 --> 00:13:27,255 Dit gaan 'n te wees struktuur, en 'n struktuur 330 00:13:27,255 --> 00:13:29,400 is net soos 'n houer vir verskeie dinge. 331 00:13:29,400 --> 00:13:31,780 En dat struktuur gaan 'n string genoem naam te hê, 332 00:13:31,780 --> 00:13:33,210 en 'n string genoem huis. 333 00:13:33,210 --> 00:13:37,520 En laat ons noem, net vir gerief, hierdie hele data struktuur student. 334 00:13:37,520 --> 00:13:40,320 >> So die oomblik wat jy kry om te die kommapunt, jy het nou 335 00:13:40,320 --> 00:13:43,280 geskep jou eie data tipe genoem student 336 00:13:43,280 --> 00:13:46,420 wat nou staan ​​langs int, en float en char en tou, 337 00:13:46,420 --> 00:13:50,270 en g rect, en g ovaal, en 'n aantal ander dinge wat mense het uitgevind. 338 00:13:50,270 --> 00:13:53,340 >> So, wat is nuttig oor hierdie nou is dat as ek gaan terug 339 00:13:53,340 --> 00:13:57,430 te STRUKT 0 en klaar is met hierdie implementering, wat ek geskryf 340 00:13:57,430 --> 00:14:02,080 vooraf hier, sien dat al van die onvermydelike messiness wat 341 00:14:02,080 --> 00:14:05,490 was om te begin gebeur as ek bygevoeg telefoonnommers en gekwetter en al 342 00:14:05,490 --> 00:14:07,370 hierdie ander dinge te 'n student se definisie 343 00:14:07,370 --> 00:14:11,810 nou is dit saaklik toegedraai as net 'n verskeidenheid van studente. 344 00:14:11,810 --> 00:14:15,500 >> En elkeen van die studente nou het verskeie dinge binnekant van dit. 345 00:14:15,500 --> 00:14:16,930 Sodat net laat 'n vraag. 346 00:14:16,930 --> 00:14:19,700 Hoe kry jy by die naam, en die huis, en die ID, 347 00:14:19,700 --> 00:14:21,640 en alles anders is binnekant van die student? 348 00:14:21,640 --> 00:14:22,930 Super eenvoudige, as well. 349 00:14:22,930 --> 00:14:25,730 Nuwe sintaksis, maar 'n eenvoudige idee. 350 00:14:25,730 --> 00:14:29,239 >> Jy hoef net indeks in die skikking, soos ons gedoen het verlede week en hierdie. 351 00:14:29,239 --> 00:14:31,030 En wat is duidelik die nuwe stuk van die sintaksis? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Net., Wat beteken "gaan binne die struktuur en kry die veld met die naam 354 00:14:35,880 --> 00:14:39,030 naam, kry die veld genaamd huis, kry die veld genoem student. " 355 00:14:39,030 --> 00:14:41,940 >> So in P van drie, as jy nog besig met wat, 356 00:14:41,940 --> 00:14:44,020 en die meeste mense steeds is, besef dat as jy 357 00:14:44,020 --> 00:14:46,130 begin gebruik dinge soos g rects en g ovale 358 00:14:46,130 --> 00:14:50,201 en ander dinge wat lyk nie te vandaan Week Zero, Een of twee, 359 00:14:50,201 --> 00:14:52,950 besef dat dit is omdat Stanford verklaar 'n paar nuwe data tipes. 360 00:14:52,950 --> 00:14:56,160 >> En inderdaad, dit is presies wat ons sal doen, asook, in P Stel Vier, wanneer 361 00:14:56,160 --> 00:14:59,880 ons begin om te gaan met dinge soos beelde, bitmaps, en nog baie meer. 362 00:14:59,880 --> 00:15:02,882 So dit is net 'n teaser en 'n geestelike model vir wat aan die kom is. 363 00:15:02,882 --> 00:15:04,590 Nou, ek procrastinated 'n bietjie vanoggend. 364 00:15:04,590 --> 00:15:09,560 Ek was soort van nuuskierig om te sien wat die Microsoft gallery eintlik 365 00:15:09,560 --> 00:15:10,310 lyk soos vandag. 366 00:15:10,310 --> 00:15:15,200 En dit blyk iemand in 2006 eintlik het byna presies 367 00:15:15,200 --> 00:15:19,210 dieselfde plek te neem in die werklikheid wat lyk soos dat hierdie dae. 368 00:15:19,210 --> 00:15:21,380 Die gebied is nou 'n bietjie toegegroei. 369 00:15:21,380 --> 00:15:24,850 >> So praat nou van beelde, laat ons terug te bring Daven hier 370 00:15:24,850 --> 00:15:26,890 op die skerm en Nicholas, en net herinner u 371 00:15:26,890 --> 00:15:30,540 dat as jy wil ons aan te sluit vir middagete Vrydag, hoof aan ons gewone URL 372 00:15:30,540 --> 00:15:31,440 hier. 373 00:15:31,440 --> 00:15:33,530 >> So waar het ons laat af op Maandag? 374 00:15:33,530 --> 00:15:35,140 Ons het hierdie probleem, reg? 375 00:15:35,140 --> 00:15:37,610 Dit was skynbaar 'n korrekte implementering van ruil, 376 00:15:37,610 --> 00:15:40,460 waardeur jy neem twee ints, die een het 'n een genoem b, 377 00:15:40,460 --> 00:15:44,130 ruil hulle, net soos Laura het hier op die verhoog met die melk en die water, 378 00:15:44,130 --> 00:15:46,820 deur die gebruik van 'n tydelike veranderlike, of 'n leë koppie, 379 00:15:46,820 --> 00:15:50,540 sodat ons kan sit in 'n b en in b sonder om 'n gemors van dinge. 380 00:15:50,540 --> 00:15:51,560 Ons het 'n veranderlike. 381 00:15:51,560 --> 00:15:52,870 Dit is bekend as temp. 382 00:15:52,870 --> 00:15:55,520 >> Maar wat was die fundamentele probleem met hierdie kode op Maandag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Wat was die probleem hier? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Ja. 387 00:16:00,605 --> 00:16:01,970 >> Publiek: Dit neem meer ruimte. 388 00:16:01,970 --> 00:16:04,719 >> David J. Malan Neem meer ruimte, want ek is met behulp van 'n veranderlike, 389 00:16:04,719 --> 00:16:05,400 en dit is OK. 390 00:16:05,400 --> 00:16:07,300 Dit is waar, maar ek is gaan om te sê dit is OK. 391 00:16:07,300 --> 00:16:10,030 Dit is slegs 32 stukkies in die groot skema van dinge, so nie 'n groot deal. 392 00:16:10,030 --> 00:16:10,655 Ander gedagtes? 393 00:16:10,655 --> 00:16:12,572 Publiek: Dit ruil net die veranderlikes plaaslik. 394 00:16:12,572 --> 00:16:13,571 David J. Malan Presies. 395 00:16:13,571 --> 00:16:15,090 Dit ruil net die veranderlikes plaaslik. 396 00:16:15,090 --> 00:16:18,173 Omdat enige tyd wat jy noem 'n function-- toe ek die bak van Annenberg 397 00:16:18,173 --> 00:16:19,840 laaste keer, jy het groot op die bodem. 398 00:16:19,840 --> 00:16:23,560 Sodra jy noem 'n funksie genoem ruil, beteken ruil nie x en y kry, 399 00:16:23,560 --> 00:16:24,400 die oorspronklike waardes. 400 00:16:24,400 --> 00:16:26,392 Wat beteken ruil kry, het ons eis? 401 00:16:26,392 --> 00:16:27,100 Publiek: Afskrifte. 402 00:16:27,100 --> 00:16:28,090 David J. Malan So afskrifte van hulle. 403 00:16:28,090 --> 00:16:31,120 So raak dit een en twee, as jy onthou die voorbeeld van die laaste keer, 404 00:16:31,120 --> 00:16:34,730 maar 'n afskrif van een en twee wat suksesvol verruil. 405 00:16:34,730 --> 00:16:38,550 Maar ongelukkig in die einde, daardie waardes is nog steeds dieselfde. 406 00:16:38,550 --> 00:16:41,880 Sodat ons kan sien met ons nuwe vriend, hopelik GDB, 407 00:16:41,880 --> 00:16:45,180 dat jy of die TFS en Ca se het is om u te lei na die volgende. 408 00:16:45,180 --> 00:16:51,210 >> So nie omruil onthou lyk se like-- laat oopmaak this-- lyk. 409 00:16:51,210 --> 00:16:54,160 Ons geïnisialiseer x aan die een, y aan twee. 410 00:16:54,160 --> 00:16:55,620 Het 'n klomp van die gedrukte f se. 411 00:16:55,620 --> 00:16:58,080 Maar dan, die sleutel oproep hier was om te ruil, wat 412 00:16:58,080 --> 00:17:00,260 is presies die kode wat ons net gesien 'n oomblik gelede. 413 00:17:00,260 --> 00:17:03,180 Wat is korrek ten eerste oogopslag, maar funksioneel, 414 00:17:03,180 --> 00:17:06,800 hierdie program nie werk nie, want dit nie permanent ruil x en y. 415 00:17:06,800 --> 00:17:10,190 >> So laat ons sien, 'n vinnige warm hier met GDB, 'n ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 'N klomp van die oorweldigende inligting wat Ek sal ontslae te raak van met beheer L vir nou. 418 00:17:15,200 --> 00:17:17,516 En nou, ek gaan om te gaan voort en voer dit uit. 419 00:17:17,516 --> 00:17:19,349 En ongelukkig, wat was nie dat nuttig. 420 00:17:19,349 --> 00:17:22,355 Dit het die program in hierdie program genaamd GDB, 'n debugger, 421 00:17:22,355 --> 00:17:23,730 maar dit het my nie laat sak rond. 422 00:17:23,730 --> 00:17:26,229 >> So, hoe kan ek eintlik breek uitvoering binne hierdie program? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 So breek. 425 00:17:28,329 --> 00:17:32,340 En ek kon breek op enige reël nommer een, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Maar ek kan ook simbolies breek deur te sê breek hoof. 427 00:17:35,530 --> 00:17:38,980 En dit gaan 'n breek te stel punt, blykbaar by lyn 16 in die belangrikste. 428 00:17:38,980 --> 00:17:40,050 En waar is lyn 16? 429 00:17:40,050 --> 00:17:42,960 Kom ons gaan na die kode en optrek na noswap. 430 00:17:42,960 --> 00:17:46,930 En inderdaad, lyn 16 is die heel eerste in die program. 431 00:17:46,930 --> 00:17:52,130 >> So nou, as ek gaan voort en tipe hardloop hierdie tyd, Tik, dit gestop. 432 00:17:52,130 --> 00:17:53,080 So laat sak rond. 433 00:17:53,080 --> 00:17:55,716 Druk x-- hoekom is x nul? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 En ignoreer die dollar-teken. 436 00:17:57,830 --> 00:17:59,725 Dit is net vir liefhebber gebruik van die program. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Hoekom is X nul op die oomblik? 439 00:18:03,140 --> 00:18:03,640 Ja. 440 00:18:03,640 --> 00:18:07,061 >> Publiek: Dit onderbreek reg voor lyn 16, nie eintlik op die lyn 16. 441 00:18:07,061 --> 00:18:08,060 David J. Malan Presies. 442 00:18:08,060 --> 00:18:11,630 GDB, by verstek, het gestop uitvoering net voor lyn 16. 443 00:18:11,630 --> 00:18:14,820 So is dit nie uitgevoer word, wat beteken x is van 'n onbekende waarde. 444 00:18:14,820 --> 00:18:17,150 En ons het gelukkig dat dit iets skoon, soos nul. 445 00:18:17,150 --> 00:18:20,310 So nou as ek tik die volgende, nou is dit uitgevoer word 16. 446 00:18:20,310 --> 00:18:22,000 Dit is vir my gewag om uit te voer 17. 447 00:18:22,000 --> 00:18:23,400 Laat my voor en druk x gaan. 448 00:18:23,400 --> 00:18:24,094 Dit is een. 449 00:18:24,094 --> 00:18:25,260 Laat my voor en druk y gaan. 450 00:18:25,260 --> 00:18:26,176 Wat moet ek nou? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> Publiek: [onhoorbaar] 453 00:18:28,560 --> 00:18:29,165 >> David J. Malan 'n bietjie harder. 454 00:18:29,165 --> 00:18:30,040 >> Publiek: [onhoorbaar] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 David J. Malan Nie heeltemal 'n konsensus. 457 00:18:32,120 --> 00:18:34,760 So ja, sien ons 'n paar vullis waarde. 458 00:18:34,760 --> 00:18:37,862 Nou, y is 134514064 daar. 459 00:18:37,862 --> 00:18:39,320 Wel, dit is net 'n paar vullis waarde. 460 00:18:39,320 --> 00:18:41,350 My program maak gebruik van geheue vir verskillende doeleindes. 461 00:18:41,350 --> 00:18:42,350 Daar is ander funksies. 462 00:18:42,350 --> 00:18:44,040 Ander mense in my rekenaar geskryf. 463 00:18:44,040 --> 00:18:46,789 So daardie stukkies is gebruik vir ander waardes, en wat ek sien 464 00:18:46,789 --> 00:18:49,470 is die oorblyfsels van 'n paar voor gebruik van daardie geheue. 465 00:18:49,470 --> 00:18:53,350 >> So geen groot deal, want sodra as ek tik die volgende en druk dan y, 466 00:18:53,350 --> 00:18:55,640 dit geïnisialiseer te die waarde wat ek wil hê. 467 00:18:55,640 --> 00:18:57,400 So nou, laat ons gaan voort 'n bietjie vinniger. 468 00:18:57,400 --> 00:18:58,540 N vir volgende. 469 00:18:58,540 --> 00:18:59,570 Kom ons doen dit weer. 470 00:18:59,570 --> 00:19:00,530 Kom ons doen dit weer. 471 00:19:00,530 --> 00:19:02,404 Maar ek wil nie te tref dit hier, want as ek 472 00:19:02,404 --> 00:19:05,110 wil om te sien wat binne aangaan van ruil, wat is die opdrag? 473 00:19:05,110 --> 00:19:05,520 >> Publiek: stappe. 474 00:19:05,520 --> 00:19:06,436 >> David J. Malan stappe. 475 00:19:06,436 --> 00:19:09,800 So hierdie stappe my in 'n funksie, eerder as om daaroor te skryf. 476 00:19:09,800 --> 00:19:12,270 En nou is dit 'n bietjie kripties eerlik, maar dit is net 477 00:19:12,270 --> 00:19:14,581 vertel my ek is in lyn 33 nou. 478 00:19:14,581 --> 00:19:15,580 En laat ons doen dit weer. 479 00:19:15,580 --> 00:19:16,080 Print temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Vullis waarde, negatiewe hierdie tyd, maar dit is net nog 'n gemors waarde. 482 00:19:20,170 --> 00:19:22,810 So laat ons nou doen, druk temp. 483 00:19:22,810 --> 00:19:27,130 Dit is geïnisialiseer tot 1, wat was die waarde van x, aka a. 484 00:19:27,130 --> 00:19:29,110 >> Nou, waar is ons 'n X vandaan? 485 00:19:29,110 --> 00:19:32,510 Wel, kennis belangrikste, ons het hierdie waardes x en y. 486 00:19:32,510 --> 00:19:34,740 Ons het toe geslaag het hulle soos volg te ruil. 487 00:19:34,740 --> 00:19:37,010 X het eerste gekom, komma y. 488 00:19:37,010 --> 00:19:40,020 En dan, ruil hulle kon x en y noem. 489 00:19:40,020 --> 00:19:42,630 Maar vir duidelikheid, dit is noem hulle a en b. 490 00:19:42,630 --> 00:19:45,970 Maar A en B gaan nou wees afskrifte van x en y, onderskeidelik. 491 00:19:45,970 --> 00:19:50,660 >> So as ek gaan terug na GDB, tydelike is nou een en 'n is nou een. 492 00:19:50,660 --> 00:19:56,130 Maar as ek volgende doen en nou doen druk 'n, 'n reeds verskuif. 493 00:19:56,130 --> 00:20:00,030 Die melk is in die vorige uitgestort lemoensap se glas, of andersom. 494 00:20:00,030 --> 00:20:04,750 >> En as ek nou doen weer, en nou As ek druk as 'n gesonde verstand tjek, 495 00:20:04,750 --> 00:20:07,687 'n nog twee, maar b is nou een. 496 00:20:07,687 --> 00:20:08,770 Om eerlik te wees, dit is nog steeds daar. 497 00:20:08,770 --> 00:20:10,670 Ek gee nie om wat temp is. 498 00:20:10,670 --> 00:20:16,850 Maar so gou as ek tik nou, kom ons sê, voortgaan om terug te gaan, nou is ek aan die einde 499 00:20:16,850 --> 00:20:17,480 die program. 500 00:20:17,480 --> 00:20:20,730 En ongelukkig, x is steeds een en y is nog twee. 501 00:20:20,730 --> 00:20:22,272 >> So wat was die nut van GDB is daar? 502 00:20:22,272 --> 00:20:23,980 Dit het my nie help nie los die probleem per se, 503 00:20:23,980 --> 00:20:26,265 maar dit hopelik my help verstaan ​​deur die besef 504 00:20:26,265 --> 00:20:30,000 dat ja, my logika is reg, maar my kode is nie uiteindelik met 505 00:20:30,000 --> 00:20:31,450 'n permanente impak. 506 00:20:31,450 --> 00:20:34,570 So dit is 'n probleem wat ons is gaan vandag nou op te los. 507 00:20:34,570 --> 00:20:37,870 >> Maar laat ons daar te kom deur middel van hierdie. 508 00:20:37,870 --> 00:20:39,230 String is 'n leuen. 509 00:20:39,230 --> 00:20:41,860 Dit is ook nie 'n data tipe wat bestaan ​​in C. Dit is 510 00:20:41,860 --> 00:20:44,750 is 'n sinoniem vir 'n paar tyd vir iets anders, 511 00:20:44,750 --> 00:20:47,300 en ons kan toon dat soos volg. 512 00:20:47,300 --> 00:20:53,282 >> Laat my voort te gaan en maak 'n program genaamd vergelyk-0. 513 00:20:53,282 --> 00:20:56,240 En eerder as tik hierdie een uit, Ons sal begin deur die kode om te loop 514 00:20:56,240 --> 00:20:58,040 Ek het reeds geskryf, maar dit is net 'n paar lyne. 515 00:20:58,040 --> 00:20:59,570 So dit vergelyk-0. 516 00:20:59,570 --> 00:21:02,380 En die eerste ding wat ek doen is om 'n lyn van die teks. 517 00:21:02,380 --> 00:21:05,610 >> Maar let op wat ek doen vir die eerste keer. 518 00:21:05,610 --> 00:21:07,910 Wat is die verskil duidelik oor reël 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Eintlik, wag 'n minuut. 521 00:21:11,402 --> 00:21:12,110 Dit is afskrif twee. 522 00:21:12,110 --> 00:21:13,568 Dit is nie eens die regte program. 523 00:21:13,568 --> 00:21:14,780 Alle reg, spoiler waarskuwing. 524 00:21:14,780 --> 00:21:16,890 Alle reg, sodat never mind dat. 525 00:21:16,890 --> 00:21:18,520 Dit is die antwoord op 'n vraag toekoms. 526 00:21:18,520 --> 00:21:21,450 >> Hier is vergelyk-0, en ek is om 'n lyn van die teks te kry. 527 00:21:21,450 --> 00:21:22,435 Program se baie makliker. 528 00:21:22,435 --> 00:21:23,560 So dit is eenvoudig. 529 00:21:23,560 --> 00:21:28,070 Dit is soos die week een Week Twee dinge op die oomblik. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Nou, ek sê dit weer hier. 531 00:21:29,700 --> 00:21:31,830 string t = GetString. 532 00:21:31,830 --> 00:21:35,300 En dan, die laaste ding wat in hierdie program, soos sy naam suggereer, 533 00:21:35,300 --> 00:21:37,090 is ek gaan om te probeer om hulle te vergelyk. 534 00:21:37,090 --> 00:21:40,709 >> So as s, die eerste string, gelyk = t, dan is ek 535 00:21:40,709 --> 00:21:42,250 gaan om te sê jy dieselfde ding tik. 536 00:21:42,250 --> 00:21:44,291 Anders, ek gaan om te sê jy tik verskillende dinge. 537 00:21:44,291 --> 00:21:45,880 So laat opstel en uitvoering van hierdie program. 538 00:21:45,880 --> 00:21:48,481 So maak vergelyk nul. 539 00:21:48,481 --> 00:21:48,980 Lyk goed. 540 00:21:48,980 --> 00:21:50,490 Geen samestelling foute. 541 00:21:50,490 --> 00:21:52,386 >> Laat my voort te gaan nou en tik ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Laat my gaan voort en sê iets : Daven en iets: Rob. 544 00:21:59,220 --> 00:22:00,450 En ek tik verskillende dinge. 545 00:22:00,450 --> 00:22:01,250 So ver, so goed. 546 00:22:01,250 --> 00:22:02,680 Program blyk korrek te wees. 547 00:22:02,680 --> 00:22:03,880 >> Maar laat ons hardloop dit weer. 548 00:22:03,880 --> 00:22:05,800 Sê iets: Gabe. 549 00:22:05,800 --> 00:22:07,140 Sê iets: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Alle regte. 552 00:22:09,020 --> 00:22:10,851 Miskien het ek getref space bar of iets funky. 553 00:22:10,851 --> 00:22:11,600 Kom ons doen dit weer. 554 00:22:11,600 --> 00:22:13,020 So Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Verskillende dinge. 559 00:22:17,330 --> 00:22:19,430 So, wat gaan aan? 560 00:22:19,430 --> 00:22:23,200 >> So ons het hierdie twee lyne van kode, GetString word twee keer genoem. 561 00:22:23,200 --> 00:22:25,760 En dan, ek is bloot probeer s en t te vergelyk. 562 00:22:25,760 --> 00:22:28,370 Maar wat werklik dan aan die gang is? 563 00:22:28,370 --> 00:22:31,180 Wel, my handskrif se oor te slagter hierdie voorbeeld ietwat. 564 00:22:31,180 --> 00:22:34,630 En laat ons eintlik gooi hierdie up hier, as well. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> So het ons 'n lyn soos string s = GetString. 567 00:22:45,712 --> 00:22:48,295 So dit is net die eerste interessante lyn van die program. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Maar wat al hierdie tyd was gaan op onder die enjinkap? 570 00:22:52,974 --> 00:22:55,890 Wel, op die linkerkant is string, wat is 'n soort van 'n veranderlike, 571 00:22:55,890 --> 00:22:56,785 en dit genoem is. 572 00:22:56,785 --> 00:23:00,019 So ek weet dat dit is die gebruik van die geheue, of geheue, in my rekenaar of ander manier. 573 00:23:00,019 --> 00:23:02,060 So ek gaan 'n abstrakte teken dat as 'n vierkant. 574 00:23:02,060 --> 00:23:04,820 32 stukkies, dit blyk, maar meer inligting oor wat in die toekoms. 575 00:23:04,820 --> 00:23:06,410 En dan, is wat gaan aan hier? 576 00:23:06,410 --> 00:23:08,700 >> Wel, GetString natuurlik kry 'n string van die gebruiker. 577 00:23:08,700 --> 00:23:11,360 En GetString het Zamyla of Gabe of Daven. 578 00:23:11,360 --> 00:23:14,640 So laat ons kies om die eerste van diegene wat Daven. 579 00:23:14,640 --> 00:23:19,174 So effektief, wat GetString het my in die eerste geval was D-'n-v-e-N. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 En dan, wat anders het dit gee my die geheim? 582 00:23:25,045 --> 00:23:25,920 Publiek: [onhoorbaar] 583 00:23:25,920 --> 00:23:28,720 David J. Malan Ja, die / 0 of nul karakter. 584 00:23:28,720 --> 00:23:30,550 So dit effektief vir my 'n string. 585 00:23:30,550 --> 00:23:34,550 Maar ons weet reeds uit die vorige lyk dat 'n string is net 'n skikking 586 00:23:34,550 --> 00:23:37,895 van die karakters, en dit is beëindig deur hierdie spesiale brandwag karakter / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Maar as dit waar is en dit is 'n vierkant, 589 00:23:42,310 --> 00:23:44,160 Dit is duidelik 'n veel groter reghoek. 590 00:23:44,160 --> 00:23:46,830 En inderdaad, dit is, Ek eis nie, slegs 32 stukkies. 591 00:23:46,830 --> 00:23:49,500 En dit is duidelik meer as 32 stukkies, want dit is waarskynlik 592 00:23:49,500 --> 00:23:51,583 agt plus agt plus agt plus agt plus agt, 593 00:23:51,583 --> 00:23:53,320 net omdat grepe in ASCII. 594 00:23:53,320 --> 00:23:57,030 Hoe die hel gaan ons aan te pas Daven in hierdie klein blokkie hier? 595 00:23:57,030 --> 00:23:59,880 >> Wel, wat is eintlik GetString doen? 596 00:23:59,880 --> 00:24:03,680 Wel, hierdie rooster hier verteenwoordig my rekenaar se geheue of RAM. 597 00:24:03,680 --> 00:24:07,564 So laat ons arbitrêr sê dat indien elk van hierdie verteenwoordig 'n greep, 598 00:24:07,564 --> 00:24:09,730 dan kan ons dink van elke byte as wat 'n adres, 599 00:24:09,730 --> 00:24:13,830 soos 33 Oxford Street, of 34 Oxford Street, of 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> So net soos huise het adresse en geboue adresse, 601 00:24:16,700 --> 00:24:19,810 doen individuele grepe geheue hê adresse of nommers 602 00:24:19,810 --> 00:24:21,042 wat uniek te identifiseer. 603 00:24:21,042 --> 00:24:22,000 Nou, dit is arbitrêr. 604 00:24:22,000 --> 00:24:25,370 Maar om dit eenvoudig te hou, ek gaan gebruik heksadesimale net deur die konvensie, 605 00:24:25,370 --> 00:24:28,200 maar die 0x beteken niks anders as "dit is heksadesimale." 606 00:24:28,200 --> 00:24:31,030 en ek gaan om te beweer dat die "D" eindig by Byte Een in die geheue. 607 00:24:31,030 --> 00:24:34,210 >> Ek het niks anders aan die gang in geheue, so Daven het die eerste plek 608 00:24:34,210 --> 00:24:35,509 by Byte Een. 609 00:24:35,509 --> 00:24:36,800 Dit is dan, gaan 0x2 te wees. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Dit gaan 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Dit gaan 0x4 te wees. 614 00:24:41,800 --> 00:24:43,025 Dit gaan 0x5. 615 00:24:43,025 --> 00:24:44,025 Dit gaan 0x6 te wees. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Maar as jy begin dink oor wat die rekenaar se toedoen 618 00:24:48,290 --> 00:24:50,710 onder die enjinkap, jy kan begin om af te lei 619 00:24:50,710 --> 00:24:54,960 hoe jy 'n paar jaar gelede, sou het C self geïmplementeer. 620 00:24:54,960 --> 00:24:58,360 Wat is GetString waarskynlik returning-- omdat dit 621 00:24:58,360 --> 00:25:00,946 voel soos dit is nie terugkeer Daven, per se, 622 00:25:00,946 --> 00:25:03,320 omdat hy sekerlik nie gaan te pas in hierdie klein box-- 623 00:25:03,320 --> 00:25:05,090 So, wat is GetString waarskynlik terugkeer? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> Publiek: [onhoorbaar] 626 00:25:08,920 --> 00:25:10,540 >> David J. Malan Die ligging van Daven. 627 00:25:10,540 --> 00:25:12,770 En dit is hierdie doen sedert Week Een. 628 00:25:12,770 --> 00:25:16,150 Wat GetString is regtig terugkeer is nie 'n string, per se. 629 00:25:16,150 --> 00:25:17,780 Dit is een van die min wit leuens. 630 00:25:17,780 --> 00:25:22,520 Dit is die terugkeer van die adres van die string in die geheue, die unieke adres. 631 00:25:22,520 --> 00:25:24,820 Daven woon op 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Maar meer saaklik, Gavin woon by 0x1, adres nommer een. 633 00:25:29,310 --> 00:25:32,280 >> So wat kry sit in hierdie boksie dan duidelik wees, 634 00:25:32,280 --> 00:25:35,930 is net die adres van die string. 635 00:25:35,930 --> 00:25:38,110 So al hierdie tyd, hierdie is aan die gang. 636 00:25:38,110 --> 00:25:41,650 Maar wat hierdie sinspeel op nou is dat as al s 637 00:25:41,650 --> 00:25:44,710 is 'n aantal binnekant van dit, wat is om jou te stop, die programmeerder, 638 00:25:44,710 --> 00:25:47,970 uit om enige getal in enige veranderlike en net spring 639 00:25:47,970 --> 00:25:49,080 aan daardie deel van die geheue? 640 00:25:49,080 --> 00:25:51,320 En inderdaad, sal ons sien dit is 'n bedreiging volgende keer. 641 00:25:51,320 --> 00:25:53,500 >> Maar vir nou, dit voel onvoldoende. 642 00:25:53,500 --> 00:25:55,630 As ek sê, vir my 'n string, jy gee my Daven. 643 00:25:55,630 --> 00:25:57,230 Maar jy het nie regtig gee my Daven. 644 00:25:57,230 --> 00:25:59,310 Al wat jy my gee is Daven se adres. 645 00:25:59,310 --> 00:26:04,310 Hoe weet ek dan vir seker waar Daven begin en ends-- 646 00:26:04,310 --> 00:26:07,140 die storie se om weird-- waar Daven begin en eindig, 647 00:26:07,140 --> 00:26:10,435 en dan die volgende string in die geheue begin? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Wel, as jy die uitdeel vir my die begin van Daven, 650 00:26:13,620 --> 00:26:17,230 wese, hoe weet ek waar die einde van sy naam is? 651 00:26:17,230 --> 00:26:20,550 Dit spesiale null karakter, wat is al hoe meer nou belangrik 652 00:26:20,550 --> 00:26:23,040 As snare onder die kap eenvoudig geïdentifiseer 653 00:26:23,040 --> 00:26:25,820 uniek aan hul plek in die geheue. 654 00:26:25,820 --> 00:26:28,130 So al hierdie tyd, dit is wat aan die gang is. 655 00:26:28,130 --> 00:26:32,470 >> So wanneer ons nou kyk die kode hier, verduidelik 656 00:26:32,470 --> 00:26:35,790 As jy wil die fout in lyn 26. 657 00:26:35,790 --> 00:26:39,560 Hoekom is Zamyla en Zamyla anders? 658 00:26:39,560 --> 00:26:41,330 Hoekom is Gabe en Gabe anders? 659 00:26:41,330 --> 00:26:42,154 Ja, in die rug. 660 00:26:42,154 --> 00:26:43,390 >> Publiek: Hulle het verskillende adresse. 661 00:26:43,390 --> 00:26:45,931 >> David J. Malan Net omdat hulle het verskillende adresse. 662 00:26:45,931 --> 00:26:48,820 Want as jy GetString noem weer, wat ek sal gou hier te doen, 663 00:26:48,820 --> 00:26:52,870 As dit is die tweede lyn, string t, soos ek gedoen het in daardie program, 664 00:26:52,870 --> 00:26:55,030 gelyk ander oproep om GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Die volgende keer wat ek noem GetString, ek gaan 667 00:26:58,670 --> 00:27:00,190 'n ander deel van die geheue te kry. 668 00:27:00,190 --> 00:27:02,220 >> GetString word toegelaat die bedryfstelsel te vra 669 00:27:02,220 --> 00:27:03,800 stelsel vir meer en meer geheue. 670 00:27:03,800 --> 00:27:07,894 Dit gaan nie om dieselfde te onthou ses grepe elke keer. 671 00:27:07,894 --> 00:27:09,810 Dit gaan 'n nuwe te kry stuk van die geheue, wat 672 00:27:09,810 --> 00:27:12,780 beteken t gaan kry 'n ander waarde hier. 673 00:27:12,780 --> 00:27:15,380 >> So wanneer ek s gelyk aan = t, is jy nie te vergelyk 674 00:27:15,380 --> 00:27:17,880 D teen hierdie en 'n teen hierdie en V teen hierdie. 675 00:27:17,880 --> 00:27:19,588 Jy vergelyk dit teen hierdie, wat 676 00:27:19,588 --> 00:27:24,020 eerlik is redelik useful-- useless-- is redelik nutteloos, want wat werklik 677 00:27:24,020 --> 00:27:25,830 omgee waar die snare is in die geheue? 678 00:27:25,830 --> 00:27:26,850 >> En inderdaad, ons het nie. 679 00:27:26,850 --> 00:27:28,980 En ons is nie van plan om begin veral omgee. 680 00:27:28,980 --> 00:27:34,180 Slegs tot die mate dat foute kan ontstaan en veiligheid bedreig kan opstaan 681 00:27:34,180 --> 00:27:36,100 ons eintlik begin omgee oor hierdie. 682 00:27:36,100 --> 00:27:37,230 So laat ons die probleem kan oplos. 683 00:27:37,230 --> 00:27:39,650 Turns out, jy dit regmaak super eenvoudig. 684 00:27:39,650 --> 00:27:42,600 >> En laat ons eintlik, voordat ek openbaar dat die weer, wat sou 685 00:27:42,600 --> 00:27:47,170 jy doen as in 'n CS50 klas en jy het om te implementeer 686 00:27:47,170 --> 00:27:48,600 'n vergelyking teen twee stringe. 687 00:27:48,600 --> 00:27:51,440 Jy kan duidelik nie net gebruik is gelyk aan = t. 688 00:27:51,440 --> 00:27:54,090 Maar net logies, hoe sou jy hierdie string vergelyk 689 00:27:54,090 --> 00:27:56,370 teen hierdie string met behulp van C-kode? 690 00:27:56,370 --> 00:27:56,880 Ja. 691 00:27:56,880 --> 00:27:58,780 >> Publiek: Net doen die lus vir [onhoorbaar] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 David J. Malan Perfect. 694 00:28:01,670 --> 00:28:02,900 Publiek: [onhoorbaar] 695 00:28:02,900 --> 00:28:03,310 David J. Malan Ja. 696 00:28:03,310 --> 00:28:05,390 Net gebruik om 'n lus vir of 'n while lus of wat ook al. 697 00:28:05,390 --> 00:28:08,710 Maar net die toepassing van die basiese idee dat indien dit is 'n stuk van die geheue of 'n skikking 698 00:28:08,710 --> 00:28:11,590 en dit is, Itereer oor beide op dieselfde tyd. 699 00:28:11,590 --> 00:28:12,960 En net vergelyk die letters. 700 00:28:12,960 --> 00:28:14,260 >> En jy het 'n te wees bietjie versigtig, want jy 701 00:28:14,260 --> 00:28:16,247 wil nie 'n vinger om te gaan verby die ander 702 00:28:16,247 --> 00:28:18,080 want die een string is langer as die ander. 703 00:28:18,080 --> 00:28:21,380 So jy gaan om te wil om te kyk vir hierdie spesiale waarde aan die einde, nietig. 704 00:28:21,380 --> 00:28:24,017 Maar dit is werklik, in die einde, so eenvoudig soos dit. 705 00:28:24,017 --> 00:28:26,100 En eerlik, het ons nie nodig dat die wiel te herontwerp. 706 00:28:26,100 --> 00:28:27,960 Hier is weergawe Twee. 707 00:28:27,960 --> 00:28:32,910 En wat gaan ek hier sê, is dat in plaas van die vergelyking s = t gelyk, 708 00:28:32,910 --> 00:28:38,964 Ek plaas gaan om te sê, as string vergelyking van s komma t gelyk aan = 0. 709 00:28:38,964 --> 00:28:40,130 Nou, wat is string vergelyk? 710 00:28:40,130 --> 00:28:43,046 >> Dit blyk uit, dit is 'n funksie wat kom met C, wie se doel in die lewe 711 00:28:43,046 --> 00:28:44,650 is twee snare te vergelyk. 712 00:28:44,650 --> 00:28:48,300 En roer dit vergelyk, as ons lees sy man bladsy of dokumentasie of CS50 713 00:28:48,300 --> 00:28:50,630 verwysing, sal dit eenvoudig vertel dat opskudding 714 00:28:50,630 --> 00:28:55,730 opbrengste óf 'n negatiewe vergelyk nommer of 'n positiewe getal of nul, 715 00:28:55,730 --> 00:28:57,660 waar nul beteken hulle is gelyk. 716 00:28:57,660 --> 00:28:58,570 >> Dus net bespiegeling. 717 00:28:58,570 --> 00:29:00,390 Wat kan dit beteken as roer vergelyk opbrengste 718 00:29:00,390 --> 00:29:02,110 negatiewe waarde of positiewe waarde? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 Publiek: groter as of minder as. 721 00:29:04,285 --> 00:29:05,570 David J. Malan Ja, groter as of minder as. 722 00:29:05,570 --> 00:29:08,640 So as jy wil 'n geheel te sorteer n klomp van die snare in 'n dictionary-- 723 00:29:08,640 --> 00:29:12,975 Soos ons sal uiteindelik teen die road-- perfekte funksie potensieel gebruik, 724 00:29:12,975 --> 00:29:15,850 want dit gaan om dit te doen vergelyking van snare vir jou, en vertel 725 00:29:15,850 --> 00:29:20,060 jy nie 'n kom voor b, of nie b kom voor 'n alfabeties. 726 00:29:20,060 --> 00:29:21,490 Ons kan presies dit te doen. 727 00:29:21,490 --> 00:29:23,620 >> En kennis van wat ek gedoen het een ander ding in hierdie voorbeeld. 728 00:29:23,620 --> 00:29:26,870 Wat anders het hoër in hierdie belangrikste funksie? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 En dit is dat ander wit leuen. 732 00:29:31,150 --> 00:29:33,750 Al hierdie tyd, wanneer jy is die skryf van string, 733 00:29:33,750 --> 00:29:38,350 ons het die geheim is herskryf string as char * sodat klang eintlik 734 00:29:38,350 --> 00:29:39,270 verstaan ​​jy. 735 00:29:39,270 --> 00:29:42,450 >> Met ander woorde, in CS50.h en as ons uiteindelik sien, 736 00:29:42,450 --> 00:29:45,950 ons het 'n sinoniem genoem string dit is dieselfde ding as char *. 737 00:29:45,950 --> 00:29:49,910 En nou, weet net dat die * In hierdie konteks, ten minste, 738 00:29:49,910 --> 00:29:51,286 n beteken die adres. 739 00:29:51,286 --> 00:29:52,210 >> Die adres van wat? 740 00:29:52,210 --> 00:29:56,390 Wel, die feit dat ek gesê char *, en nie int * of * dryf, 741 00:29:56,390 --> 00:30:00,820 beteken dat char * is die adres van 'n kar. 742 00:30:00,820 --> 00:30:06,770 So hierdie klein blokkie hier, alias string, is regtig van die tipe char *, 743 00:30:06,770 --> 00:30:10,490 wat is bloot 'n fancy manier om te sê, in hierdie boks sal 'n adres te gaan. 744 00:30:10,490 --> 00:30:12,430 En wat beteken die adres verwys na? 745 00:30:12,430 --> 00:30:13,780 Blykbaar 'n kar. 746 00:30:13,780 --> 00:30:16,410 >> Maar ons kon absoluut het int * en ander dinge. 747 00:30:16,410 --> 00:30:20,790 Maar vir nou, char * is regtig die mees eenvoudig en een van rente. 748 00:30:20,790 --> 00:30:23,310 So hierdie probleem gaan om te styg, al is, weer. 749 00:30:23,310 --> 00:30:24,830 >> Dink ek maak hierdie program. 750 00:30:24,830 --> 00:30:27,670 Kom ons kyk of ons nou kan voorspel Wat is verkeerd met hierdie kode. 751 00:30:27,670 --> 00:30:31,140 So in hierdie program, kopieer-0, ek is gaan om voort te gaan en weer 'n beroep 752 00:30:31,140 --> 00:30:34,190 GetString en die stoor van die waarde in s. 753 00:30:34,190 --> 00:30:38,800 >> En dan, waarom doen ek dit, net as 'n herinnering van weke verlede? 754 00:30:38,800 --> 00:30:40,960 Ons het gesê dat GetString soms terugkeer null. 755 00:30:40,960 --> 00:30:42,793 Wat beteken dit as GetString terug nul? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Iets het skeefgeloop. 758 00:30:46,034 --> 00:30:48,950 Dit beteken waarskynlik die string te groot, die rekenaar se geheue. 759 00:30:48,950 --> 00:30:51,724 Dit gebeur super, super, super selde, maar dit kan gebeur. 760 00:30:51,724 --> 00:30:53,890 Ons wil om te kyk vir dit, en dit is al wat ons doen. 761 00:30:53,890 --> 00:30:57,910 >> Omdat ons nou sal sien, as jy dit nie doen nie begin nagaan gewoonlik vir dinge 762 00:30:57,910 --> 00:31:00,870 soos nul is, kan jy eintlik begin om te gaan 763 00:31:00,870 --> 00:31:03,106 om adresse in die geheue wat ongeldig. 764 00:31:03,106 --> 00:31:05,980 En jy gaan om te begin induserende meer en meer segmentering foute. 765 00:31:05,980 --> 00:31:08,360 Of in 'n Mac of 'n rekenaar, net veroorsaak dat 'n rekenaar op te hang 766 00:31:08,360 --> 00:31:10,340 of 'n program te vries, potensieel. 767 00:31:10,340 --> 00:31:14,930 >> So nou, ek eis in kopie-0.C, dat ek ek gaan die snare te kopieer deur middel 768 00:31:14,930 --> 00:31:15,685 lyn 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 En dan, ek gaan te eis aan die onderkant 771 00:31:18,750 --> 00:31:21,430 hier waar ek gaan een van hulle te verander. 772 00:31:21,430 --> 00:31:22,330 >> So dit agterkom. 773 00:31:22,330 --> 00:31:24,370 Ek bel ons ou vriend strlen. 774 00:31:24,370 --> 00:31:28,960 En net in Engels uit wat hierdie lyn 34 doen? 775 00:31:28,960 --> 00:31:32,480 Wat beteken t bracket 0 verteenwoordig op die linkerkant. 776 00:31:32,480 --> 00:31:32,980 Ja. 777 00:31:32,980 --> 00:31:34,339 >> Publiek: eerste karakter van t? 778 00:31:34,339 --> 00:31:35,880 David J. Malan eerste karakter van t. 779 00:31:35,880 --> 00:31:36,379 Dit is dit. 780 00:31:36,379 --> 00:31:40,024 Eerste karakter van t, ek wil die hoofletters weergawe te wys 781 00:31:40,024 --> 00:31:41,190 van die eerste karakter in t. 782 00:31:41,190 --> 00:31:43,200 So dit is kapitaliseer die eerste letter. 783 00:31:43,200 --> 00:31:46,340 En dan, die laaste ding wat ek doen in hierdie program is Ek eis hier is 784 00:31:46,340 --> 00:31:50,340 die oorspronklike, s, en hier is die afskrif, t. 785 00:31:50,340 --> 00:31:54,610 >> Maar op grond van die storie het ons net vertel wat snare werklik is, 786 00:31:54,610 --> 00:31:57,520 wat lyn 28 regtig doen, en wat is 787 00:31:57,520 --> 00:31:59,405 die gevolglike fout gaan te wees op die skerm? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> So die eerste, die eerste vraag, 28. 790 00:32:03,500 --> 00:32:09,040 Wat is string t = s regtig doen? 791 00:32:09,040 --> 00:32:16,430 As ons op die linker-hand kant hier string t = s; 792 00:32:16,430 --> 00:32:19,400 wat gee my 'n boks hier en een box hier. 793 00:32:19,400 --> 00:32:25,530 En veronderstel is hierdie adres 0x, kom ons sê, 50 hierdie tyd, arbitrêr. 794 00:32:25,530 --> 00:32:28,847 Wat doen string s t = doen onder die enjinkap? 795 00:32:28,847 --> 00:32:30,340 >> Publiek: [onhoorbaar] 796 00:32:30,340 --> 00:32:34,100 >> David J. Malan Dit slaan die geheue daar spreek, so 0x50 gaan daar. 797 00:32:34,100 --> 00:32:37,980 So as nou, ek gaan na die eerste karakter in t en hoofletters nie, 798 00:32:37,980 --> 00:32:39,535 wat ek doen effektief te s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Ek is regtig dieselfde ding doen, reg? 801 00:32:43,450 --> 00:32:47,680 Want as Adres 0x50-- en net ek het nie baie ruimte op die bord hier 802 00:32:47,680 --> 00:32:51,750 maar aanvaar dat dit is 0x50 hier, iewers in my rekenaar se geheue. 803 00:32:51,750 --> 00:32:55,825 >> En ek het, byvoorbeeld, Gabe met klein hier, soos hierdie. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 En ek het gesê t bracket 0 kry gekapitaliseer. 806 00:33:01,980 --> 00:33:04,860 Wel, t bracket 0 is die eerste letter in t. 807 00:33:04,860 --> 00:33:07,840 So min g gaan word groot G. Maar die probleem 808 00:33:07,840 --> 00:33:09,410 word, wat beteken s ook verwys na? 809 00:33:09,410 --> 00:33:10,300 >> Publiek: Die dieselfde. 810 00:33:10,300 --> 00:33:11,841 >> David J. Malan presies dieselfde ding. 811 00:33:11,841 --> 00:33:16,342 So 'n eenvoudige verduideliking miskien, selfs al is die sintaksis is 'n bietjie vreemd. 812 00:33:16,342 --> 00:33:17,050 So laat ons dit doen. 813 00:33:17,050 --> 00:33:20,210 Maak kopie-0 en ./copy-0 dan. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Sê iets: Gabe. 816 00:33:24,110 --> 00:33:26,760 En ongelukkig, beide van hulle het nou gekapitaliseer 817 00:33:26,760 --> 00:33:29,500 maar om die onderliggende Daarom dat ons net 818 00:33:29,500 --> 00:33:32,350 nou die hantering van adresse. 819 00:33:32,350 --> 00:33:36,470 >> So hoe begin ons te address-- geen woordspeling intended-- 820 00:33:36,470 --> 00:33:39,270 hoe begin ons aan te spreek hierdie spesifieke probleem? 821 00:33:39,270 --> 00:33:44,400 Wel, in copy1.c, dinge gaan om 'n bietjie meer ingewikkeld. 822 00:33:44,400 --> 00:33:49,310 Maar ek sou beweer 'n konseptueel eenvoudige oplossing. 823 00:33:49,310 --> 00:33:50,852 >> So moeilik om te kry op die eerste oogopslag. 824 00:33:50,852 --> 00:33:53,560 Gaan nie maklik vir die eerste wees tyd wat jy dit uit tik, miskien, 825 00:33:53,560 --> 00:33:57,440 maar as die probleem is dat eenvoudig doen t = s net 826 00:33:57,440 --> 00:33:59,694 afskrifte van die adres, wat, weer as ek kan kies op jou, 827 00:33:59,694 --> 00:34:02,110 gaan die oplossing wees vir eintlik kopiëring van 'n string? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> Publiek: Ons sal waarskynlik Gebruik 'n lus weer. 830 00:34:06,770 --> 00:34:06,890 >> David J. Malan Ja. 831 00:34:06,890 --> 00:34:08,390 So ons gaan 'n lus om weer nodig het. 832 00:34:08,390 --> 00:34:11,800 En omdat as ons wil kopieer 'n string s in 'n ander string, 833 00:34:11,800 --> 00:34:14,120 ons waarskynlik wil om dit te doen karakter deur karakter. 834 00:34:14,120 --> 00:34:17,199 Maar die probleem is, as Dit is oorspronklik s, 835 00:34:17,199 --> 00:34:22,159 nou moet ons uitdruklik begin toekenning van geheue vir t. 836 00:34:22,159 --> 00:34:24,320 >> Met ander woorde, laat Teken hierdie 'n laaste keer. 837 00:34:24,320 --> 00:34:28,659 As dit is n string s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 En laat ons hierdie hier, as well. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Dit is GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 En dan, die foto vir iets soos dit gaan as voorheen, 844 00:34:43,860 --> 00:34:44,360 g-'n-b-e / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Dit lyk 'n bietjie iets soos hierdie. 847 00:34:48,960 --> 00:34:53,650 En is dus ons noem dit 0x50, en wat gaan wees 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> So dit is 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 En dan, ek doen string t. 851 00:34:59,690 --> 00:35:02,450 In die geheue, wat net gaan gee my 'n bietjie vierkante soos hierdie. 852 00:35:02,450 --> 00:35:04,080 So, wat is die sleutel stap nou? 853 00:35:04,080 --> 00:35:09,870 As ek wil s in t te kopieer, wat leeg moet ons hier te vul? 854 00:35:09,870 --> 00:35:12,050 Of wat moet ons doen op 'n hoë vlak? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Ja? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Iemand? 859 00:35:17,020 --> 00:35:17,690 Ja. 860 00:35:17,690 --> 00:35:19,214 >> Publiek: Ons moet [onhoorbaar]. 861 00:35:19,214 --> 00:35:21,380 David J. Malan Ja, ons moet in hierdie leeg te vul. 862 00:35:21,380 --> 00:35:24,340 Ek kan nie kopieer en dan kapitaliseer Gabe se naam 863 00:35:24,340 --> 00:35:28,120 totdat ek vra die bedryfstelsel vir 'n ander deel van die geheue 864 00:35:28,120 --> 00:35:30,640 dit is ten minste so groot soos die oorspronklike. 865 00:35:30,640 --> 00:35:32,130 Sodat ons met 'n vraag. 866 00:35:32,130 --> 00:35:36,080 >> Hoe vra ek die bedryfstelsel nie net vir 'n eenvoudige klein pointer-- 867 00:35:36,080 --> 00:35:38,530 as dit genoem word, 'n adres, 'n pointer-- nie 868 00:35:38,530 --> 00:35:40,980 vir 'n eenvoudige klein boks soos hierdie sogenaamde string? 869 00:35:40,980 --> 00:35:44,200 Hoe vra ek die bedryfstelsel stelsel vir 'n groot deel van die geheue? 870 00:35:44,200 --> 00:35:48,430 So ver, het ek net dit terug gekry indirek deur die roeping van GetString. 871 00:35:48,430 --> 00:35:50,740 So, hoe is GetString selfs om sy geheue? 872 00:35:50,740 --> 00:35:53,430 >> Wel, dit blyk dat daar hierdie ander funksie hier 873 00:35:53,430 --> 00:35:55,160 dat ons nou sal begin om te gebruik. 874 00:35:55,160 --> 00:35:59,780 Nou, dit lyk manier om meer kriptiese than-- en ek is die enigste een wat kan sien it-- 875 00:35:59,780 --> 00:36:03,150 hierdie lyn lyk manier om meer kripties dan met die eerste oogopslag dit moet. 876 00:36:03,150 --> 00:36:04,650 Maar laat ons terg dit uitmekaar. 877 00:36:04,650 --> 00:36:07,950 >> Op die linkerkant, ek het kar * t. 878 00:36:07,950 --> 00:36:13,280 So in Engels, laat ons begin te formuleer behoorlike sinne in die tegniese jargon. 879 00:36:13,280 --> 00:36:19,757 So dit is die toekenning van 'n veranderlike van tipe char * genoem t. 880 00:36:19,757 --> 00:36:21,090 Nou, wat beteken dit werklik? 881 00:36:21,090 --> 00:36:23,881 >> Wel, dit beteken, wat gaan ek te sit in hierdie veranderlike genoem t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 'N adres van 'n kar. 884 00:36:26,402 --> 00:36:28,360 So dit is net die eenvoudiger, meer redelike manier 885 00:36:28,360 --> 00:36:29,930 van die beskrywing van die linkerkant. 886 00:36:29,930 --> 00:36:32,890 So wat skep hierdie boks hier net. 887 00:36:32,890 --> 00:36:34,760 So die regterkant, vermoedelik, gaan 888 00:36:34,760 --> 00:36:37,170 toe te ken wat groter stuk van die geheue hoe? 889 00:36:37,170 --> 00:36:38,340 So laat se terg hierdie uitmekaar. 890 00:36:38,340 --> 00:36:41,131 >> Dit is oorweldigend op die eerste oogopslag, maar wat binne aangaan hier? 891 00:36:41,131 --> 00:36:43,740 Eerstens, daar is malloc, wat is glo ons nuwe vriend, 892 00:36:43,740 --> 00:36:45,450 "Geheue toeken." 893 00:36:45,450 --> 00:36:49,560 So dit is die argument wat geslaag in dit, so dit is 'n mooi groot argument. 894 00:36:49,560 --> 00:36:50,970 So laat se terg hierdie uitmekaar. 895 00:36:50,970 --> 00:36:53,410 >> strlen van s, natuurlik, verteenwoordig the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Publiek: Die aantal karakters. 898 00:36:55,600 --> 00:36:56,710 David J. Malan Net die aantal karakters in s. 899 00:36:56,710 --> 00:36:59,040 So het die lengte van s, die oorspronklike string. 900 00:36:59,040 --> 00:37:00,350 So G-'n-b-e. 901 00:37:00,350 --> 00:37:02,320 So is dit waarskynlik vier in hierdie geval. 902 00:37:02,320 --> 00:37:05,485 Hoekom doen ek 1 na roep strlen van s? 903 00:37:05,485 --> 00:37:06,360 Publiek: [onhoorbaar] 904 00:37:06,360 --> 00:37:07,590 David J. Malan Vir daardie spesiale null karakter. 905 00:37:07,590 --> 00:37:11,260 As jy my vra wat is die lengte van Gabe se naam, ek gaan om te sê vier. 906 00:37:11,260 --> 00:37:14,480 Onder die enjinkap, alhoewel, ek nodig het die vyfde byte vir die null karakter. 907 00:37:14,480 --> 00:37:16,100 So dit is waarom ek doen die 1. 908 00:37:16,100 --> 00:37:21,730 >> Nou net in geval jy is besig om hierdie program op 'n ander as die rekenaar, sê, 909 00:37:21,730 --> 00:37:24,610 die CS50 toestel, waar die grootte van 'n kar 910 00:37:24,610 --> 00:37:26,350 dalk anders wees uit my eie computer-- 911 00:37:26,350 --> 00:37:30,590 blyk dat ek dit kan noem operateur sizeof, vra net die rekenaar, 912 00:37:30,590 --> 00:37:32,870 Wat is die grootte van 'n char op hierdie rekenaar? 913 00:37:32,870 --> 00:37:37,400 >> En vermenigvuldig vyf in hierdie byvoorbeeld deur die grootte van 'n kar, wat 914 00:37:37,400 --> 00:37:40,440 op die meeste rekenaars sal net een wees, malloc 915 00:37:40,440 --> 00:37:44,830 gaan wys vir my 'n groot stuk van die geheue hier aan die regterkant. 916 00:37:44,830 --> 00:37:47,140 En dit gaan return-- dit is 'n function-- so dit is 917 00:37:47,140 --> 00:37:48,265 gaan om terug te keer na my wat? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 Publiek: Die adres? 920 00:37:51,830 --> 00:37:53,709 David J. Malan Die adres van wat? 921 00:37:53,709 --> 00:37:55,250 Publiek: Van die geheue dit toegeken? 922 00:37:55,250 --> 00:37:56,450 David J. Malan Van die geheue dit toegeken is. 923 00:37:56,450 --> 00:37:59,189 So ek het geen idee, eerlik, waar dit gaan eindig. 924 00:37:59,189 --> 00:38:01,480 Ek is van plan om dit te stel dit gaan eindig by 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Heeltemal arbitrêre, maar iewers anders as 0x50, 927 00:38:06,009 --> 00:38:08,800 omdat die bedryfstelsel, wat Windows en Mac OS vir my doen, is 928 00:38:08,800 --> 00:38:11,230 seker te maak dat dit wat my verskillende stukke van die geheue. 929 00:38:11,230 --> 00:38:14,210 >> So dit is die waarde waar dit stuk van die geheue kan beland. 930 00:38:14,210 --> 00:38:16,060 So dit is wat eindig in hier, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 So nou duidelik, ek kan verstaan dat dit nie dieselfde is as dit, 933 00:38:21,570 --> 00:38:23,960 omdat hulle te wys op verskillende dele van die geheue. 934 00:38:23,960 --> 00:38:29,980 So as ek nou eintlik wil dit kopieer in, laat ons doen om jou voorgestelde oplossing. 935 00:38:29,980 --> 00:38:36,870 >> Kom ons loop net, skep 'n lus vir die, en doen t bracket i kry s bracket i. 936 00:38:36,870 --> 00:38:39,760 Want nou kan ek hierdie reeks-agtige notasie, 937 00:38:39,760 --> 00:38:43,390 want selfs al malloc baie generies ken my geheue, 938 00:38:43,390 --> 00:38:45,290 geheue is net aangrensende grepe. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, rug aan rug aan rug. 940 00:38:47,240 --> 00:38:50,030 >> Ek kan sekerlik as 'n programmeerder hanteer dit as 'n skikking, wat 941 00:38:50,030 --> 00:38:55,090 beteken dat ek kan gebruik om die finaal bekend notering van net 'n paar vierkante hakies. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> So laat my daar breek, want dit is 'n baie op een slag, selfs 944 00:39:00,020 --> 00:39:03,530 Hoewel die basiese idee om herhaling is dat string, al hierdie tyd, 945 00:39:03,530 --> 00:39:05,550 is nie 'n nuwe datatipe per se. 946 00:39:05,550 --> 00:39:10,150 Dit is net 'n sogenaamde wyser, 'n adres van 'n karakter, 947 00:39:10,150 --> 00:39:12,650 wat net beteken dit is 'n aantal wat deur menslike konvensie 948 00:39:12,650 --> 00:39:15,350 ons geneig as 0x om iets te skryf. 949 00:39:15,350 --> 00:39:18,590 >> Maar dit is net 'n nommer, soos 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 wat gebeur met die wees CS gebou se adres. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Enige vrae oor hierdie inligting? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Ja? 955 00:39:25,289 --> 00:39:28,530 >> Publiek: Hoekom doen ons kyk vir t gelyk aan NULL? 956 00:39:28,530 --> 00:39:30,740 >> David J. Malan Hoekom doen ons gaan vir t gelyk aan NULL? 957 00:39:30,740 --> 00:39:33,250 As ons lees die documentation-- groot question-- vir malloc, 958 00:39:33,250 --> 00:39:37,020 dit gaan om te sê in fynskrif, soms malloc kan terugkeer null, 959 00:39:37,020 --> 00:39:38,080 net soos GetString. 960 00:39:38,080 --> 00:39:41,820 En inderdaad, GetString terugkeer null As, op sy beurt, malloc terugkeer null, 961 00:39:41,820 --> 00:39:43,130 omdat GetString gebruik malloc. 962 00:39:43,130 --> 00:39:46,400 >> En dit kan gebeur as die bedryfstelsel, Mac OS, Windows, wat ook al, is eenvoudig 963 00:39:46,400 --> 00:39:48,130 geheue vir jou. 964 00:39:48,130 --> 00:39:49,820 So dit is wat daar gebeur het. 965 00:39:49,820 --> 00:39:52,910 >> En laat my openbaar 'n ander ding wat dalk net jou verstand te blaas 966 00:39:52,910 --> 00:39:55,100 of heeltemal te ver oor die lyn wees. 967 00:39:55,100 --> 00:39:59,770 Maar laat my toe om die Dieselfde geld vir lus vir die kopiëring, 968 00:39:59,770 --> 00:40:05,480 wat 'n oomblik gelede, onthou was hierdie. t bracket i kry s bracket i. 969 00:40:05,480 --> 00:40:06,740 >> Nice en gebruikersvriendelik. 970 00:40:06,740 --> 00:40:09,330 Voel soos Week Twee weer. 971 00:40:09,330 --> 00:40:14,920 Maar hierdie weergawe eintlik kan wees herskryf as hierdie, wat kriptiese lyk. 972 00:40:14,920 --> 00:40:18,280 Dit is 'n tegniek genoem wyser rekenkundige, adres rekenkundige. 973 00:40:18,280 --> 00:40:19,600 Maar hoekom werk dit? 974 00:40:19,600 --> 00:40:22,220 >> Nou lastig, die skrywers van C besluit om te gebruik 975 00:40:22,220 --> 00:40:25,070 die * simbool vir verskillende doeleindes. 976 00:40:25,070 --> 00:40:29,020 Ons het gesien dat dit reeds gebruik een keer, char *, wat beteken "gee my 'n veranderlike 977 00:40:29,020 --> 00:40:31,210 wat gaan om te bevat die adres van 'n kar. " 978 00:40:31,210 --> 00:40:33,990 So kar * in hierdie konteks beteken "gee my 'n veranderlike." 979 00:40:33,990 --> 00:40:40,050 >> Ongelukkig, as jy gebruik maak van die * sonder 'n woord in die voorkant van dit, soos kar, 980 00:40:40,050 --> 00:40:41,905 dit is nou bekend as die dereference operateur. 981 00:40:41,905 --> 00:40:43,530 En ons sal meer hiervan sien voor lank. 982 00:40:43,530 --> 00:40:44,930 Maar dit beteken net "daar gaan." 983 00:40:44,930 --> 00:40:49,070 Dit is soos om te sê, as iemand my oorhandig op 'n stuk papier "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 as ek dit doen "* 33 Oxford Street," wat beteken "Gaan op die pad na die CS gebou." 985 00:40:53,830 --> 00:40:57,220 >> So * net beteken dat daar as gaan daar is geen woord in die voorkant van dit. 986 00:40:57,220 --> 00:40:59,100 So, wat is t, duidelik te wees? 987 00:40:59,100 --> 00:41:03,250 t is die adres van die stuk van geheue wat terug gegee is aan my. 988 00:41:03,250 --> 00:41:06,650 s is die adres van wat, om duidelik te wees, in die voorbeeld wat ons het bespreek, 989 00:41:06,650 --> 00:41:07,500 van klein Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s is die adres of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 Publiek: Die string. 994 00:41:12,460 --> 00:41:14,126 David J. Malan Van Gabe se oorspronklike naam. 995 00:41:14,126 --> 00:41:16,660 So dit is die adres van hierdie stuk van die geheue. 996 00:41:16,660 --> 00:41:22,220 So as ek sê t + i-- i, kennisgewing, is net ons ou vriend. 997 00:41:22,220 --> 00:41:24,770 Dis net 'n indeks veranderlike dit is iterating van nul op tot 998 00:41:24,770 --> 00:41:26,960 die lengte van die string s. 999 00:41:26,960 --> 00:41:30,367 So dit gaan wees nul is, dan een, dan twee, dan drie, dan vier. 1000 00:41:30,367 --> 00:41:33,200 So laat ons vergader om hierdie nuwe Kras soos legkaart stukke, as jy wil, 1001 00:41:33,200 --> 00:41:36,140 selfs al is, weer, die sintaksis is veel meer arcane as nuuts af. 1002 00:41:36,140 --> 00:41:39,522 So t is 'n adres + Ek gaan my te gee 1003 00:41:39,522 --> 00:41:42,480 'n groot aantal, omdat hulle is almal getalle wat ons het is die tekens as blok. 1004 00:41:42,480 --> 00:41:43,560 Maar hulle is net nommers. 1005 00:41:43,560 --> 00:41:49,960 >> Dus, as die adres van t ons gesê was 0x88, wat is 0x88 plus nul. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Selfs al is jy nie gemaklik met Hex nog, neem 'n raaiskoot. 1008 00:41:53,980 --> 00:41:54,410 >> Publiek: Die oorspronklike. 1009 00:41:54,410 --> 00:41:55,850 >> David J. Malan Nog 0x88. 1010 00:41:55,850 --> 00:41:58,910 So wat beteken * 0x88 beteken? 1011 00:41:58,910 --> 00:42:02,670 Dit beteken, "gaan daar", wat beteken effektief, "Bring jou vinger hier." 1012 00:42:02,670 --> 00:42:06,930 En nou op die regterkant van die hierdie uitdrukking, * en dan in parens, 1013 00:42:06,930 --> 00:42:11,586 s + i beteken s, wat is die spreek hier van die min g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 is, natuurlik, is, wat s is. 1015 00:42:16,220 --> 00:42:21,230 >> So nou, dit is * s, wat net soos * 33 Oxford Street beteken gaan na die adres 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 So hier is die vinger regterhand. 1018 00:42:24,170 --> 00:42:26,050 So wat gaan ek te kopieer in wat? 1019 00:42:26,050 --> 00:42:30,260 Die ding op die regte wat Gabe, min g hier, in hier. 1020 00:42:30,260 --> 00:42:32,750 >> En so het die uitwerking van daardie eerste iterasie van die lus, 1021 00:42:32,750 --> 00:42:36,200 as jy voorgestel het, selfs al is dit lyk gek meer ingewikkeld as enigiets 1022 00:42:36,200 --> 00:42:42,110 ons reeds gesien het, is eenvoudig te sê hier en kopieer daardie karakter hier. 1023 00:42:42,110 --> 00:42:44,700 Dit gee jou 'n kaart vir beide plekke. 1024 00:42:44,700 --> 00:42:46,130 >> En ons sal baie meer van hierdie sien. 1025 00:42:46,130 --> 00:42:50,600 Maar vir nou, die hoop is net te stel sommige van hierdie basiese idees. 1026 00:42:50,600 --> 00:42:53,550 En inderdaad, laat ons kyk na een finale program hier, 1027 00:42:53,550 --> 00:42:57,480 en dan die beloofde claymation, wat alles reg sal maak. 1028 00:42:57,480 --> 00:42:57,980 Alle regte. 1029 00:42:57,980 --> 00:43:01,680 So laat my daar gaan ons oop up--. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 So laat sy tweeën sal ons terugkom na hierdie prentjie voor lank. 1032 00:43:05,440 --> 00:43:08,360 Laat my oopmaak hierdie laaste voorbeeld hier. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> So hier is 'n super, super program wat accomplishes 1035 00:43:12,710 --> 00:43:15,050 niks in die lewe wat nie die volgende. 1036 00:43:15,050 --> 00:43:18,740 Dit verklaar die eerste twee veranderlikes, x en y, wat nie nommers hierdie tyd, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 Hulle is nie heelgetalle, per se. 1039 00:43:20,448 --> 00:43:22,899 Hulle is blykbaar int *. 1040 00:43:22,899 --> 00:43:25,690 So net iemand, wat beteken dit As jou data tipe, jou veranderlike, 1041 00:43:25,690 --> 00:43:26,860 is van die tipe int * ster? 1042 00:43:26,860 --> 00:43:30,240 Dit is die adres van 'n int. 1043 00:43:30,240 --> 00:43:31,990 >> So ek het geen idee waar dit is nie. 1044 00:43:31,990 --> 00:43:35,150 Dit beteken net "sit, uiteindelik, die adres van 'n int hier. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, waar dit in geheue, is 'n adres gaan daar. 1046 00:43:38,340 --> 00:43:40,200 En dit is wat y is gaan wees, as well. 1047 00:43:40,200 --> 00:43:44,920 >> As ek sê nou x = malloc (sizeof (int)), dit is 'n fancy manier om te sê, 1048 00:43:44,920 --> 00:43:49,000 hey bedryfstelsel, via malloc, gee my genoeg geheue vir die grootte 1049 00:43:49,000 --> 00:43:52,370 van 'n int, wat waarskynlik gaan wees 32 stukkies of vier grepe. 1050 00:43:52,370 --> 00:43:53,680 >> So wat beteken malloc terugkeer? 1051 00:43:53,680 --> 00:43:55,250 Malloc gee 'n adres. 1052 00:43:55,250 --> 00:43:57,020 So wat gaan gestoor kry in x? 1053 00:43:57,020 --> 00:44:00,600 Die adres van die stuk van geheue, die vier grepe, wat malloc 1054 00:44:00,600 --> 00:44:03,360 net gevind vir my deur te vra die bedryfstelsel. 1055 00:44:03,360 --> 00:44:08,240 >> Nou intussen lyn vier hier, die * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Net om duidelik te wees, wat af gaan daar? 1057 00:44:09,990 --> 00:44:11,530 Op die linkerkant, * x. 1058 00:44:11,530 --> 00:44:13,610 dit is soos * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 So * x beteken wat? 1060 00:44:15,523 --> 00:44:16,450 >> Publiek: Gaan na. 1061 00:44:16,450 --> 00:44:17,908 >> David J. Malan Gaan na daardie adres. 1062 00:44:17,908 --> 00:44:20,466 Waar wat deel van geheue is, gaan na dit. 1063 00:44:20,466 --> 00:44:21,979 En dit wat daar is, natuurlik? 1064 00:44:21,979 --> 00:44:22,520 Publiek: 42. 1065 00:44:22,520 --> 00:44:23,580 David J. Malan 42. 1066 00:44:23,580 --> 00:44:25,650 Alle reg, * y, dieselfde idee. 1067 00:44:25,650 --> 00:44:26,860 Gaan na die adres in y. 1068 00:44:26,860 --> 00:44:31,740 Plaas die nommer 13 is daar, maar wat is y op die oomblik? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 GEHOOR: Daar is geen geheue vir y. 1071 00:44:34,630 --> 00:44:35,710 David J. Malan Daar geen geheue vir y. 1072 00:44:35,710 --> 00:44:38,215 So, wat doen y waarskynlik bevat, soos ons het gesê? 1073 00:44:38,215 --> 00:44:38,520 >> Publiek: gemors. 1074 00:44:38,520 --> 00:44:39,480 >> David J. Malan Sommige vullis waarde. 1075 00:44:39,480 --> 00:44:41,320 Nou, vullis waarde is nog steeds 'n aantal. 1076 00:44:41,320 --> 00:44:43,160 Dit kan nog steeds verkeerd vir 'n adres. 1077 00:44:43,160 --> 00:44:45,160 Dit is asof iemand gekrap iets neer, 1078 00:44:45,160 --> 00:44:48,002 en ek verkeerd dit as betekenis paar gebou in die straat af. 1079 00:44:48,002 --> 00:44:50,460 En as jy net probeer om te gaan in sommige gebou wat jy nie het nie, 1080 00:44:50,460 --> 00:44:53,710 of 'n stuk van die geheue wat jy nie het nie gegee is, kan slegte dinge gebeur. 1081 00:44:53,710 --> 00:44:57,740 Rekenaar kan crash, of 'n ander onbepaalde gedrag kan gebeur. 1082 00:44:57,740 --> 00:45:01,310 >> So het die intro, dan, te Binky is dit. 1083 00:45:01,310 --> 00:45:04,290 Ek onthou nog, 20 'n paar vreemde jaar later, 1084 00:45:04,290 --> 00:45:07,200 waar ek was toe ek uiteindelik verstaan ​​wysers. 1085 00:45:07,200 --> 00:45:09,520 >> Dit wil sê, as jy verlaat hier in drie minute 1086 00:45:09,520 --> 00:45:12,170 en ek dink ek doen nie wysers verstaan, besef 1087 00:45:12,170 --> 00:45:14,410 Ek onthou 20 jaar vir 'n paar gek rede 1088 00:45:14,410 --> 00:45:17,140 wanneer en waarom dit uiteindelik gesink in, sit met my onderrig 1089 00:45:17,140 --> 00:45:19,501 mede, NISHAT Mehta in die agterkant van Eliot eetsaal. 1090 00:45:19,501 --> 00:45:21,250 Nou het ek gedink want dit was 1091 00:45:21,250 --> 00:45:23,920 een van die onderwerpe wat ek in veral gesukkel het. 1092 00:45:23,920 --> 00:45:26,470 En dan is dit uiteindelik gebruik het, soos ek waag om te sê 'n baie onderwerpe 1093 00:45:26,470 --> 00:45:27,460 Uiteindelik sal. 1094 00:45:27,460 --> 00:45:32,590 En nou, te maak dat al die voel gelukkiger en al hoe meer oortuigend, 1095 00:45:32,590 --> 00:45:35,360 Kom ons neem 'n finale blik in ons laaste drie minute hier by Binky, 1096 00:45:35,360 --> 00:45:37,675 van ons vriend, Nick Parlante van Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [Video speel] 1099 00:45:41,580 --> 00:45:42,750 >> Hey, Binky. 1100 00:45:42,750 --> 00:45:43,500 Wakker te word! 1101 00:45:43,500 --> 00:45:45,960 Dit is tyd vir wyser pret. 1102 00:45:45,960 --> 00:45:47,012 >> -Wat Is dit? 1103 00:45:47,012 --> 00:45:48,723 Meer inligting oor die riglyne? 1104 00:45:48,723 --> 00:45:50,580 O, goody! 1105 00:45:50,580 --> 00:45:53,563 >> -Goed, Om te begin, ek dink ons ​​is gaan 'n paar wenke om te nodig het. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Hierdie kode ken twee wysers, wat kan verwys na heelgetalle. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Wel, ek sien die twee wysers, maar hulle nie blyk te wees verwys na enigiets. 1110 00:46:02,140 --> 00:46:02,980 >> -Dat is reg. 1111 00:46:02,980 --> 00:46:05,100 Aanvanklik, wysers nie wys nie enigiets. 1112 00:46:05,100 --> 00:46:08,030 Die dinge wat hulle wys te word genoem pointees, en die opstel van hulle op se 1113 00:46:08,030 --> 00:46:09,370 'n aparte stap. 1114 00:46:09,370 --> 00:46:10,220 >> -OH, Regs, regs. 1115 00:46:10,220 --> 00:46:10,950 Ek het geweet dat. 1116 00:46:10,950 --> 00:46:12,385 Die pointees geskei. 1117 00:46:12,385 --> 00:46:14,315 Daar, so hoe ken jy nie 'n pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Wel, die kode ken 'n nuwe heelgetal pointee, 1121 00:46:18,970 --> 00:46:20,950 en hierdie deel stelle x te wys om dit te. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hey, wat lyk beter. 1124 00:46:23,230 --> 00:46:25,060 So maak dit iets te doen. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Ek sal dereference die wyser x slaan die nommer 42 in sy pointee. 1127 00:46:30,455 --> 00:46:32,830 Vir hierdie truuk, sal ek moet my Towerstaffie van Dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> Your towerstaffie van Dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 That-- dit is groot. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Nie, dit is wat die kode lyk. 1134 00:46:41,080 --> 00:46:44,110 Ek sal net die opstel van die aantal, en [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hey, kyk. 1136 00:46:44,700 --> 00:46:46,140 Daar gaan dit. 1137 00:46:46,140 --> 00:46:50,980 >> -So doen 'n dereference op x volg die pyl om toegang te verkry om sy pointee. 1138 00:46:50,980 --> 00:46:53,160 In hierdie geval, 'n winkel 42 in daar. 1139 00:46:53,160 --> 00:46:57,710 Hey probeer om dit te gebruik om die getal te stoor 13 deur die ander wyser, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Ek sal net gaan hier aan y, en kry die nommer 13 ingestel. 1142 00:47:03,270 --> 00:47:07,930 En dan, neem die Wand van Dereferencing en net [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> -OH! 1144 00:47:08,960 --> 00:47:09,500 >> -OH, Hey! 1145 00:47:09,500 --> 00:47:11,090 Dit het nie gewerk nie. 1146 00:47:11,090 --> 00:47:15,630 Sê Binky, ek dink nie dereferencing y is 'n goeie idee nie, want jy weet, 1147 00:47:15,630 --> 00:47:17,850 die opstel van die pointee is 'n aparte stap. 1148 00:47:17,850 --> 00:47:20,450 En ek dink nie ons ooit gedoen het. 1149 00:47:20,450 --> 00:47:21,480 >> -goeie Punt. 1150 00:47:21,480 --> 00:47:21,980 -Yeah. 1151 00:47:21,980 --> 00:47:25,680 Ons toegeken die wyser y, maar ons nooit sit dit om te wys op 'n pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Baie Oplettend. 1154 00:47:28,616 --> 00:47:30,240 Hey, jy lyk goed daar, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kan jy dit regmaak so dat y punte dieselfde pointee as x? 1156 00:47:33,400 --> 00:47:34,000 >> -Sure. 1157 00:47:34,000 --> 00:47:36,780 Ek sal my towerstaffie gebruik van Pointer Opdrag. 1158 00:47:36,780 --> 00:47:38,740 >> -Is Wat gaan wees 'n probleem soos tevore? 1159 00:47:38,740 --> 00:47:39,240 -Geen. 1160 00:47:39,240 --> 00:47:40,660 Dit beteken nie raak die pointees. 1161 00:47:40,660 --> 00:47:44,450 Dit verander net een wyser na verwys na dieselfde ding as 'n ander. 1162 00:47:44,450 --> 00:47:45,450 >> -OH, Sien ek. 1163 00:47:45,450 --> 00:47:48,200 Nou y punte na dieselfde plek as x. 1164 00:47:48,200 --> 00:47:48,910 So wag. 1165 00:47:48,910 --> 00:47:49,950 Nou, is y vasgestel. 1166 00:47:49,950 --> 00:47:51,120 Dit het 'n pointee. 1167 00:47:51,120 --> 00:47:54,510 So jy kan probeer om die Wand van Dereferencing weer die 13 oor te stuur. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Hier gaan dit. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hey, kyk na dit. 1171 00:47:59,340 --> 00:48:00,750 Nou dereferencing werke op y. 1172 00:48:00,750 --> 00:48:04,991 En omdat die wysers deel dat een pointee, het hulle albei sien die 13. 1173 00:48:04,991 --> 00:48:05,490 -Yeah. 1174 00:48:05,490 --> 00:48:06,870 Deel, wat ook al. 1175 00:48:06,870 --> 00:48:08,820 So gaan ons plekke nou oorskakel? 1176 00:48:08,820 --> 00:48:09,440 >> O, kyk. 1177 00:48:09,440 --> 00:48:10,830 Ons is uit die tyd. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Just Onthou die drie wyser reëls. 1180 00:48:13,530 --> 00:48:16,560 Nommer een, die basiese struktuur is dat jy 'n muis, 1181 00:48:16,560 --> 00:48:18,680 en dit wys na 'n pointee. 1182 00:48:18,680 --> 00:48:20,640 Maar die wyser en pointee is afsonderlike, 1183 00:48:20,640 --> 00:48:22,610 en die algemene fout is om 'n wyser, 1184 00:48:22,610 --> 00:48:25,000 maar om te vergeet om dit te gee 'n pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Nommer twee, wyser dereferencing begin by die wyser 1186 00:48:28,170 --> 00:48:31,050 en volg die pyl bo om toegang te verkry om sy pointee. 1187 00:48:31,050 --> 00:48:33,400 Soos ons almal weet, is dit net werk as daar 1188 00:48:33,400 --> 00:48:36,270 'n pointee, watter soort kry terug artikel nommer een. 1189 00:48:36,270 --> 00:48:39,000 >> Nommer drie, wyser opdrag neem een ​​wyser 1190 00:48:39,000 --> 00:48:42,320 en verander dit om te verwys na die dieselfde pointee as ander wyser. 1191 00:48:42,320 --> 00:48:44,160 So na die opdrag, die twee wysers 1192 00:48:44,160 --> 00:48:45,910 sal wys na dieselfde pointee. 1193 00:48:45,910 --> 00:48:47,990 Soms, dit is bekend as die deel. 1194 00:48:47,990 --> 00:48:49,740 En dit is al wat daar is om dit, regtig. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye nou. 1196 00:48:50,277 --> 00:48:51,110 [Einde video speel] 1197 00:48:51,110 --> 00:48:52,568 David J. Malan Dit is dit vir CS50. 1198 00:48:52,568 --> 00:48:55,110 Ons sal u sien volgende week. 1199 00:48:55,110 --> 00:48:56,064