1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
[Musikk spilles] DAVID J. MALAN: All right. Dette er CS50, og denne er slutten av uke Four. Og et av temaene i dag er at av digital etterforskning, kunsten å utvinne informasjon. Og ja, selv om du er midt akkurat nå of Peace på tre og Breakout, neste uke, fokuset vil være på nettopp dette domenet. 

Så en av de kuleste jobbene jeg noensinne hadde var tilbake i gradsstudier, da jeg jobbet for den lokale Middlesex County District Attorney kontor, gjør etterforskning fungere. Så egentlig, Massachusetts State Police, til tider, Ved arbeid på tilfeller ville få inn ting som harddisker og disketter og minnekort og lignende. Og de ville overlevere dem til meg og min mentor, og vårt mål var å finne bevis, hvis det var noen, av disse medier. Nå, har du kanskje sett glimt av denne verden av forensics i media, TV og filmer. Men den jobben jeg hadde, og daresay at verden, er ikke helt som du ville se det. La oss ta en titt på hva du har sikkert sett. [VIDEOAVSPILLING] -OK. Nå, la oss få en god titt på deg. 

[Musikk spilles] 

-Vent Det. Kjør det tilbake. 

-Vent Litt. Gå til høyre. -Det. Fryse det. -Full-screen. 

-OK. Fryse det. -Tighten Opp på det, vil du? 

-Vector Inn på det fyr ved bakhjulet. 

Zoome inn her på dette stedet. 

-Med Riktig utstyr, Bildet kan forstørres og skjerpet. 

Hva er det? 

-Det er en forbedring program. 

Kan du klare det opp noe? 

Jeg vet ikke. La oss forbedre den. 

-Enhance Seksjon A6. Jeg forbedret detalj, og-- -Jeg tror det er nok til å forbedre. Slipp den til skjermen min. 

-Jeg Forbedret refleksjon i øyet hennes. -Vi Kjøre dette gjennom video ekstrautstyr. 

-Edgar, Kan du forbedre dette? 

-Heng På. 

Jeg har jo jobbet med dette refleksjon. 

-Det Er noens refleksjon. 

Lysreflekterende. -Det er en refleksjon av mannens ansikt. 

-The Refleksjon! -Det er en refleksjon. Zoome inn på speilet. Du kan se en refleksjon. 

Kan du forbedre bildet herfra? Kan du forbedre det? Kan du forbedre det? Kan vi forbedre dette? Kan du forbedre det? -Vent Et sekund. Jeg skal forbedre. Zoome inn på døren. -Times 10. Zoome. -Flytt Inn. -Mer. Vent, stopp. -Slutt. -Pause Det. -Rotate Oss 75 grader rundt den vertikale, takk. 

-Slutt. Gå tilbake til den delen om døren igjen. 

-Fikk Et forbedret lydbilde som kan bitmap? 

Kanskje vi kan bruke Pradeep Singh metode for å se inn vinduene. 

-Programvaren Er state of the art. 

-The Egenverdi er av. 

-Med Høyre Kombinasjonen av algorithms-- 

Han er tatt belysning algoritmer til det neste nivå, og jeg kan bruke dem til forbedre dette fotografiet. 

-LOCK På og forstørre z-aksen. 

-Enhance. Forbedre. -Enhance. -Freeze Og styrke. [END VIDEOAVSPILLING] DAVID J. MALAN: Så de er alle ord, men de var ikke brukes i setninger på riktig måte. Og faktisk i fremtiden, når som helst, vær så snill, hører du noen si ordet, "Forbedre", humrer bare litt. Fordi når du prøver å forbedre, for eksempel, er dette hva som skjer. 

Så her er en nydelig bilde. Dette er CS50 egen Daven. Og anta at vi ønsket å fokusere på glimt i øyet, eller refleksjonen av bad guy som var tydelig fanget opp av overvåkningskamera. Dette er hva som skjer når du zoome inn på et bilde som har bare et endelig antall bits som er knyttet til den. 

Det er hva du ville få. Og ja, i Daven øye er, men fire, kanskje seks piksler at komponere nøyaktig hva var glitrende der. Så Problem Set Fire til slutt vil ha du utforske denne verden, spesielt av natur av noe vi kaller fil I / O, hvor i / o er bare en fancy måte å sier input og output. 

Så så langt, alle interaksjoner vi har hatt med en datamaskin har i stor grad vært med tastaturet og skjermen men ikke så mye med harddisken, eller lagre filer utover de du selv skrive. Programmene så langt har ikke vært å skape, og sparing, og oppdatere sine egne filer. 

Vel, hva er en fil? Vel, noe som en JPEG. Dette er et bilde du kanskje har eller laste opp til Facebook, eller se hvor som helst på nettet. Ja, det bildet vi bare sag av Daven var en JPEG. Og hva er interessant om filer som JPEG er at de kan bli identifisert, typisk, etter visse mønstre av biter. 

Med andre ord, hva er det som skiller en JPEG fra en GIF fra en PING fra et Word dokument fra en Excel-fil? Vel, det er bare annerledes mønstre. Og de forskjellige mønstre er vanligvis i begynnelsen av disse filene. 

Slik at når datamaskinen åpner et Word doc, eller når en datamaskin åpner en JPEG, det ser vanligvis på første flere bits i filen. Og hvis det gjenkjenner et mønster, den sier, oh, er dette et bilde. La meg vise det til brukeren som grafikk. Eller, oh, dette ser ut som et Word-dokument. La meg vise det til brukeren som et essay. 

Så for eksempel, JPEG, det viser seg, er ganske sofistikert under panseret. Men de tre første byte i de fleste hver JPEG starte med disse tre tall. Så byte null, en, to, og er, i de fleste hver JPEG, 255, deretter nummeret 216, deretter nummeret 255. 

Og hva vil du kunne å begynne å gjøre neste uke er faktisk poking under panseret på filer som JPEG og som bitmap-filer, og se hva har alltid vært der så lenge som du har vært å bruke en datamaskin. 

Men hva er det ikke typisk skrevet som desimaltall som dette. Dataforskere ikke tendens til å snakke i desimal. De har egentlig ikke snakke i binær. Vanligvis når vi ønsker å uttrykke tall, vi faktisk bruker heksadesimale, som du kanskje husker fra, sier Problem Set One, som utfordret du til å tenke på et annet system. 

Vi, selvfølgelig, er kjent med desimal, null til ni. Vi snakket om binær. Og vi har egentlig ikke å bruke så mye her på ut, fordi datamaskiner vil bruke det. Men programmerere vil veldig ofte, men ikke alltid, bruke heksadesimale, som bare betyr du har 16 bokstaver i alfabetet, i motsetning til to eller 10. 

Så hvordan du telle til høyere enn ni i heksadesimal? Du går 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, bare ved konvensjonen. Men kjernen er at hver Av disse er en enkelt symbol. Det er ingen 10. Det er ingen 11, per se, fordi hvert av dine sifre, akkurat som i desimal og akkurat som i binær, bør bare være et enkelt tegn, etter konvensjonen. 

Så det er da alfabetet vi har til rådighet for heksadesimale. Så hvordan ser en JPEG som om du var å skrive ut de første tre bytes ikke som desimal, men, for eksempel som en heksadesimal? Og hvorfor er hex selv alt som er nyttig? 

Vel, en rask titt på et eksempel. Så hvis jeg skriver ut biter som representerer disse desimal numbers-- dette kan være litt rusten nå fra et par uker tilbake, men den venstre og den rette er ganske enkelt. 255 var det største antallet vi kunne representere med åtte biter. Det var alle de. Så det eneste som er mildt interessant er den mellomste. Og hvis du slags gjøre ut matte, vil du utlede at, ja, at mønsteret av ett og nuller representerer 216. Så la oss bare fastsette for nå at disse er korrekte. Men hvorfor er dette interessant? 

Vel, en byte, selvfølgelig, er åtte bits. Og det viser seg at hvis du tror av en byte som to biter av fire biter, som dette. La meg bare legge til noen plass. Så før, etter. Jeg har nettopp lagt inn mellomrom for visualisering skyld her. Hvordan kan vi nå representerer i, si, heksadesimale hver quad biter, hvert sett med fire biter? 

Så for eksempel, på venstre nå har vi 1111 i binær. Hva er det nummeret i desimal, hvis du gjør ut regnestykket? Du har de plass, toere sted, The Fours sted, og åttere sted. 

PUBLIKUM: 15. DAVID J. MALAN: Det er 15. Så hvis vi gjør åtte pluss fire pluss to pluss en, får vi 15. Så jeg kunne skrive ned 15 nedenfor 1111, men hele poenget her er heksadesimale, ikke desimal. Så i stedet for å skrive ned 15, 1-5, Jeg kommer til å skrive at i hex, som hvis du tenker tilbake, hvis du har null gjennom f, hva er 15 kommer til å bli? PUBLIKUM: f. DAVID J. MALAN: Så det viser seg at det er f. Og du kan jobbe det ut ved å si: vel, hvis en er 10, så OK, er f 15. Så ja, kan vi omskrive denne samme sett med tall som f f. Og så hvis vi gjør litt matte, vi utlede at det er d. Åtte er ganske lett, fordi vi har en i det ekt sted. Og så har vi et par mer f f-tallet. 

Så hva mennesker har en tendens til å gjøre etter konvensjonen når de bruker heksadesimale er de bare skrive dette litt mer konsist, kvitte seg med det meste av det hvite området. Og bare for å være super klar til leserne om at dette er heksadesimale, den enkle konvensjonen blant mennesker er du skriver null x, som ikke har noen mening annet enn en visuell identifikasjon av, her kommer en hex tall. 

Og så setter du de to sifrene, f f i dette tilfellet, så d en, deretter f f. Så lang historie kort, heksadesimale bare har en tendens å være nyttig fordi hver av dens siffer, null gjennom f, perfekt linjer opp med et mønster av fire bits. 

Så hvis du har to heksadesimale sifre, null gjennom F, igjen og igjen, som gir deg perfekt åtte biter eller én byte. Så det er derfor det har en tendens til være konvensjonelt stoff. Det er ingen intellektuell innholdet virkelig utover det, annet enn den faktiske nytten. 

Nå JPEG er ikke den eneste filformater for grafikk. Du husker kanskje at det er filer som dette i verden, i hvert fall fra et par år tilbake. 

Så dette var faktisk installert i Windows XP på millioner av PCer verden rundt. Og dette var en bitmap fil, BMP. Og en bitmap fil, som du vil se neste uke, betyr bare et mønster av punkter, piksler som de heter, Et kart på bits, egentlig. 

Så hva er interessant, skjønt, om dette filformatet, BMP, er at under panseret, det har mer enn bare tre bytes at komponere sin header, så å snakke, de første par biter. Det faktisk ser litt komplisert ved første øyekast. Og du vil se dette i P sett. Og få noe Spesielt av denne nå er ikke så viktig, så bare det faktum at i begynnelsen av hver bitmap fil, et grafisk format, det er en hel haug med tall. 

Nå Microsoft, Forfatteren av dette formatet, en tendens til å kalle dem ting som ikke ints og tegn Flyter men ord og d ord og lengter og bytes. Så de er bare forskjellige datatyper. De er forskjellige navn for det samme. Men vil du se at i P Set Fire. 

Men dette er bare å si at hvis et menneske dobbeltklikker noen BMP-filen på sin eller hennes harddisk, og et vindu åpner opp som viser ham eller henne det bildet, som skjedde fordi drifts Systemet formodentlig merke ikke bare .BMP filtypen i filnavnet, men også det faktum at det er noen konvensjonen til mønsteret av biter helt i begynnelsen av at bitmap fil. 

Men la oss nå fokusere på slik komplisert fil, men i stedet på noe sånt som dette. Anta her i GEdit, jeg må bare begynnelsen av et program som er ganske enkelt. Jeg har fått noen inkluderer opp toppen. Nå har jeg fått # include "structs.h", men Jeg skal komme tilbake til det i et øyeblikk. Men dette er nyttig for å nå. Så dette er et program som kommer til å implementere som registrar database. Så en database av studenter, og hver elev i verden har et navn og et hus og sannsynligvis noen andre ting, men vi vil holde det enkelt. Hver student har et navn og et hus. 

Så hvis jeg ønsket å skrive en program hvis formål i livet var bare for å veksle fra null på opp til tre, hvis det er tre studenter ved Harvard University. Og jeg vil bare få ved å bruke GetString, hver elev navn og hus, og så bare skrive dem ut. 

Dette er liksom som Week One, uke to ting nå, hvor jeg bare vil ha en for løkke eller noe sånt. Og jeg vil ringe GetString noen ganger, og deretter skrive ut f et par ganger. Så hvordan kan jeg gjøre dette, skjønt, når både et navn og et hus er involvert for hver elev? 

Så mitt første instinkt kanskje være å gjøre noe som dette. Jeg kan først si, vel, gi meg, si, en rekke strenger kalt navn. Og jeg vil ikke ha en hardcode tre her. Hva ønsker jeg å sette det? Slik at studenter, fordi det er bare en konstant erklært på toppen, bare så jeg ikke trenger å hardcode tre på flere steder. På denne måten kan jeg forandre det ett sted, og det påvirker en endring overalt. Og da kan jeg gjøre string huser studenter. 

Og nå, kan jeg gjøre noe sånt for (int i = 0; i <STUDENTER, i ++. Så jeg skriver fort, men dette er sikkert kjent syntaks nå. 

Og nå, dette var nyere. Hvis jeg ønsker å sette i i-te studentens navn, tror jeg at jeg gjør dette. Og da, ikke navn men husene brakett jeg. Jeg gjør dette, GetString, og la meg gå tilbake og rette denne linjen. Enig? Uenig? Det er ikke veldig brukervennlig. Jeg har ikke fortalt brukeren hva de skal gjøre. 

Men nå, hvis jeg også ønsket å senere, la oss si, skrive ut disse tingene out-- så TODO senere. Jeg kommer til å gjøre mer med dette-- dette uten tvil si en korrekt gjennomføring av få navn og hus, tre av dem sum av hver, fra en bruker. 

Men dette er ikke veldig bra design, ikke sant? Hva hvis en student har ikke bare et navn og et hus, men også et ID-nummer, og et telefonnummer, og en e-postadresse, og kanskje en hjemmeside, og kanskje en Twitter håndtak, og hvilket som helst antall av andre detaljer forbundet med en elev eller en person mer generelt. Hvordan ville vi begynne å legge funksjonaliteten til dette programmet? 

Vel, jeg føler meg som den enkleste måten kanskje være å gjøre noe sånt som, la oss si, int IDS studenter. Så jeg kan sette alle sine IDer der inne. Og så, etter noe som telefonnumre, Jeg er ikke sikker på hvordan du representerer det ennå. Så la oss gå videre og bare samtale dette twitrere studenter, som er litt rart, men-- og en haug mer felt. 

Jeg har begynt å effektivt kopiere og lime inn her. Og dette kommer til å vokse ganske uhåndterlig ganske raskt, ikke sant? Ville det ikke være fint hvis det var i verden en datastruktur kjent ikke som en int eller en streng, men noe høyere nivå, en abstraksjon, slik at å snakke, kjent som student? C kom ikke med innebygd funksjonalitet for studenter, men hva hvis jeg ønsket å gi det slik? 

Vel, det viser seg, kommer jeg til å åpne en fil som heter structs.h her, og du kan gjøre akkurat det. Og vi kommer til å begynne å gjøre dette nå. Og under panseret på P sette tre, du allerede har gjort dette nå. Det er ikke noe slikt som en g rect eller en g oval i programmeringsspråket C. 

Folk på Stanford implementert de datatyper ved hjelp av denne tilnærmingen her, erklære sin egen nye data typer som bruker et nytt søkeord heter struct og en annen en som heter typedef. Og ja, selv om syntaksen ser litt forskjellig fra ting vi har sett før, i prinsipp, det er super enkelt. 

Dette betyr bare "definere en type." Det kommer til å bli en struktur, og en struktur er akkurat som en container for flere ting. Og at strukturen kommer å ha en streng kalt navn, og en streng kalte huset. Og la oss kalle, bare for enkelhets skyld, hele denne datastruktur student. 

Så det øyeblikket du kommer til semikolon, har du nå opprettet din egen data type kalt student som nå står sammen med int, og flyte, og røye, og streng, og g rect, og g oval, og en rekke av andre ting folk har oppfunnet. 

Så hva er nyttig om dette nå er at hvis jeg går tilbake å konstruere 0 og ferdig med dette gjennomføring, som jeg skrev på forhånd her, legg merke til at alle av den uunngåelige messi at var i ferd med å starte skjer som jeg har lagt telefonnumre og Twitters og alle disse andre tingene til en student definisjon, nå er det konsist pakket opp som bare en rekke studenter. 

Og hver av disse studentene nå har flere ting inne i den. Slik at bare etterlater ett spørsmål. Hvordan får du på navnet, og huset, og ID, og det som ellers er innsiden av student? Super enkelt, også. Nye syntaksen, men en enkel idé. 

Du bare indeksen inn i array, som vi gjorde i forrige uke og denne. Og hva er klart nytt stykke av syntaks? Just., Som betyr "gå på innsiden av struktur og få felt som heter navn, få felt kalt huset, få felt kalt student. " 

Så i P sette tre, hvis du er jobber fortsatt med det, og de fleste folk fortsatt er, innser at når du begynne å bruke ting som g rects og g ovaler og andre ting som ikke synes å kommer fra Uke null, ett eller to, skjønner at det er fordi Stanford erklærte noen nye datatyper. 

Og ja, det er akkurat hva vi vil gjøre, også, i P Set Fire, når vi begynner å forholde seg til ting som bilder, bitmaps og mer. Så det er bare en teaser og en mental modell for hva som skal komme. Nå, utsatte jeg litt i morges. Jeg var litt spent på å se hva Microsoft tapet faktisk ser ut i dag. Og det viser seg noen i 2006 faktisk gikk til nesten nøyaktig samme sted for å fotografere i virkeligheten det ser ut som at disse dager. Feltet er nå litt overgrodd. 

Så snakker nå om bilder la oss få tilbake Daven her på skjermen og Nicholas, og bare minne deg at hvis du ønsker å bli med oss ​​til lunsj denne fredagen, leder til vår vanlige URL her. 

Så der fikk vi la ut på mandag? Vi introduserte dette problemet, ikke sant? Dette var tilsynelatende en korrekt gjennomføring av swap, der du tar to ints, en som heter en, en som heter b, bytte dem, akkurat som Laura gjorde her på scenen med melk og vann, ved hjelp av en midlertidig variabel, eller en tom kopp, slik at vi kunne sette bi en og en i b uten å gjøre et rot av ting. Vi brukte en variabel. Det kalles temp. 

Men hva som var den grunnleggende Problemet med denne koden på mandag? Hva var problemet her? Yeah. 

PUBLIKUM: Det tar opp mer plass. 

DAVID J. MALAN: Tar opp mer plass, fordi jeg bruker en variabel, og det er OK. Det er sant, men jeg er kommer til å si det er OK. Det er bare 32 biter i grand ordningen med ting, så ikke en stor avtale. Andre tanker? PUBLIKUM: Den bytter bare variablene lokalt. DAVID J. MALAN: Nettopp. Den bytter bare variablene lokalt. Fordi hver gang du kaller en function-- da jeg hadde skuffene fra Annenberg siste gang, har du hoved på bunnen. Så snart du kaller en funksjon som heter swap, betyr swap ikke få x og y, de opprinnelige verdiene. Hva gjør swap get, vi hevder? Målgruppe: kopier. DAVID J. MALAN: Så kopier av dem. Så det blir en og to, hvis du husker eksempelet fra forrige gang, men en kopi av en og to som er vellykket byttet. Men dessverre til slutt, disse verdier er fremdeles det samme. Så vi kan se dette med vår ny venn, forhåpentligvis GDB, at du eller TFS og Ca-er har blitt veilede deg mot som følger. 

Så ingen swap tilbakekalling ser like-- la oss åpne opp dette-- ser slik ut. Vi initialisert til en x, y til to. Hadde en haug med print f-tallet. Men så, på ringetasten her var å bytte, som er nøyaktig den koden vi nettopp så et øyeblikk siden. Som er riktig ved første øyekast, men funksjonelt, dette programmet ikke fungerer, fordi det gjør ikke permanent bytte x og y. 

Så la oss se dette, en rask varm opp her med GDB, et ./noswap. En haug med overveldende informasjon som Jeg skal bli kvitt med kontroll L for nå. Og nå, jeg kommer til å gå videre og kjøre den. Og dessverre, at var ikke så nyttig. Det sprang i programmet innsiden av denne program kalt GDB, en debugger, men det gjorde ikke la meg rote rundt. 

Så hvordan kan jeg faktisk pause kjøring inne dette programmet? Så bryte. Og jeg kunne bryte på noen linjenummer, en, 10, 15. Men jeg kan også bryte symbolsk ved å si pause hoved. Og det kommer til å sette en pause punkt, tilsynelatende på linje 16 i hoved. Og hvor er linje 16? La oss gå opp til koden og gå opp til noswap. Og ja, er linje 16 den Aller først i programmet. 

Så nå, hvis jeg går videre og type kjøre denne gangen, Enter, det stanset. Så la oss rote rundt. Skriv ut x-- hvorfor er x null? Og ignorere dollartegn. Det er bare for avansert bruk av programmet. Hvorfor er x null i øyeblikket? Yeah. 

PUBLIKUM: Det pauset rett før linje 16, faktisk ikke på linje 16. DAVID J. MALAN: Nettopp. GDB, som standard, har satt på pause kjøring like før linje 16. Derfor har det ikke utført, som betyr x er av noen ukjent verdi. Og vi hadde flaks at det er noe rent som null. Så nå hvis jeg skriver neste, nå er det utført 16. Den venter for meg å utføre 17. La meg gå videre og print x. Det er en. La meg gå videre og print y. Hva bør jeg se nå? 

PUBLIKUM: [uhørbart] 

DAVID J. MALAN: En litt høyere. 

PUBLIKUM: [uhørbart] DAVID J. MALAN: Ikke helt en konsensus. Så ja, vi ser noen søppel verdi. Nå er y 134514064 der. Vel, det er bare noen søppel verdi. Min programmet bruker RAM for ulike formål. Det er andre funksjoner. Andre mennesker skrev inni datamaskinen min. Så de bitene har blitt brukt for andre verdier, og det jeg ser er restene av noen før bruken av dette minnet. 

Så ingen big deal, fordi så snart mens jeg skriver neste og deretter skrive y, det er initialisert til verdien som jeg vil. Så nå, la oss gå videre litt raskere. N for neste. La oss gjøre det igjen. La oss gjøre det igjen. Men jeg ønsker ikke å treffe det her, fordi hvis jeg ønsker å se hva som skjer på innsiden swap, hva er kommandoen? 

PUBLIKUM: trinn. 

DAVID J. MALAN: trinn. Så dette trinn meg inn i en funksjon, i stedet for over den. Og nå, er det litt kryptisk ærlig, men dette er bare forteller meg at jeg er på linje 33 nå. Og la oss gjøre dette igjen. Skriv ut temp. Søppel verdi, negative denne periode men det er bare fortsatt en søppel verdi. Så la oss gjøre neste, print temp. Det er initialisert til 1, som var verdien av x, aka en. 

Nå, hvor er vår en og X kommer fra? Vel, varsel main, vi kalt disse verdiene x og y. Vi passerte dem til å bytte som følger. X kom først, komma y. Og så, kan swap kalle dem x og y. Men for klarhet, er det ringer dem a og b. Men a og b skal nå være kopier av x og y, henholdsvis. 

Så hvis jeg går tilbake til GDB, temp er nå en og en er nå ett. Men hvis jeg gjør neste, og nå gjør print en, har en allerede flyttet over. Melken ble helt over i den tidligere appelsinjuice er glass, eller vice versa. 

Og hvis jeg gjør det neste gang, og nå hvis jeg skriver ut som en mental helse sjekk, et er fortsatt to, men b er nå ett. Ærlig talt, det er fortsatt der. Jeg bryr meg ikke hva temp er. Men så snart jeg nå skriver, la oss si, fortsette å gå tilbake, nå er jeg på slutten programmet. Og dessverre, er x fremdeles en og y er fremdeles to. 

Så hva var nytten av GDB det? Det hjalp ikke meg fikse problemet per se, men det forhåpentligvis hjelpe meg forstå det ved å realisere at ja, er min logikk rett, men koden min er ikke slutt å ha en permanent virkning. Så det er et problem vi er skal nå løse i dag. 

Men la oss komme dit ved hjelp av dette. String er en løgn. Det også, ikke en datatype som eksisterer i C. Det er vært et synonym for noen tid til noe annet, og vi kan avsløre at som følger. 

La meg gå videre og åpne opp et program som kalles sammenlign-0. Og i stedet for å skrive dette ut, vi vil begynne å gå gjennom koden Jeg skrev allerede, men det er bare noen få linjer. Så dette er sammenlign-0. Og det første jeg gjør er å få en tekstlinje. 

Men legg merke til hva jeg er gjør for første gang. Hva er annerledes tydelig om linje 21? Egentlig, vent litt. Dette er kopi to. Det er ikke en gang den riktige program. Greit, spoiler alert. Greit, så never mind det. Det er svaret på et fremtidig spørsmål. 

Her er sammenlign-0, og jeg er om å få en tekstlinje. Program er mye enklere. Så dette er grei. Dette er som Week One, uke to ting i øyeblikket. string s = GetString. Nå sier jeg det igjen her nede. string t = GetString. Og så, den siste tingen i dette program, som navnet antyder, er jeg kommer til å prøve å sammenligne dem. 

Så hvis s, den første strengen, tilsvarer = t, da er jeg kommer til å si at du skriver det samme. Else, kommer jeg til å si du skriver forskjellige ting. Så la oss kompilere og kjøre dette programmet. Så gjør sammenligne null. Ser bra ut. Ingen kompileringsfeil. 

La meg gå videre nå og skriv ./compare-0. La meg gå videre og si noe : Daven og noe: Rob. Og jeg skriver forskjellige ting. Så langt, så bra. Programmet ser ut til å være korrekt. 

Men la oss kjøre den på nytt. Si noe: Gabe. Si noe: Gabe. Greit. Kanskje jeg treffer mellomromstasten eller noe funky. La oss gjøre det igjen. Så Zamyla. Zamyla. Forskjellige ting. Så hva er det som skjer? 

Så vi har disse to linjer med kode, GetString å bli kalt to ganger. Og så er jeg rett og slett prøver å sammenligne s og t. Men det som virkelig da er det som skjer? Vel, min håndskrift er i ferd med å slakter dette eksempelet noe. Og la oss faktisk kaste Dette opp over her, så vel. 

Så vi har en linje som string s = GetString. Så det er bare den første interessant linje fra det programmet. Men hva hele denne tiden har vært skjer under panseret? Vel, på venstre side er streng, som er en form for variabel, og det heter s. Så jeg vet at dette er å bruke minnet, eller RAM, i min datamaskin eller annen måte. Så jeg kommer til abstrakt tegne det som en firkant. 32 bits, det viser seg, men mer om det i fremtiden. Og da, hva er det som skjer her borte? 

Vel, GetString åpenbart får en streng fra brukeren. Og GetString fikk Zamyla eller Gabe eller Daven. Så la oss velge den første av disse, som var Daven. Så effektivt, hva GetString fikk meg i det første tilfelle var D-a-v-e-n. Og så, hva annet gjorde det gir meg i hemmelighet? PUBLIKUM: [uhørbart] DAVID J. MALAN: Yeah, den / 0 eller null karakter. Så det effektivt ga meg en streng. Men vi allerede vet fra tidligere ser at en streng er bare en matrise tegn, og det er oppsagt av denne spesielle sentinel karakter, / 0. 

Men hvis dette er sant og dette er en firkant, dette er helt klart en mye større rektangel. Og ja, dette er, Jeg hevder, bare 32 bits. Og dette er helt klart mer enn 32 biter, fordi dette er trolig åtte pluss åtte pluss åtte pluss åtte pluss åtte, nettopp på grunn av byte i ASCII. Hvordan pokker skal vi passe Daven inn i denne lille boksen her? 

Vel, hva er GetString faktisk gjør? Vel, her representerer dette rutenettet min datamaskinens minne eller RAM. Så la oss vilkårlig si at hvis hver av disse representerer en byte, så kan vi tenke på hver byte som å ha en adresse, som 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street. 

Så akkurat som boliger har adresser og bygninger har adresser, så gjør individuelle byte av minne har adresser eller tall som unikt identifiserer disse. Nå er dette vilkårlig. Men for å holde det enkelt, jeg kommer til å bruke heksadesimale bare ved konvensjonen, men 0x betyr ingenting annet enn "dette er heksadesimal." og jeg kommer til å hevde at "D" ender opp på Byte One i minnet. 

Jeg har ingenting annet som skjer i minne, så Daven fikk det første stedet på Byte One. Dette, da, kommer til å være 0x2. Dette kommer til 0x3. Dette kommer til å være 0x4. Dette kommer til 0x5. Dette kommer til å være 0x6. 

Men når du begynner å tenke om hva maskinen er dette gjort under panseret, du kan begynne å antyde hvordan du, for noen år siden, ville har implementert C selv. Hva er GetString trolig returning-- fordi det føles som det ikke er retur Daven, per se, fordi han sikkert ikke kommer å passe på denne lille box-- så hva er GetString trolig tilbake? 

PUBLIKUM: [uhørbart] 

DAVID J. MALAN: Plasseringen av Daven. Og det har gjort dette helt siden uke One. Hva GetString er virkelig retur ikke er en streng, per se. Det er en av de små hvite løgner. Det returnerer adressen til string i minnet, den unike adressen. Daven bor ved 33 Oxford Street. Men mer konsist, Gavin lever på 0x1, Adresse Number One. 

Så hva blir satt i denne lille boksen da, for å være klar, er bare adressen til denne strengen. Så hele denne tiden, denne har pågått. Men hva dette antyder nå er at hvis alle s har er et tall på innsiden av det som finnes i å stoppe deg, programmerer, fra å sette et tall i eventuell variabel og bare hoppe til at mengde minne? Og ja, vi får se det er en trussel neste gang. 

Men for nå, føles dette utilstrekkelig. Hvis jeg sier, få meg en streng, gir du meg Daven. Men du trenger ikke egentlig gi meg Daven. Alt du gi meg er Daven adresse. Hvordan kan jeg da vite sikkert hvor Daven begynner og ends-- historien begynner å bli weird-- hvor Daven begynner og slutter, og deretter, i det neste strengen i minnet starter? 

Vel, hvis du overlate meg i begynnelsen av Daven, hovedsak, hvordan vet jeg der på slutten av navnet hans er? Den spesielle null karakter, som er desto viktigere nå hvis strenger under den panseret er bare identifisert entydig med deres plassering i minnet. Så hele denne tiden, det er hva som har skjedd. 

Så når vi ser nå på koden her, forklarer hvis du ville feilen i linje 26. Hvorfor er Zamyla og Zamyla annerledes? Hvorfor er Gabe og Gabe annerledes? Ja, i ryggen. 

PUBLIKUM: De har forskjellige adresser. 

DAVID J. MALAN: Rett og slett fordi de har forskjellige adresser. Fordi når du ringer GetString igjen, som jeg skal gjøre raskt her, hvis dette er den andre linjen, streng t, som jeg gjorde i det programmet, lik en annen samtale til GetString. Neste gang jeg kaller GetString, jeg kommer å få en annen del av minnet. 

GetString er tillatt å spørre drifts system for mer og mer minne. Det kommer ikke til å gjenbruke samme seks bytes hver eneste gang. Det kommer til å få en ny blings av minne, som betyr t kommer til å få en annen verdi over her. 

Så når jeg gjør s lik = t, du er ikke sammenligne D mot dette og en mot dette og V mot dette. Du sammenligner dette mot dette, som ærlig er ganske useful-- useless-- er ganske ubrukelig, fordi som virkelig bryr seg der strengene er i minnet? 

Og ja, det har vi ikke. Og vi kommer til å starte særlig omsorg. Bare i den grad at feil kan oppstå og sikkerhetstrusler kan oppstå vilje vi faktisk begynne å bry seg om dette. Så la oss løse dette problemet. Slår ut, du fikse det super enkelt. 

Og la oss faktisk, før jeg avslører at igjen, hva ville du gjør hvis du er i en CS50 klasse, og du måtte implementere en sammenligning mot to strenger. Du kan tydelig ikke bare bruke s tilsvarer = t. Men bare logisk, hvordan vil du sammenligne denne strengen mot denne strengen ved hjelp av C-kode? Yeah. 

PUBLIKUM: Bare gjør det for loop [uhørbart] DAVID J. MALAN: Perfect. PUBLIKUM: [uhørbart] DAVID J. MALAN: Yeah. Bare bruk en for løkke eller en mens loop eller hva. Men bare gjelder den grunnleggende ideen om at hvis dette er en del av minnet eller en matrise og dette er, iterere over begge samtidig. Og bare sammenligne bokstaver. 

Og du har til å være en litt forsiktig, fordi du ønsker ikke en finger å gå forbi den andre fordi en streng er lengre enn den andre. Så du kommer til å ønske å se etter denne spesielle verdi ved utgangen, null. Men det virkelig er, i den slutten, så enkelt er det. Og ærlig talt, trenger vi ikke å gjenoppfinne hjulet. Her er versjon to. Og hva jeg skal si her er at stedet for å sammenligne s tilsvarer = t, Jeg i stedet kommer til å si, hvis strengen sammenligning av s komma t lik = 0. Nå, hva er streng sammenligne? 

Det viser seg, det er en funksjon som kommer med C, hvis formål i livet er å sammenligne to strenger. Og rør sammenligne, hvis vi leser sin man-side eller dokumentasjon eller CS50 referanse, vil det bare fortelle deg at oppsikt sammenligne avkastning enten en negativ nummer eller et positivt tall eller null, hvor null betyr at de er like. 

Så bare gjetninger. Hva kan det bety hvis røre sammenligningen avkastning negativ verdi eller positiv verdi? PUBLIKUM: Større enn eller mindre enn. DAVID J. MALAN: Yeah, større enn eller mindre enn. Så hvis du ønsker å sortere en hel haug med strenger i en dictionary-- som vi vil til slutt ned road-- perfekt funksjon for å bruke potensielt, fordi det kommer til å gjøre det sammenligning av strenger for deg, og fortelle du gjør en kommer før b, eller gjør b komme før en alfabetisk. Vi kan gjøre akkurat det. 

Og legg merke til jeg gjorde en annen ting i dette eksemplet. Hva annet har endret seg høyere opp i denne hovedfunksjon? Char *. Og dette er at andre hvit løgn. Hele denne tiden, når du har vært å skrive streng, vi har vært hemmelig omskriving strengen som char * slik at klang faktisk forstår deg. 

Med andre ord, i CS50.h og som vi vil til slutt se, vi gjort et synonym kalt string det er det samme som char *. Og for nå, vet bare at *, I denne sammenheng, i det minste betyr den adressen. 

Adressen til hva? Vel, det faktum at jeg sa char *, og ikke int * eller flyte *, betyr at char * er adressen til en røye. Så denne lille boksen her, aka streng, er virkelig av typen char *, som er rett og slett en fancy måte å si: i denne boksen vil gå en adresse. Og hva betyr denne adressen refererer til? Angivelig, en røye. 

Men vi kunne absolutt har int * og andre ting. Men for nå, er char * virkelig den mest enkel og ett av interesse. Så dette problemet kommer å stige, selv om, på nytt. 

Anta at jeg åpner opp dette programmet. La oss se om vi nå kan forutsi Hva er galt med denne koden. Så i dette programmet, kopi-0, jeg er kommer til å gå videre og igjen kaller GetString og lagre verdien i s. 

Og så, hvorfor gjør jeg dette, bare som en påminnelse fra uker tidligere? Vi gjorde si at GetString noen ganger returnerer null. Hva betyr det hvis GetString returnerer null? Noe gikk galt. Det betyr sannsynligvis strengen er for stor, datamaskinens minnekapasitet. Det skjer super, super, super sjelden, men det kan skje. Vi vil se etter den, og det er alt vi gjør. 

Fordi vi får se nå, hvis du ikke gjør det begynne å sjekke habitually for ting som null, kan du faktisk begynne å gå til adresser i minnet som er ugyldige. Og du kommer til å begynne å indusere flere og flere segmenteringsfeil. Eller i en Mac eller en PC, bare forårsaker en datamaskin til å henge eller et program for å fryse, potensielt. 

Så nå, jeg hevder i kopi-0.c, at jeg jeg kommer til å kopiere disse strengene ved hjelp av linje 28. Og så, jeg kommer i krav nederst her at jeg kommer å endre en av dem. 

Så merke dette. Jeg ringer vår gamle venn strlen. Og bare forklare på engelsk hva denne linjen 34 gjør? Hva gjør t brakett 0 representerer til venstre. Yeah. 

PUBLIKUM: Det første tegnet av t? DAVID J. MALAN: Først tegnet av t. Det er det. Første tegnet av t, jeg vil ha å tildele store bokstaver versjon av det første tegn i t. Så dette er å utnytte den første bokstaven. Og så, det aller siste jeg gjør i dette programmet er jeg hevder her er den opprinnelige, s, og her er kopien, t. 

Men basert på historien vi bare fortalte om hva strenger egentlig er, det som er ledningen 28 virkelig gjør, og hva som er den resulterende bug går å være på skjermen? 

Så først, det første spørsmålet, 28. Hva er streng t = s egentlig gjør? Hvis vi har på venstre hånd side her streng t = s; som gir meg en boks her og en boks her. Og anta denne adressen er 0x, la oss si, 50 denne gangen, vilkårlig. Hva gjør strengen t = s gjøre under panseret? 

PUBLIKUM: [uhørbart] 

DAVID J. MALAN: Den lagrer minne adresse der, så 0x50 går der. Så hvis nå, går jeg til den første karakter i t og store bokstaver det, hva skal jeg effektivt gjør til s? Jeg er virkelig å gjøre det samme, ikke sant? Fordi hvis Adresse 0x50-- og rettferdig, jeg har ikke mye plass på bordet her, men antar at dette er 0x50 her nede, et sted i datamaskinens minne. 

Og jeg har, for eksempel, gabe med små bokstaver her, som dette. Og jeg har sagt t brakett 0 blir balanseført. Vel, er t brakett 0 den første bokstaven i t. Så lite g kommer til å blitt stor G. Men problemet er, hva s peker også? 

PUBLIKUM: Det samme. 

DAVID J. MALAN: Den samme ting. Så en enkel forklaring kanskje selv om syntaksen er litt rart. Så la oss gjøre dette. Lage kopi-0 og deretter ./copy-0. Si noe: Gabe. Og dessverre både dem har nå blitt aktivert, men for at underliggende Grunnen til at vi er rett og slett nå arbeider med adresser. 

Så hvordan skal vi begynne å address-- no pun intended-- hvordan skal vi begynne å ta opp dette problemet? Vel, i copy1.c, ting går å få litt mer komplisert. Men jeg vil hevde en konseptuelt enkel løsning. 

Så vanskelig å få ved første øyekast. Ikke til å bli enkelt for den første gang du skriver det ut, kanskje, men hvis problemet er at bare gjør t = s bare kopier adressen, hva, igjen hvis jeg kan plukke på deg, kommer til å være løsningen for faktisk å kopiere en streng? 

PUBLIKUM: Vi vil trolig bruke en løkke igjen. 

DAVID J. MALAN: Yeah. Så vi kommer til å trenge en løkke igjen. Og fordi hvis vi ønsker å kopiere en streng s inn i en annen streng, vi sannsynligvis vil gjøre det tegn for tegn. Men problemet er, dersom Dette er opprinnelig s, nå må vi begynne å eksplisitt tildele minne for t. 

Med andre ord, la oss tegne dette en siste gang. Hvis dette er strengen s = GetString. Og la oss sette dette opp her, også. Dette er GetString. Og så, på bildet for noe sånn kommer til å være som før, g-a-b-e-/ 0. Det ser litt noe sånt som dette. Og s derfor kaller vi dette 0x50, og som kommer til å være 51, 52. 

Så dette er 0x50. Og så gjør jeg streng t. I minnet, det er bare kommer til å gi meg et lite torg som dette. Så hva er viktig skritt nå? Hvis jeg ønsker å kopiere s til t, hva blank trenger vi å fylle ut her? Eller hva trenger vi å gjøre på et høyt nivå? Yeah? Noen? Yeah. 

PUBLIKUM: Vi må [uhørbart]. DAVID J. MALAN: Ja, vi må fylle ut dette stå tomt. Jeg kan ikke kopiere og deretter kapitalisere Gabe navn før jeg spør operativsystemet for en annen del av minne som er minst like stor som den originale. Så det etterlater oss med et spørsmål. 

Hvordan kan jeg be operativsystemet ikke bare for en enkel liten pointer-- da dette er kalt en adresse, en pointer-- ikke for en enkel liten boks som dette kalles en streng? Hvordan spør jeg drifts system for en stor del av minnet? Så langt har jeg bare fått den tilbake indirekte ved å ringe GetString. Så hvordan er GetString selv får sin hukommelse? 

Vel, det viser seg at det er denne annen funksjon her at vi nå skal begynne å bruke. Nå ser på denne måten mer kryptisk than-- og jeg er den eneste som kan se it-- denne linjen ser måte mer kryptisk så bør det ved første øyekast. Men la oss erte den fra hverandre. 

På venstre side, jeg har char * t. Så i engelsk, la oss begynne å formulere fullstendige setninger i teknisk sjargong. Så dette er tildeling av en variabel av type char * t ut. Nå, hva betyr det egentlig? 

Vel, det betyr, hva skal jeg å sette i denne variabel kalt t? Adressen til en røye. Så det er bare enklere, mer fornuftig måte beskrive venstre side. Så det skaper denne boksen her bare. Så høyre side, formodentlig, kommer å bevilge at større mengde minne hvordan? Så la oss erte dette fra hverandre. 

Det er overveldende ved første øyekast, men hva er det som skjer her inne? Først, det er malloc, som er tydeligvis vår nye venn, "Minne fordele." Så dette er argumentet blir vedtatt inn i det, så det er en ganske stor argument. Så la oss erte dette fra hverandre. 

StrLen av s, selvfølgelig, representerer the-- PUBLIKUM: Antallet tegn. DAVID J. MALAN: Bare antall tegn i s. Så lengden s, den opprinnelige streng. Så G-a-b-e. Så det er trolig fire i dette tilfellet. Hvorfor gjør jeg en etter ringer strlen av s? PUBLIKUM: [uhørbart] DAVID J. MALAN: For at spesielle null karakter. Hvis du spør meg hva som er lengden på Gabe navn, skal jeg si fire. Under panseret, skjønt, må jeg at femte byte for null karakter. Så det er derfor jeg gjør det en. 

Nå bare i tilfelle du kjører denne program på en annen enn datamaskinen, sier, den CS50 apparatet, der størrelsen på en char kan være annerledes fra min egen computer-- viser seg at jeg kan kalle dette operatør sizeof, bare spør datamaskinen, det som er på størrelse med en char på denne datamaskinen? 

Og ved å multiplisere fem i dette eksempel ved størrelsen av en char, som på de fleste datamaskiner vil bare være ett, malloc kommer til å bevilge for meg denne store blings av minne over her til høyre. Og det kommer til å return-- det er en function-- slik at det er kommer til å vende tilbake til meg hva? PUBLIKUM: Adressen? DAVID J. MALAN: Adressen til hva? PUBLIKUM: Av minnet det tildelt? DAVID J. MALAN: Av de minne den tildelt. Så jeg har ingen anelse om, ærlig, hvor dette kommer til å ende opp. Jeg kommer til å foreslå at det kommer til å ende opp på 0x88. Helt vilkårlig, men et annet sted enn 0x50, fordi operativsystemet, hva Windows og Mac OS gjøre for meg, er sørge for at det er å gi meg ulike biter av RAM. 

Så dette er verdien der dette blings av minne kan ende opp. Så dette er hva som ender opp i her, 0x88. Så nå klart, kan jeg forstå at dette ikke er den samme som denne, fordi de er å peke på forskjellige biter av minne. Så hvis jeg nå faktisk ønsker å kopiere dette i, la oss gjøre den foreslåtte løsningen. 

La oss bare gå, skape en for løkke, og gjøre t brakett jeg får s brakett jeg. Fordi nå kan jeg bruke denne matrisen-lignende notasjon, fordi selv om malloc svært generically tildeler meg minne, minnet er bare sammenhengende bytes. Byte, byte, byte, rygg mot rygg mot rygg. 

Jeg kan sikkert som programmerer behandle det som en matrise, som betyr at jeg kan bruke denne til slutt kjent notasjon av bare noen hakeparenteser. 

Så la meg pause der, fordi Dette er mye alt på en gang, selv selv om den grunnleggende ideen å gjenerobre er at strengen, hele denne tiden, er ikke en ny datatype per se. Det er bare en såkalt pekeren, adressen til en karakter, som bare betyr at det er et tall at ved menneskelig konvensjonen vi har en tendens til å skrive så 0x noe. 

Men det er bare et tall, som 33 Oxford Street, som skjer for å være den CS bygningens adresse. Eventuelle spørsmål om disse detaljene? Yeah? 

PUBLIKUM: Hvorfor gjør vi sjekke for t lik null? 

DAVID J. MALAN: Hvorfor gjør vi se etter t lik null? Hvis vi leser documentation-- stor question-- for malloc, det kommer til å si i fine print, noen ganger malloc kan returnere null, akkurat som GetString. Og ja, GetString returnerer null hvis, i sin tur, malloc returnerer null, fordi GetString bruker malloc. 

Og det kan skje hvis OS, Mac OS, Windows, uansett, er rett og slett tom for minne for deg. Så det er hva som skjedde der. 

Og la meg avsløre en annen ting som kanskje bare blåse hodet eller helt være for langt over linjen. Men la meg dra opp samme for loop for kopiering, som for et øyeblikk siden, husker var dette. t brakett jeg får s brakett jeg. 

Fin og brukervennlig. Føles som Uke to igjen. Men denne versjonen faktisk kan være omskrevet som dette, som ser kryptisk. Det er en teknikk som kalles pekeren aritmetikk, adresse aritmetikk. Men hvorfor virker dette? 

Nå annoyingly Forfatterne av C valgte å bruke symbolet * for ulike formål. Vi har sett det brukt en gang allerede, char *, som betyr "gi meg en variabel som kommer til å inneholde adressen til en røye. " Så char * i den sammenheng betyr "gi meg en variabel." 

Dessverre, hvis du bruker * uten et ord foran det, som røye, det kalles nå dereferanseoperator. Og vi vil se mer av dette før lenge. Men det betyr bare "gå dit." Det er som å si, hvis noen ga meg på et stykke papir "33 Oxford Street," hvis jeg gjør "* 33 Oxford Street", som betyr "Gå ned veien til CS bygningen." 

Så * betyr bare gå dit hvis det er ingen ord foran den. Så hva er t, for å være klar? t er adressen til den del av minne som ble gitt tilbake til meg. s er adressen til det, for å være klar, i eksempelet vi har diskutert, av små bokstaver Gabe? s er adressen of-- PUBLIKUM: Strengen. DAVID J. MALAN: Of Gabe opprinnelige navn. Så det er adressen til denne del av minnet. Så hvis jeg sier t + jeg-- i, varsel, er bare vår gamle venn. Det er bare en indeksvariabel som er itera fra null på opp til lengden av strengen s. Så det kommer til å bli null, så en, så to, så tre, så fire. Så la oss sette sammen disse nye Scratch-lignende puslespill brikker, om du vil, Selv om igjen, syntaksen er langt mer uforståelige enn Scratch. Så t er en adresse + Jeg kommer til å gi meg et tall, fordi disse er alle tall som vi har vært tegning som hex. Men de er bare tall. 

Så hvis adressen t vi sa var 0x88, hva er 0x88 pluss null. Selv om du ikke er komfortabel med hex ennå, ta en gjetning. 

PUBLIKUM: The original. 

DAVID J. MALAN: Still 0x88. Så hva betyr * 0x88 mener? Det betyr: "gå dit", som betyr effektivt, "sette fingeren her." Og nå på høyre side av dette uttrykket, * og deretter i parentesar, s + i betyr s, som er ta opp her av den lille g. s + 0 er, selvfølgelig, s, uansett s er. 

Så nå er det * s, som akkurat som * 33 Oxford Street betyr gå til adressen s. Så her er denne finger, høyre hånd. Så hva skal jeg kopiere inn i hva? Saken til høyre, som er Gabe, liten g her, inn her. 

Og slik at effekten av det første iterasjon av loopen, som du foreslo, selv om det ser ut gal mer komplisert enn noe vi har sett før, er bare å si gå her og kopiere det tegnet her. Det er å gi deg et kart til begge steder. 

Og vi vil se langt mer av dette. Men for nå, er håpet bare for å introdusere noen av disse grunnleggende ideer. Og ja, la oss se på en siste program her, og deretter lovet claymation, som vil gjøre alt i orden. Greit. Så la meg åpne opp-- der vi går. Så la meg- vi vil komme tilbake til dette bildet før lenge. La meg åpne opp denne siste eksempel her. 

Så her er en super, super program som oppnår ingenting i livet som gjør det følgende. Det erklærer første to variabler, x og y, som ikke er tall denne periode per se. De er ikke heltall, per se. De er tilsynelatende int *. Så bare noen, hva betyr det Hvis datatype, variabelen, er av typen int * stjerne? Det er adressen til en int. 

Så jeg har ingen anelse om hvor det er ennå. Det betyr bare "satt, til slutt, adressen for en int her. " 0x50, 0x88, uansett hvor det er i minne, er en adresse du kommer dit. Og det er hva y er kommer til å være, så vel. 

Hvis jeg nå si x = malloc (sizeof (int)), dette er en fancy måte å si: hei operativsystem, via malloc, gi meg nok minne for størrelsen av en int, som sannsynligvis kommer til å være 32 bits eller fire byte. 

Så hva gjør returnere malloc? Malloc returnerer en adresse. Så hva kommer til å bli lagret i x? Adressen til den del av minne, de fire byte, som malloc nettopp funnet for meg ved å spørre operativsystemet. 

Nå i mellomtiden, linje fire her, * x = 42. Bare for å være klar, hva som skjer der nede? På venstre side, * x. det er som * 33 Oxford Street. Så * x betyr hva? 

PUBLIKUM: Gå til. 

DAVID J. MALAN: Gå til denne adressen. Uansett hvor som del av minnet er, gå til det. Og sette det der, tydeligvis? PUBLIKUM: 42. DAVID J. MALAN: 42. Greit, * y, samme idé. Gå til adressen i y. Sett nummer 13 der, men hva er y for øyeblikket? PUBLIKUM: Det er ingen minne for y. DAVID J. MALAN: Det er ingen hukommelse for y. Så hva gjør y trolig inneholde, som vi har sagt? 

PUBLIKUM: Garbage. 

DAVID J. MALAN: Noen søppel verdi. Nå er søppel verdi fortsatt et tall. Det kan fortsatt bli tatt for en adresse. Det er som om noen skriblet noe ned, og jeg feiltolket det som menings noen bygning nedover gaten. Og hvis du bare prøve å gå inn i noen bygning du ikke eier, eller noen del av minne du har ikke vært gitt, kan dårlige ting skje. Datamaskin kan krasje, eller en annen ubestemt atferd kan skje. 

Så introen, da, for å Binky er dette. Jeg husker fortsatt, 20 noen odde år senere, hvor jeg var da jeg endelig forstått pekere. 

Som er å si, hvis du forlate her i tre minutter og jeg tror ikke forstå pekere, innser Jeg har husket for 20 år for noen sprø grunn når og hvorfor det endelig senket i, sitter med min undervisning stipendiat, Nishat Mehta i iden av Eliot Dining Hall. Nå har jeg husket dette fordi dette var ett av temaene jeg, i Spesielt slet med. Og så, det endelig klikket, som jeg tør si en rekke emner slutt vil. Og nå, for å gjøre det føler hele lykkeligere og enda mer overbevisende, la oss ta en siste titt i vår siste tre minutter her på Binky, fra vår venn, Nick Parlante fra Stanford. 

[VIDEOAVSPILLING] 

-Hei, Binky. Våkn opp! Det er tid for pekeren moro. 

Hva er det? Lær om pekere? Oh, goody! 

-Vel, For å komme i gang, tror jeg vi er kommer til å trenge et par pekere. 

-OK. Denne koden tildeler to pekere, som kan vise til heltall. -OK. Vel, jeg ser de to pekere, men de ikke synes å være å peke på noe. 

-Riktig. Utgangspunktet, pekere ikke peke på noe. De tingene de peker til er kalt pointees, og sette dem opp sin et separat trinn. 

Åh, høyre, høyre. Jeg visste det. De pointees er separate. Er, så hvordan fordele du en pointee? 

-OK. Vel, tildeler denne koden en ny heltall pointee, og denne delen sett x å peke på det. 

-Hei, Ser det bedre. Så gjør det gjør noe. 

-OK. Jeg skal deferanseoperasjon pekeren x til lagre nummeret 42 i sin pointee. For dette trikset, jeg trenger min Magic Wand of dereferencing. 

-Din Magic Wand of dereferencing? At-- det er flott. 

-Dette er hva koden ser ut. Jeg skal bare sette opp nummeret, og [POP] 

-Hei, Se. Der går det. 

-Så gjør en deferanseoperasjon på x følger pilen for å få tilgang til sin pointee. I dette tilfellet, en butikk 42 i der. Hey prøve å bruke den til å lagre nummeret 13 gjennom den annen peker, y. 

-OK. Jeg vil bare gå over her til y, og få nummer 13 satt opp. Og så, ta Wand av Dereferencing og bare [BUZZ] 

Åh! 

Åh, hei! Det fungerte ikke. Si, Binky, tror jeg ikke dereferencing y er en god idé, fordi du vet, sette opp pointee er et separat trinn. Og jeg tror ikke vi noen gang gjorde det. 

-good Punkt. -Ja. Vi bevilget pekeren y, men vi aldri sett den til å peke på en pointee. 

-Veldig Observant. -Hei, Du ser bra der, Binky. Kan du fikse det slik at y poeng til samme pointee som x? 

-Klart. Jeg skal bruke min Magic Wand av Pointer Oppdraget. 

-Er Det kommer til å være et problem som før? Nei. Dette betyr ikke berøre pointees. Det endrer bare en peker til peke på det samme som en annen. 

Åh, ser jeg. Nå y peker til samme sted som x. Så vent. Nå, er y løst. Den har en pointee. Så du kan prøve Wand av Dereferencing igjen for å sende 13 over. 

-Uh, OK. Her går det. [POP] 

-Hei, Se på det. Nå dereferencing fungerer på y. Og fordi pekere deler at en pointee, de begge se 13. -Ja. Deling, uansett. Så skal vi bytte plass nå? 

Oh, se. Vi har ikke mer tid. 

-But-- 

Bare husk de tre pekeren regler. Number One, den grunnleggende struktur er at du har en peker, og den peker over til en pointee. Men pekeren og pointee er separate, og vanlig feil er å sette opp en peker, men å glemme å gi den en pointee. 

Nummer to, peker dereferencing starter ved pekeren og følger sin pekeren over å få tilgang til sin pointee. Som vi alle vet, dette fungerer bare hvis det er en pointee, hvilken type kommer tilbake til regel nummer én. 

Nummer tre, peker Oppdraget tar ett pekeren og endrer det til å peke på samme pointee som en annen pekeren. Så etter oppdraget, de to pekere vil peke til samme pointee. Noen ganger er det som kalles deling. Og det er alt som skal til, egentlig. Bye-bye nå. [END VIDEOAVSPILLING] DAVID J. MALAN: Det er det for CS50. Vi vil se deg neste uke.