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
[Predvajanje glasbe] DAVID J. Malan: Dobro. To je CS50, in to je konec tedna Four. In ena od tem danes je, da za digitalno forenziko, Umetnost obnavljanju informacij. In res, čeprav ste v sredi zdaj miru na treh in Breakout, naslednji teden, Poudarek bo na Ravno to domeno. 

Tako je eden izmed najboljših mest kar sem jih kdaj imel je že v šoli: ko sem delal za lokalne Middlesex County District Attorney je pisarne, delaš forenziki delo. Torej v bistvu, Massachusetts Državna policija, občasno Pri delu na primerih bi prinašajo stvari, kot so trdi diski in diskete in spominske kartice in podobno. In bi jih roko za mene in moj mentor, in naš cilj je bil najti dokaze, ali je bil prisoten na teh medijih. Zdaj, ste morda opazili utrinki od tega sveta forenzike v medijih, TV in filme. Ampak delo sem imel, in si trditi, da je svet, ni čisto tako kot bi jo videl. Oglejmo si, kaj Verjetno ste že opazili. [VIDEO PREDVAJANJE] -OK. Zdaj, kaj je dobil dober pogled na vas. 

[Predvajanje glasbe] 

Ga Počakaj. Teči nazaj. 

Počakaj malo. Desno. -Obstaja. Zamrzniti. FULL-screen. 

-OK. Zamrzniti. Omejilo up o tem, boste? 

-Vector V naprej, da tip z zadnjim kolesom. 

-Zoom Se tukaj na tem mestu. 

-z Pravo opremo, slika se lahko razširi in izostrili. 

Kaj je to? 

-To Program za izboljšanje. 

-Lahko Jasno, da se katera koli? 

Ne vem. Naj ga izboljšati. 

-Enhance Oddelek A6. I okrepljeno podrobnosti in-- Mislim, da je dovolj za izboljšanje. Javnost na mojem zaslonu. 

Jaz povečala odsev v svojem očesu. Pusti se ta teče skozi video opremo. 

-Edgar, Lahko okrepi to? 

-Hang Naprej. 

-Nikoli Delali na tem razmisleku. 

Odsev -Tam nekoga. 

-Reflection. -Tam Odraz moškega obraza. 

-V Razmislek! -Tam Odsev. -Zoom V na ogledalu. Lahko vidite odsev. 

-Lahko Izboljšati podobo od tu? -Lahko Ga izboljšati? -Lahko Ga izboljšati? -Se Lahko okrepi to? -Lahko Ga izboljšati? Počakaj trenutek. Bom povečati. -Zoom V na vratih. -Times 10. -Zoom. Umakni se. Bolj. Počakaj, nehaj. Nehajte. Ga -Pause. -Rotate Za 75 stopinj okoli vertikalne, prosim. 

Nehajte. Pojdi nazaj na delu o vratih znova. 

Imam ga slikovno ojačevalec, ki lahko Bitmap? 

Mogoče bomo lahko uporabite Pradeep Singh način, da vidite v oknih. 

-V Programska oprema je stanje tehnike. 

-V Lastna vrednost je off. 

-z Desno Kombinacija algorithms-- 

Sprejeti osvetlitev -On algoritmi na naslednjo stopnjo, in jih lahko uporabite za krepitev tega fotografijo. 

-Zakleni Za povečavo in Z-os. 

-Enhance. Povečati. -Enhance. -Freeze In okrepiti. [END VIDEO PREDVAJANJE] DAVID J. Malan: Torej tistih, ki so vse besede, vendar niso bili pravilno uporablja v stavkih. In seveda tudi v prihodnje, kadarkoli, prosim, slišiš nekoga reči besedo, "Izboljšati" hihitati le malo. Ker, ko boste poskušali povečati, na primer, to se zgodi. 

Torej, tukaj je čudovito fotografijo. To je CS50 lastne Daven. In domnevam, da smo želeli osredotočiti na Svjetlucati v njegovih očeh, ali odsev slab človek, ki je bil očitno zajet z varnostno kamero. To je tisto, kar se zgodi, ko si povečate slike, ki ima le končno število bitov, povezanih z njim. 

To je tisto, ki bi jih dobili. In res, v Daven oko je le štiri, mogoče šest točk da sestavite točno, kaj je bil tam blesteče. Torej Problem Set Four bo na koncu imela ste raziskati ta svet, še zlasti po naravi nekaj pravimo datoteka i / o, kjer i / o je samo fancy način pravijo, vhod in izhod. 

Tako doslej, vse interakcij smo imeli z računalnikom so bili v veliki meri s svojim tipkovnico in zaslon, vendar ne toliko z trdem disku ali reševanje datotek presegajo tiste, ki jih sami napisali. Vaši programi doslej ne ustvarja, in varčevanje, in posodabljanje svoje datoteke. 

No, kaj je datoteka? No, nekaj takega kot JPEG. To je slika, ki jo morda imeti ali naložite na Facebook, ali glej kjerkoli na spletu. Dejansko je ta fotografija smo pravkar žaga za Daven je JPEG. In kaj je zanimivo o datotekah, kot so JPEG je, da jih je mogoče identificirati, običajno, z določenimi vzorci bitov. 

Z drugimi besedami, kaj je to, da ločuje JPEG iz GIF iz PING iz Worda Dokument iz Excelove datoteke? No, to je samo drugačna vzorce bitov. In ti različni vzorci ponavadi na začetku teh datotek. 

Tako da ko računalnik odpre Word, doc, ali ko računalnik odpre JPEG, izgleda, običajno na Prvih nekaj bitov v datoteki. In če je prepozna vzorec, pravi, oh, to je podoba. Dovolite mi, da jo prikažejo uporabnik kot grafiko. Ali pa, oh, to izgleda kot Word doc. Naj pokažejo, da uporabnik kot esej. 

Torej za primer, JPEG, Izkaže se, da so dokaj prefinjen pod pokrovom. Ampak prvi trije bajti v večini vsak JPEG začelo s temi tremi številkami. Tako bajt nič, ena, dva pa sta v Najbolj vsak JPEG, 255, potem je število 216, nato pa številko 255. 

In kaj boste lahko za naslednji teden začeti početje dejansko dreza pod hood datotek, kot so JPEG in kot bitne datoteke, in videli kaj je bil vedno tam, dokler kot ste bili z uporabo računalnika. 

Ampak kaj ni običajno napisana kot decimalni števili, kot je ta. Računalniški znanstveniki ne ponavadi govorijo decimalko. Ti res ne govorijo v binarno. Značilno je, ko želimo izraziti s števili, smo dejansko uporabili šestnajstiški, ki se morda spomniš od, recimo, problema, ki Ena, ki je izpodbijala ste, da razmišljajo o drugačnem sistemu. 

Mi, seveda, so seznanjeni z decimalko, ničelne skozi devet. Pogovarjala sva se o binarno. In ne bomo res za uporabo, da je veliko tukaj ven, saj bodo računalniki, ki uporabljajo. Ampak programerji bo zelo pogosto, vendar ne vedno, uporabite šestnajstiški, kar samo pomeni, imate 16 črk v vaši abecede, v nasprotju z dvema ali 10. 

Torej, kako si štej do višje kot devet šestnajstiško? Ti gredo 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, samo po dogovoru. Toda kaj je ključnega pomena je, da vsak od teh je ena simbol. Ni 10. Ni 11, samo po sebi, ker vsak vaših številk, tako kot v decimalni in tako kot v binarno, če bi le biti en sam znak, po dogovoru. 

Tako da je potem abeceda imamo na razpolago za šestnajstiško. Torej, kaj JPEG videti, če vas je bilo, da napišete tiste prve tri ne bajti kot decimalko, ampak na primer, kot heksadecimalno? In zakaj je čarovnica tudi vse to koristno? 

No, hiter pogled na primer. Torej, če pišem iz bitov, ki predstavljajo te decimalno numbers-- to je lahko malo zarjavel zdaj od nekaj tednov nazaj, vendar leva in pravi, so precej enostavno. 255 je bilo največje število smo lahko predstavlja osem bitov. To je bilo vse tiste. Torej, edini, ki je rahlo Zanimivo je sredinska. In če ste nekako storiti math, boste sklepati, da je res, da vzorec enega in ničle predstavlja 216. Tako da se določi, za zdaj, da so to pravilno. Ampak zakaj je to zanimivo? 

No, bajt, seveda, je osem bitov. In izkazalo se je, da če mislite, da bajta kot dveh koščkih štirih bitov, kot je ta. Naj samo dodamo nekaj prostora. Torej, pred, po. Pravkar sem dodal nekaj belega prostora zavoljo Vizualizacija je tukaj. Kako bi lahko zdaj zastopa v, recimo, šestnajstiški vsak quad bitov, vsak niz štirih bitov? 

Tako, na primer, na levi Zdaj imamo 1111 v binarno. Kaj je to število v decimalni, če vam iz matematike? Imate tisti kraj, dvojke mesto, mesto štirice in osmice mesto. 

OBČINSTVO: 15. DAVID J. Malan: To je 15. Torej, če naredimo osem plus štiri plus dva plus ena, smo dobili 15. Tako da sem lahko napišejo 15 spodaj 1111, vendar je poanta tu je šestnajstiški, ni desetiško. Torej, namesto da bi zapisala 15, 1-5, Jaz bom napisala, da je v šestnajstiškem, ki, če menite, nazaj, če imate nič do f, kar je 15 bo? OBČINSTVO: f. DAVID J. Malan: Torej se je izkazalo, da je f. In lahko delo, ki ga izvajajo z besedami, tudi, če je 10, potem OK, f je 15. Torej res, lahko zapišemo ta isti nabor številk kot F f. In potem, če mi malo matematike, bomo sklepam, da je to d. Osem je zelo enostavno, saj smo imajo enega v osmic mestu. In potem imamo nekaj več f f je. 

Torej, kaj ljudje ponavadi ne po dogovoru ko uporabljajo šestnajstiški je pa samo napisati to malo bolj na kratko, znebiti večina tega praznega prostora. In samo, da je zelo jasno, da bralci, da je to šestnajstiški, preprost konvencija med ljudje se pišeš nič x, ki nima nobenega drugega pomena kot vizualna identifikator, Prihaja številka hex. 

In potem si dal dve številki, f f je v tem primeru, potem d, nato f f. Tako da skrajšam zgodbo, šestnajstiški samo nagiba da je koristno, ker je vsak od njenih cifre, nič do f, brezhibno linije z vzorcem štirih bitov. 

Torej, če imate dva šestnajstiških številk, nič s F, znova in znova, ki vam daje odlično osem bitov ali en bajt. Torej, to je, zakaj se nagiba k je konvencionalno koristno. Ni intelektualne vsebina res po tem, razen njegovo dejansko uporabnost. 

Zdaj JPEG niso le formate za grafiko. Morda se boste spomnili, da obstajajo datoteke, kot je to v svetu, vsaj od nekaj let nazaj. 

Torej, to je bil dejansko nameščen v operacijskem sistemu Windows XP na milijone osebnih računalnikov po vsem svetu. In to je bil bitmap datoteke, BMP. In bitno sliko, kot boste videli naslednji teden, samo pomeni vzorec pik, pik kot oni imenujejo, map na bitov, res. 

Torej, kaj je zanimivo, čeprav, O tej obliki zapisa datoteke, BMP, je da je pod pokrovom, jo je več kot samo treh bajtov da sestavite svojo glavo, tako da govoriti, prvih nekaj grižljajev. To dejansko izgleda malo zapleteno na prvi pogled. In boste videli v P nizu. In dobili nekaj zlasti od tega zdaj ni tako pomembna, saj samo dejstvo da je na začetku vsakega bitne Datoteka, grafični format, tam je cel kup številk. 

Zdaj Microsoft, avtor tega formata, skuša poklicati tiste, stvari ne ints in znakov in boje, ampak besede in d besede in hrepeni in zlogov. Torej, oni so samo različne vrste podatkov. Oni so različna imena za isto stvar. Vendar pa boste videli, da je v P določili štiri. 

Toda to je samo reči, da če človek double-klikne nekaj .BMP datoteko na njegov ali pa se odpre njena trdi disk, in okna se mu, da je slika, ki prikazuje, to se je zgodilo zato, ker je poslovanje Sistem domnevno opazili samo Podaljšanje .BMP datoteka v ime datoteke, ampak tudi dejstvo, da je nekaj Konvencija z vzorcem bitov na samem začetku te bitno sliko. 

Ampak kaj je zdaj osredotočiti na tako zapleten datoteka ampak za kaj takega. Recimo, da sem v gedit, I samo še začetke programa, ki je zelo preprost. Imam nekaj vključuje do vrha. Zdaj imam # include "structs.h", vendar Pridem nazaj, da je v trenutku. Ampak to je koristno za zdaj. Torej je to program da bo za izvajanje kot baze podatkov registrar. Torej baza študentov, in vsak študent na svetu ima ime in hišo in verjetno nekaj druge stvari, vendar bomo bo enostavno. Vsak študent ima ime in hišo. 

Torej, če sem hotel napisati Program, katerega namen v življenju Pravkar se je, da izbirate iz nič na do tri, če obstaja trem študentom na Univerzi Harvard. In želim, da bi dobili z uporabo GetString, Ime in house vsakega študenta, in potem samo natisnete jih ven. 

To je nekako tako kot tednom One, Two Week stvari zdaj, kadar hočem za zanka ali nekaj takega. In želim, da pokličete GetString nekaj krat, in nato natisnete f nekajkrat. Torej, kako bi jaz to narediti, čeprav, kadar tako ime in hiša sodelujejo za vsakega študenta? 

Torej moj prvi instinkt morda biti za kaj takega. Jaz bi najprej rekli, dobro, daj mi, pravijo, niz nizov imenovanih imena. In jaz ne želim hardcode tri tukaj. Kaj želim, da tam čaka? Torej ŠTUDENTI, ker je to ravno stalna razglašen na vrhu, samo zato, da mi ne bi bilo treba hardcode tri na več mestih. Na ta način ga lahko spremenite za eno mesto, in vpliva na spremembo povsod. In potem bi jaz Niz hiš študentov. 

In zdaj, bi jaz naredil kaj takega for (int i = 0; i <študentov; i ++. Torej sem tipkanje hitro, vendar je to verjetno seznanjeni sintaksa zdaj. 

In zdaj, to je novejši. Če želim dati v i-th ime študenta, mislim, da to storim. In potem, ne imena ampak hiše oklepati i. Storim to, GetString, in pustite, grem nazaj in popraviti to linijo. Se strinjate? Strinjate? To ni zelo uporabniku prijazen. Nisem še povedal, za kaj naj stori. 

Toda zdaj, če sem prav želel kasneje, dajva recimo, natisnite te stvari out-- tako TODO kasneje. Grem narediti več z to-- to verjetno pomeni pravilno izvajanje dobili imena in hiše, tri jih skupno vsak od uporabnika. 

Vendar to ni zelo dober design, kajne? Kaj pa, če ima študent ne le ime in hiše, ampak tudi ID številko, in telefonsko številko, in e-poštni naslov, in morda domača stran, in Mogoče ročaj Twitter, in poljubno število drugih podrobnosti povezana s študent ali oseba, bolj na splošno. Kako bi začeli dodati Funkcionalnost na tem programu? 

No, počutim se kot najenostavnejši način bi lahko biti, da narediš nekaj podobnega, recimo, int IDS študentov. Tako da sem lahko dal vse svoje ID-tam. In potem, za nekaj kot so telefonske številke, Nisem prepričan, kako pomenijo, da je samo še. Torej, gremo naprej in samo klic to Twitters študentov, ki je malo čudno, ampak-- in kup več področjih. 

Sem začel, da učinkovito kopiraj in prilepi tukaj. In to se bo precej povečala nepriročno precej hitro, kajne? Ali ne bi bilo lepo, če bi bilo v svetu znana podatkovna struktura ne kot int ali niz, vendar nekaj višji nivo, abstrakcija, tako govoriti, znano kot študent? C ni prišel z vgrajenim funkcionalnost za študente, kaj pa če sem hotel, da bi ga na primer? 

No, izkazalo se je, da bom Datoteko odprete tako imenovano structs.h tukaj, in lahko narediš točno to. In bomo s tem začnemo takoj. In pod pokrovom zastavila tri P, ste že bili to počne zdaj. Ni take stvari kot g RECT no ali g oval v programskem jeziku C. 

Ljudje na Stanfordu izvajajo tisti, Vrste podatkov, ki jih uporabljajo ta pristop tu, razglasitvi svoje nove podatke Vrste, ki uporabljajo novo ključno besedo imenovano struct in drugo ena imenovana typedef. In res, čeprav sintaksa zgleda malo drugačna od stvari smo videli prej, v Načelo, da je zelo preprost. 

To samo pomeni, "določite vrsto." To se dogaja, da se struktura in struktura je kot vsebnik za več stvari. In da se bo struktura imeti niz imenovano ime, in niz imenovano hišo. In recimo, samo za udobje, vsa ta podatkovna struktura študentov. 

Torej v trenutku, ko pridemo do podpičje, imate zdaj ustvarili svoj podatkov tip se imenuje študentski ki sedaj stoji poleg int, in float, in char, in niz, in g rect, in g oval, in poljubno število drugih stvari, so ljudje izumili. 

Torej, kaj je koristno za to Zdaj je, da če grem nazaj da struct 0 in konča to izvedba, ki sem ga napisal vnaprej tukaj, opazili, da so vsi neizogibne messiness da je bil tik pred začetkom dogaja, ko sem dodal telefonske številke in Twitters in vse ti druge stvari Opredelitev študenta, zdaj je na kratko zaokrožila kot le en niz študentov. 

In vsak od teh študentov zdaj ima več stvari znotraj njega. Tako da samo pusti eno vprašanje. Kako priti na ime, in hiše, in ID, in karkoli drugega je znotraj študenta? Super enostavno, kot tudi. New sintakso, ampak preprosto idejo. 

Vi preprosto indeks v polju, kot smo prejšnji teden in to. In kaj je jasno nov del sintakse? Just., Kar pomeni "noter struktura in se polje imenuje ime, dobili polje imenovano hiša, dobili polje z imenom študent. " 

Torej, v zastavila tri P, če ste še vedno delajo na tem, in večina ljudi še vedno so spoznali, da so vas začnete uporabljati stvari, kot so g pravokotnike in g ovala in druge stvari, ki se ne zdi, da prihajajo iz tedna nič, ena ali dva, Zavedam se, da je to zato, ker Stanfordu razglasiti nekaj novih vrst podatkov. 

In res, to je točno tisto, kar bom storiti, kot tudi, v P določili štiri, ko smo se začeli ukvarjati s stvarmi, kot so slike, bitne slike, in še več. Torej, to je samo teaser in miselni model za to, kar nas čaka v prihodnosti. Zdaj sem odlašal bit zjutraj. Bila sem radovedna, da vidim, kaj Microsoft ozadje dejansko Izgleda kot danes. In izkazalo se je nekdo v letu 2006 dejansko šel skoraj natančno Isto mesto za fotografiranje v resnici , kar izgleda kot da je v teh dneh. Polje je sedaj malo zaraščena. 

Torej govorimo zdaj podob, kaj je prinesla nazaj Daven tukaj na zaslonu in Miklavža, in vas samo opomnim da, če želite, da se nam pridružite na kosilo ta petek, glavo, da naši običajni URL tukaj. 

Torej, kam gremo off v ponedeljek? Uvedli smo ta problem, kajne? To je na videz pravilno Izvajanje zamenjave, pri čemer si vzela dve ints, ena imenovana, ena imenovana b, swap njih, tako kot si tukaj Laura na odru z mlekom in vodo, z uporabo začasno spremenljivka ali prazna skodelica, tako da bi lahko dal b v in A v b, ne da bi zmedo. Uporabili smo spremenljivko. Imenuje se temp. 

Toda kaj je bilo temeljno Težava s to kodo v ponedeljek? Kaj je bilo narobe? Ja. 

OBČINSTVO: To zahteva več prostora. 

DAVID J. Malan: Zavzema več prostor, ker sem z spremenljivko, in to je v redu. To je res, toda jaz sem reči, da je v redu. To je le 32 bitov v grand Shema stvari, tako da ni nič takega. Druge misli? OBČINSTVO: To samo swap spremenljivke lokalno. DAVID J. Malan: Točno tako. To samo zamenjave spremenljivke lokalno. Ker kadarkoli pokličete function-- ko sem imel pladnje iz Annenberg zadnji čas, imate glavni na dnu. Takoj, ko pokličete funkcijo swap, swap ne pride x in y, prvotne vrednosti. Kaj swap dobimo, pa trdimo? Ciljna publika: izvodih. DAVID J. Malan: Torej kopije njih. Tako, da postane ena in dva, če vas Spominjam se primera iz zadnjega časa, vendar kopija ene in dveh ki so uspešno zamenjali. Ampak na žalost na koncu, te vrednosti so vedno enake. Tako bomo lahko videli z našimi novi prijatelj, upam GDB, ki ste ali TFS in Ca je imela so te vodi k naslednji. 

Torej ni swap odpoklic videti takšen-- Dovolite odpirajo to-- izgleda takole. Inicializirana smo x enem, y, da dva. Imela kup print f je. Ampak potem, klicno tipko Tukaj je bil, da bi zamenjali, kar je točno kodo, ki smo Pravkar sem videla pred nekaj trenutki. Ki je pravilna sprva pogled, vendar funkcionalno ta program ne deluje, ker ne stalno zamenjati x in y. 

Pa poglejmo to, hitro toplo tu z GDB, ki ./noswap. Kup veliko informacij, ki Bom znebiti s Control L za zdaj. In zdaj, bom za iti naprej in ga zaženite. In žal, da ni bilo, da je koristno. Potekal je program, znotraj tega Program se imenuje GDB, iskalnik napak, ampak ni mi suniti okrog. 

Torej, kako lahko dejansko premor izvedba znotraj tega programa? Tako prekinil. In jaz bi prekinil na katerokoli linijo številka, ena, 10, 15. Ampak lahko tudi prekinil simbolično z besedami odmor Main. In to se dogaja, da se določi odmor točka, očitno v vrstici 16 v glavni. In kje je linija 16? Pojdimo do kode in pojdite do noswap. In res, linija 16 je Prva v programu. 

Torej, zdaj, če grem naprej in tip teči ta čas, Enter, da začasno ustavi. Torej, kaj je suniti okrog. Natisni x-- zakaj je x nič? In ignorirati znak za dolar. To je samo za Ljubitelj uporaba programa. Zakaj je x nič v tem trenutku? Ja. 

OBČINSTVO: To začasno ustavljen tik pred linija 16, ni dejansko na liniji 16. DAVID J. Malan: Točno tako. GDB, ki ga privzeto, je začasno ustavljen izvedba tik pred črto 16. Torej ni izvršena, ki pomeni x je neznanega vrednosti. In imamo srečo, da je Nekaj ​​čisto nič všeč. Torej, zdaj, če sem tip zraven, zdaj izvajajo 16. To Čaka me za izvedbo 17. Dovolite mi, da gredo naprej in print x. To je eno. Dovolite mi, da gredo naprej in print y. Kaj naj zdaj vidim? 

OBČINSTVO: [neslišno] 

DAVID J. Malan: malo glasneje. 

OBČINSTVO: [neslišno] DAVID J. Malan: Ni čisto soglasje. Torej, ja, smo videli nekaj smeti vrednost. Zdaj, y je 134514064 tam. No, to je samo nekaj smeti vrednost. Moj program uporablja RAM za različne namene. Ni druge funkcije. Drugi ljudje napisal v mojem računalniku. Tako da so bili ti delci se uporabljajo za druge vrednote, in kaj vidim je ostanke nekaterih pred uporabo tega spomina. 

Tako da ni nič takega, ker takoj kot sem tip zraven in nato natisnete y, to je inicializiran na vrednost, ki jo želim. Torej, zdaj, gremo naprej malo hitreje. N za dostavo. Pa dajmo še enkrat. Pa dajmo še enkrat. Vendar ne želim, da hit je tukaj, ker če I želite videti, kaj se dogaja v notranjosti zamenjave, kaj je ukaz? 

OBČINSTVO: koraki. 

DAVID J. Malan: koraki. Torej, to mi stopi funkcija, namesto nad njim. In zdaj, to je malce skrivnosten pošteno, ampak to je samo mi je povedal, da sem v skladu 33 zdaj. In kaj je to storiti še enkrat. Print temp. Garbage vrednost, negativna tokrat, ampak to je samo še smeti vrednost. Torej, kaj storiti naslednjič, tiskanje temp. To je inicializiran na 1, kar je vrednost x, alias. 

No, kje so naše in X prihaja? No, opazil v glavnem smo imenujemo te vrednosti x in y. Nato smo opravili jih zamenjati, kot sledi. X je prišel prvi, vejica y. In potem bi lahko swap jih imenujemo x in y. Vendar zaradi jasnosti, saj je jih kliče in b. Toda a in b so sedaj bo kopije x in y, oz. 

Torej, če se vrnem k GDB, temp Zdaj je eden in je zdaj ena. Ampak, če jaz zraven in zdaj naredim print , se je že preselila. Mleko je zlijemo v bivši Pomarančni sok je iz stekla, ali obratno. 

In če jaz zraven še enkrat, in zdaj če sem izpisal kot preverjanje razumnosti, še dva, vendar je b sedaj ena. Odkrito povedano, da je še vedno tam. Briga me, kaj je temp. Toda takoj, ko sem zdaj tip, recimo, naprej iti nazaj, zdaj pa sem na koncu Program. In na žalost, je x še ena in je y še dva. 

Torej, kaj je uporabnost GDB tam? Ni mi pomaga popraviti Problem po sebi, vendar pa upajmo, da mi pomaga razumeti z vnovčitvijo da ja, moja logika je v redu, ampak moja koda ni na koncu z trajen vpliv. Torej, to je problem, da smo bomo zdaj rešili še danes. 

Ampak kaj je tja s pomočjo tega. String je laž. Zato tudi ni tip podatkov da obstaja v C. To je sinonim za nekatere Čas je za nekaj drugega, in smo lahko pokaže, da takole. 

Dovolite mi, da gredo naprej in odprla Program se imenuje primerjate-0. In namesto da vnesete tole ven, bomo začeli hoditi po kodi Sem že napisal, ampak to je le nekaj vrstic. Torej je to primerjati-0. In prva stvar, ki jo počnem postaja vrstico besedila. 

Ampak obvestilo, kaj sem šel prvič. Kaj je drugače jasno o vrstici 21? Pravzaprav, počakaj malo. To je kopija dva. To ni niti pravi program. V redu, alert spojler. Vse v redu, tako da nikoli ne pozabite, da. To je odgovor na vprašanje v prihodnosti. 

Tukaj je primerjati-0, in sem o tem, da bi dobili vrstico besedila. Program je veliko enostavnejši. Torej je to enostavno. To je kot Week One, Two Week stvari v tem trenutku. STRING s = GetString. Zdaj sem spet pravijo tukaj. Niz t = GetString. In potem, zadnja stvar, ki pri tem Program, kot pove že ime, se bom poskusil, da jih primerjajo. 

Torej, če s, prvi niz, enaka = T, potem sem reči vnesete isto stvar. Drugega, bom rekel, vnesete različne stvari. Torej, kaj je zbrati in zaženete ta program. Tako da primerjati nič. Izgleda dobro. Ni pripravljanja napake. 

Dovolite mi, daj zdaj in tip ./compare-0. Dovolite mi, da gredo naprej in povedati nekaj : Daven in nekaj: Rob. In sem tip različne stvari. Do sedaj tako dobro. Program se zdi, da je pravilna. 

Ampak kaj je to spet teči. Nekaj ​​reči: Gabe. Nekaj ​​reči: Gabe. V redu. Mogoče sem udaril preslednico ali nekaj funky. Pa dajmo še enkrat. Torej Zamyla. Zamyla. Različni stvari. Torej, kaj se dogaja? 

Torej imamo te dve vrstici koda, GetString se dvakrat klical. In potem sem preprosto poskušam primerjati s in t. Toda kaj v resnici pa se dogaja? No, moj rokopis je na tem, da poklal ta primer nekoliko. In kaj je pravzaprav vrgel to se tukaj, kot tudi. 

Torej imamo podobno vrstico STRING s = GetString. Torej, to je preprosto prva zanimivo linijo s tem programom. Toda kaj je ves ta čas bilo dogaja pod pokrovom? No, na levi strani je niz, ki je neke vrste spremenljivke, in se imenuje s. Tako da vem, da se to uporablja pomnilnik, ali RAM v mojem računalniku nekako. Torej bom abstraktno pripraviti, da kot kvadrat. 32 bitov, se izkaže, ampak več o tem v prihodnosti. In potem, kaj se dogaja tukaj? 

No, očitno GetString dobi niz od uporabnika. In GetString dobil Zamyla ali Gabe ali Daven. Torej, kaj izbrati prvi od tiste, ki je bila Daven. Tako učinkovito, kaj GetString dobil mi v tem prvem primeru je D-proti-e-n. In potem, kaj naredil da mi na skrivaj? OBČINSTVO: [neslišno] DAVID J. Malan: Ja, / 0 ali null znak. Torej je dejansko mi je dal niz. Vendar že vemo iz prejšnjih Izgleda, da je niz le niz znakov, in se zaključi z to posebno sentinel znak, / 0. 

Ampak, če je to res in to je kvadrat, to je očitno precej večji pravokotnik. In res, to je, Trdim, le 32 bitov. In to je nedvomno več kot 32 bitov, ker je to verjetno osem plus osem plus osem plus osem plus osem, samo zato, ker bajtov v ASCII. Kako za vraga se bomo fit Daven v tej mali škatli tukaj? 

No, kaj je GetString pravzaprav počne? No, to grid tu predstavlja pomnilnik ali RAM mojega računalnika. Torej, kaj je samovoljno reči, da če vsak od njih predstavlja bajt, potem lahko razmišljamo o vsaki bajt kot ima naslov kot 33 Oxford Street, ali 34 Oxford Street, ali 35 Oxford Street. 

Torej, tako kot hišice imajo naslove in zgradbe imajo naslove, storijo posamezne bajte Pomnilnik imajo naslove ali številke da jih enolično identifikacijo. No, to je samovoljna. Ampak naj bo enostavno, da bom uporabite šestnajstiški samo po dogovoru vendar 0x pomeni nič drugega kot "to je šestnajstiško." in bom trdila, da "D" konča na Byte One v spomin. 

Nimam kaj drugega za delat v pomnilnik, tako Daven dobil prvo mesto na Byte One. To je potem, se bo 0x2. To se dogaja, da 0x3. To se bo 0x4. To se dogaja, da 0x5. To se bo 0x6. 

Toda, ko boste začeli razmišljati O tem, kaj počne računalnika Pod pokrovom motorja, lahko začnete sklepati kako se vam je pred nekaj leti, bi izvajajo C sebi. Kaj je GetString verjetno returning--, ker je se počuti, kot da je ni vračanje Daven po sebi, ker on zagotovo ne bo da se prilega v tej mali box-- Torej, kaj je GetString verjetno vrača? 

OBČINSTVO: [neslišno] 

DAVID J. Malan: lokacija Daven. In to je bilo to odkar enem tednu. Kaj GetString je res vračanje ni niz po sebi. To je ena izmed majhnih belih laži. To je vračanje naslov Niz v spomin, edinstven naslov. Daven živi na 33 Oxford Street. Ampak bolj na kratko, Gavin živi na 0x1, Naslov številka ena. 

Torej, kdo bo dal v tem Malo polje, potem, da bo jasno, je le naslov tega niza. Torej, ves ta čas, to bil je dogajalo. Toda kaj to namiguje na Zdaj je, da ima, če vsi S je število znotraj nje, ki je ustaviti, programer, od nalagajo številko vsaka spremenljivka in samo skakanje na ta kos pomnilnika? In res, bomo videli da je grožnja naslednjič. 

Ampak za zdaj, to meni ne zadošča. Če rečem, da me Niz, mi daš Daven. Vendar ne boste res mi Daven. Vse, kar mi je dal naslov Daven je. Kako potem vemo zagotovo kjer Daven začne in ends-- Zgodba postaja weird-- kjer Daven začne in konča, in nato, dostavo Niz v spomin začne? 

No, če ste se predali me začetek Daven, v bistvu, kako naj vem kjer je konec njegovega imena? Da posebna null znak, ki je še toliko bolj pomembno zdaj če strune pod njim hood preprosto prepoznavanje enolično po lokaciji v pomnilniku. Torej, vse to čas, ki je kaj se je dogajalo. 

Torej, če pogledamo zdaj koda tukaj, razložiti če bi napaka v vrstici 26. Zakaj je Zamyla in Zamyla drugačen? Zakaj je Gabe in Gabe drugačen? Ja, v hrbtu. 

OBČINSTVO: Imajo različne naslove. 

DAVID J. Malan: Preprosto zato, ker imajo različne naslove. Ker, ko pokličete GetString še enkrat, kar bom naredil hitro tukaj, če je ta druga linija, niz t, saj sem v tem programu, enaka drug klic GetString. Naslednjič, ko bom poklical GetString, bom da bi dobili drugačen kos pomnilnika. 

GetString je dovoljeno vprašati poslovanja Sistem za več in več pomnilnika. To ne bo mogoče ponovno uporabiti enak šest zlogov vsak čas. To se dogaja, da bi dobili novo kos pomnilnika, ki pomeni t bo dobil kakšno drugo vrednost tukaj. 

Torej, ko sem naredil s enaka = t, nisi primerjavo D proti temu in proti Ta in V pred tem. Saj primerjave tega proti temu, kar odkrito je zelo useful-- useless-- je precej neuporabna, ker, ki res briga, če so strune v spominu? 

In res, nismo. In mi ne bo začeti posebno skrb. Le v obsegu, da lahko pride do napake in varnostne grožnje lahko pojavijo volje smo dejansko začeli skrbeti za to. Torej, dajmo se določi ta problem. Izkazalo se je, ga popravim super enostavno. 

In kaj je pravzaprav pred I spet razkrivajo, da bi kaj vi storili, če v razredu CS50, in si moral izvajati Primerjava z dvema strune. Vi očitno ne moreš uporabljati s enaka = t. Ampak samo logično, kako bi primerjali ta niz glede na to vrvico s kodo C? Ja. 

OBČINSTVO: Naredi zanke [neslišno] DAVID J. Malan: Popolna. OBČINSTVO: [neslišno] DAVID J. Malan: Ja. Samo uporabite za zanke ali a medtem ko zanke ali karkoli. Ampak velja samo osnovno idejo, da če to je kos pomnilnika ali matrike in to je, ponovitev čez oba hkrati. In ravno primerjati črke. 

In moraš biti malo previdni, saj vas Ne želim en prst iti mimo drugega ker je ena niz dlje kot drugi. Tako da boste želeli, da preverite, Ta posebna vrednost na koncu, null. Ampak res je, v end, tako enostavno, kot da. In odkrito povedano, ne potrebujemo na novo izumiti, da kolo. Tukaj je Version Two. In kaj bom rekel, tukaj je, da namesto da bi primerjali s enaka = T Jaz sem namesto tega reči, če niz Primerjava s vejica t = 0 enaka. Zdaj, kaj je niz primerjati? 

Izkazalo se je, da je funkcija, ki prihaja s C, katerih namen v življenju je za primerjavo dveh nizov. In premešamo primerjati, če beremo njene man stran ali dokumentacijo ali CS50 reference, se bo preprosto vam povem, da je razburjenje primerjati donose bodisi negativne številko ali pozitivno število ali nič, kjer nič pomeni, da so enaki. 

Torej samo ugibanje. Kaj bi pomenilo, če premešamo primerjavo donose negativna vrednost ali pozitivna vrednost? OBČINSTVO: Večja ali manjša od. DAVID J. Malan: Ja, večja ali manjša od. Torej, če si hotel, da razvrstite celoto kup strun v dictionary-- saj bomo na koncu navzdol road-- odlična funkcija za potencialno uporabo, saj bo to storil Primerjava nizov za vas, in povejte ti ne pride pred b, ali pa b prišel pred abecedi. Ne moremo storiti prav to. 

In opazil, sem eno drugo stvar v tem primeru. , Kaj se je spremenilo več v to glavno funkcijo? Char *. In to je, da je druga bela laž. Ves ta čas, ko ste jih pisal niz, smo bili na skrivaj reportaža Niz kot char *, tako da Jek dejansko vas razume. 

Z drugimi besedami, v CS50.h in kot bomo sčasoma videli, smo naredili sinonim imenuje niz to je isto, kot char *. In sedaj, samo vem, da je *, V tem kontekstu, vsaj pomeni naslov. 

Naslov, kaj? No, dejstvo, da sem rekel, char *, in ne int * ali float * pomeni, da je char * naslov char. Torej ta mali box tukaj, aka Niz je res tipa char *, ki je preprosto fancy način rekel, v tem polju bo šel naslov. In kaj naj bi to naslov nanašala? Očitno char. 

Vendar pa smo lahko povsem imajo int * in druge stvari. Ampak za zdaj, char * je res najbolj enostavna in eden od obresti. Tako da je ta problem se dogaja narašča, čeprav, še enkrat. 

Recimo, da sem ta program odprl. Poglejmo, če zdaj ne more napovedati kaj je narobe s to kodo. Torej, v tem programu, kopirni 0, sem dogaja, da gredo naprej in spet poklical GetString in shranite vrednost v s. 

In potem, zakaj delam to, prav tako kot opominu tednov preteklosti? Nismo rekli, da GetString včasih vrne null. Kaj pomeni, če GetString vrne null? Nekaj ​​je šlo narobe. To verjetno pomeni niz je preveč big, računalnika iz spomina. To se zgodi, super, super, super redko, vendar pa bi se lahko zgodilo. Smo želeli preveriti za to, in da je vse, kar delamo. 

Ker bomo videli sedaj, če ne začnete preverjanje običajno stvari kot null, boste morda dejansko začnejo iti za naslove v spominu, da so neveljavni. In boste začeli induciranje več segmentacije napake. Ali Mac ali PC, samo povzroči računalnik viseti ali programa, da zamrzne, potencialno. 

Torej, zdaj, Trdim v copy-0.c, da I bom kopiranje teh nizov z z linijo 28. In potem, bom zahtevku na dnu tu, da bom spremeniti eno od njih. 

Tako opazijo. Kličem naš stari prijatelj strlen. In samo razložiti v angleščini Kaj je to linija 34 počne? Kaj t nosilec 0 predstavljajo na levi. Ja. 

OBČINSTVO: Prvi znak t? DAVID J. Malan: Prvi znak t. To je vse. Prvi znak t, želim dodeliti veliko tiskano različico prvega znaka v t. Zato je ta kapitalizacije prva črka. In potem, zelo zadnja stvar, ki mi V ta program je Trdim tukaj original, S, in tukaj je kopija, t. 

Ampak temelji na zgodbi smo pravkar povedal, kaj v resnici so strune, kaj je linija 28 res počne, in kaj je Nastalo bug dogaja da se na zaslonu? 

Torej, najprej, prvo vprašanje, 28. Kaj je niz t = i res počne? Če imamo na levi strani stranski tukaj niz t = i; da mi daje eno okence tu in ena škatla tukaj. In domnevam, da je ta naslov 0x, recimo, 50 tokrat samovoljno. Kaj niz t = S storiti pod pokrovom? 

OBČINSTVO: [neslišno] 

DAVID J. Malan: V njej so zbrani spomin tam obravnavajo, tako 0x50 hodi tja. Torej, če zdaj, grem v prvi lik v t in velike črke, kaj sem dejansko počne s? Jaz res počne isto stvar, kajne? Ker če Naslov 0x50-- in samo sem Nimate veliko prostora na krovu tukaj, ampak predvidevam, da je to 0x50 tukaj, nekje v spominu mojega računalnika. 

In sem se, na primer, Gabe v male črke tukaj, kot je ta. In sem rekel t bracket 0 gets kapitalizira. No, t nosilec je 0 prva črka v t. Tako malo g bo postala velika G. Ampak problem je, kaj je tudi poudariti, da? 

PUBLIKA: Enako. 

DAVID J. Malan: Enako natančno stvar. Tako preprosta razlaga morda, tudi če je sintaksa malo čudno. Torej, kaj je to. Naredi copy-0 in nato ./copy-0. Nekaj ​​reči: Gabe. In na žalost, oba jim je bilo zdaj veliko začetnico, ampak za to osnovo, Razlog, da smo preprosto Zdaj se ukvarjajo z naslovi. 

Torej, kako naj začnemo address-- no pun intended-- kako naj začnemo obravnavati to predvsem problem? No, v copy1.c, gredo stvari , da bi dobili malo bolj zapletena. Ampak jaz bi trdijo konceptualno preprosta rešitev. 

Tako težko, da se na prvi pogled. Ne bo enostavno, za prvo ko ga tip ven, morda, ampak, če je problem, da preprosto delam t = S samo kopije naslov, kaj, še enkrat, če sem lahko izberete na vas, se bo rešitev za dejansko kopiranje niz? 

OBČINSTVO: Verjetno bova ponovno uporabiti zanko. 

DAVID J. Malan: Ja. Torej bomo spet potrebovali zanko. In ker če želimo kopirati Niz je v drugem nizu, bomo verjetno želeli, da to storite znak za znakom. Ampak problem je, če je To je prvotno e, Zdaj moramo izrecno začeti dodeljevanje pomnilnika za t. 

Z drugimi besedami, dajva izvlečete to zadnjič. Če tega niza s = GetString. In kaj je dal to sem gor, kot dobro. To je GetString. In potem, slika za nekaj kot da se bo kot prej, g-b-e / 0. To izgleda malo kaj takega. In je zato pravimo to 0x50, in da bo v 51, 52. 

Torej, to je 0x50. In potem jaz niza t. V spomin, da bo le dajte mi malo kvadrat takega. Torej, kaj je sedaj ključni korak? Če želim, da bi kopirali s vt, kaj blank pa moramo izpolniti tu? Ali kaj moramo storite na visoki ravni? Ja? Nekdo? Ja. 

OBČINSTVO: Moramo [neslišno]. DAVID J. Malan: Ja, morate zapolniti prazno. Ne morem kopirati in nato izkoristiti ime Gabe je dokler nisem vprašal operacijski sistem za drugo kos pomnilnika da je vsaj tako velika kot original. Tako da nam ostane vprašanje. 

Kako prosim, operacijski sistem ne samo za navadno malo pointer-- kot se to imenuje, naslov, pointer-- ne za navadno majhno okence kot to imenuje niz? Kako prosim poslovanja Sistem za velik kos spomina? Doslej sem dobil samo to nazaj posredno s pozivom GetString. Torej, kako se GetString celo dobili svoj spomin? 

No, izkazalo se je, da obstaja ta druga funkcija tukaj da bomo zdaj začeli uporabljati. Zdaj, to izgleda tako bolj prikrit than-- in jaz sem edini, ki vidi tem-- ta vrstica izgleda tako bolj skrivnosten potem pa naj bi se na prvi pogled. Ampak kaj je to draži narazen. 

Na levi strani imam char * t. Torej, v angleščini, začnimo, da oblikujejo ustrezne kazni v tehničnem žargonu. Torej je to dodeljevanje spremenljivka tipa char * imenuje t. Zdaj, kaj to v resnici pomeni? 

No, to pomeni, kaj bom dali v to spremenljivko z imenom t? Naslov char. Torej, to je samo enostavnejše, bolj razumen način opisovanja levo stran. Tako, da ustvarja to polje tu samo. Torej desna stran, predvidoma se bo dodeliti, da večji kos pomnilnika, kako? Torej, kaj je to draži narazen. 

To je zasenčila na prvi pogled, ampak kaj se dogaja tu notri? Prvič, tam je malloc, ki je očitno naš novi prijatelj, "Spomin dodeliti." Torej je ta argument prevalili vanj, tako da je precej velik argument. Torej, kaj je to draži narazen. 

strlen S, seveda, predstavlja za-- OBČINSTVO: število znakov. DAVID J. Malan: Just število znakov v s. Torej dolžina s, originalni niz. Torej G-b-e. Torej je to verjetno štirje v tem primeru. Zakaj počnem 1 po kliče strlen za s? OBČINSTVO: [neslišno] DAVID J. Malan: Za to posebna null znak. Če me vprašate, kaj je dolžina Ime Gabe je, bom rekel, štiri. Pod pokrovom motorja, čeprav moram da peti bajtov null značaja. Torej, to je, zakaj delam 1. 

Zdaj pa samo v primeru, da to izvajate Program na drugem računalniku, kot, recimo, CS50 aparata, kjer je velikost char lahko drugačen Iz lastne computer-- Izkazalo se je, da sem lahko to imenujemo Operator sizeof, samo vprašati računalnik, kakšna je velikost char na tem računalniku? 

In da se pomnoži pet v tem na primer z velikostjo char, ki na večini računalnikov bo samo ena, malloc se bo dodelila za mene je to velik kos pomnilnika, tukaj na desni. In to se dogaja, da return-- je function--, tako da je dogaja, da se vrnete v meni kaj? OBČINSTVO: naslov? DAVID J. Malan: naslov, kaj? OBČINSTVO: Od spomin je namenila? DAVID J. Malan: Of spomin je dodeljen. Tako da nimam pojma, odkrito povedano, kam to pelje na koncu. Bom predlagal, da da se bo na koncu na 0x88. Popolnoma poljubna, vendar drugje kot 0x50, ker operacijskega sistema, kar Windows in Mac OS naredil zame, je poskrbite, da se daje me različni kosi RAM. 

Torej, to je vrednost, kadar je to kos pomnilnika, morda na koncu. Torej, to je tisto, kar konča tukaj, 0x88. Torej, zdaj je jasno, razumem da to ni enako kot to, ker oni gledata različne kose pomnilnika. Torej, če sem zdaj dejansko želite kopirati to leta, naredimo svoj predlog rešitve. 

Pojdiva, ustvari zanko, in ne t nosilec i dobi e nosilec i. Ker zdaj sem lahko uporabite To diod kot zapis, kajti čeprav malloc zelo splošno mi dodeljuje pomnilnik, spomin je samo sosednja bajta. Bajt, bajt, bajt, back to back to back. 

Ne morem zagotovo kot programer obravnavati kot matriko, ki pomeni, da lahko uporabite to na koncu pozna Zapis v le nekaj kvadratnih oklepajih. 

Zato mi dovolite, ustavite tam, ker To je veliko naenkrat, čeprav čeprav je osnovna ideja, da povzamem je, da je niz, ves ta čas, ni nov tip podatkov po sebi. To je samo tako imenovani kazalec, naslov značaja, ki samo pomeni, da je število ki jih človeško dogovoru smo nagnjeni, da napišete kot 0x nekaj. 

Ampak to je samo številka, kot 33 Oxford Street, ki se zgodi, da bo Naslov CS stavbe. Vsa vprašanja v zvezi s temi podatki? Ja? 

OBČINSTVO: Zakaj preveriti za t enaka NULL? 

DAVID J. Malan: zakaj delamo to preverite t enaka NULL? Če beremo documentation-- super question-- za funkcije malloc, to bo rekel, v drobnem tisku, včasih morda malloc vrne null, tako kot GetString. In res, GetString vrne null če v zameno, malloc vrne null, ker GetString uporablja malloc. 

In da se lahko zgodi, če OS, Mac OS, Windows, karkoli, je preprosto zmanjkalo pomnilnika za vas. Torej, to je tisto, kar se je zgodilo. 

In mi pokažejo še eno drugo stvar da lahko samo blow your mind ali popolnoma predaleč v liniji. Ampak, dovolite mi, potegnite navzgor Enako zanko za kopiranje, ki je pred nekaj trenutki, je bil odpoklic to. t bracket i dobi e nosilec i. 

Lepo in uporabniku prijazen. Počutim se kot Week Two znova. Vendar je ta verzija lahko dejansko zapišemo kot to, kar je videti skrivnosten. To tehniko, imenovano kazalec aritmetika, naslov aritmetično. Ampak zakaj to deluje? 

Zdaj zoprno, Avtorji C, se je odločilo za * simbol za različne namene. Videli smo ga uporabili že enkrat, char *, kar pomeni, "da mi spremenljivko ki bo vsebovala naslov char. " Torej char * v tem kontekstu pomeni "daj mi spremenljivko." 

Na žalost, če boste uporabili * brez beseda pred njo, kot char, to je zdaj imenuje operator dereference. In bomo videli, več o tem kmalu. Ampak to samo pomeni "tja." To je kot bi rekel, če bi me nekdo izročil na kosu papirja "33 Oxford Street," če naredim "* 33 Oxford Street", kar pomeni, da "Pojdi po cesti do objekta CS." 

Torej * samo pomeni iti tja, če ni beseda pred njim. Torej, kaj je t, da bo jasno? t je naslov kos pomnilnika, ki je dobila nazaj. s je naslov kaj, da bo jasno, V primeru smo že razpravljali, z malimi Gabe? y je naslov o-- OBČINSTVO: niz. DAVID J. Malan: Od prvotnega imena Gabe je. Torej, to je naslov ta kos pomnilnika. Torej, če rečem, t + jaz-- i, obvestilo, je samo naš stari prijatelj. To je samo index spremenljivka da je ponavljanjem od nič gor dolžini niza s. Tako se dogaja, da se nič, nato pa eno, Nato dva, nato tri, nato štiri. Torej, kaj je zbrati te nove Prasko kosov sestavljanke, če hočete, čeprav, spet, sintaksa je veliko bolj skrivnostne kot nič. Torej t naslov + i se dogaja, da me številko, saj so ti vsi Številke, ki smo jih za risanje, kot čarovnica. Ampak oni so samo številke. 

Torej, če je naslov t smo rekli je 0x88, kaj je 0x88 plus nič. Tudi če niste zadovoljni z hex še, da ugibati. 

OBČINSTVO: original. 

DAVID J. Malan: Still 0x88. Torej, kaj * 0x88 pomeni? To pomeni, "tja", kar pomeni, učinkovito, "dal svoj prst sem." Zdaj pa na desni strani ta izraz, * nato pa v parens, y + i pomeni ov, ki je obravnavati tu v mali g. y + 0 je, seveda, s, kar je s. 

Torej, zdaj, to je * ov, ki so prav tako kot * 33 Oxford Street pomeni, pojdite na naslov e. Torej, tukaj je to prst, desno roko. Torej, kaj bom skopirala v kaj? Stvar na desni strani, ki je Gabe, mali g tukaj, v tukaj. 

In tako je učinek, ki Prva ponovitev zanke, kot ste predlagali, čeprav je videti crazy bolj zapletena kot karkoli smo videli prej, je preprosto rekel pojdite sem in kopiranje tega znaka tukaj. To je vas daje zemljevida obeh lokacijah. 

In bomo videli veliko več od tega. Ampak za zdaj, upanje je, samo da bi uvesti nekatere od teh osnovnih idej. In res, si oglejmo en končni program tukaj, in nato obljubil claymation, ki bo vse v redu. V redu. Zato naj odpre up-- tam gremo. Torej jaz-- bomo vrnili za te slike pred dolgo. Dovolite mi, da odprejo ta primer končno tukaj. 

Torej, tukaj je super, super Program, ki dosega nič v življenju, ki naredi naslednje. Najprej izjavlja dve spremenljivki, X in y, ki niso številke tokrat, po sebi. Oni niso cela števila, per se. So očitno int *. Torej, kdo, kaj to pomeni če je vaš tip podatkov, vaša spremenljivka, je tipa int * zvezdo? To je naslov int. 

Tako da nimam pojma, tam, kjer je še ni. To samo pomeni, "povedano, na koncu, naslov notr tukaj. " 0x50, 0x88, kjerkoli je v spomin, naslov se dogaja tam. In to je tisto, kar je y bo, kot dobro. 

Če bom zdaj rekel, x = malloc (sizeof (int)), to je fancy način rekel, hej operacijski sistem, s pomočjo funkcije malloc, daj mi dovolj pomnilnika za velikost za notr, kar je verjetno bo 32 bitov ali štiri bajte. 

Torej, kaj malloc vrne? Malloc vrne naslov. Torej, kaj se dogaja, da se shranijo v X? Naslov kos spomin, štiri bajte, da malloc pravkar našel za mene z vprašanjem operacijski sistem. 

Zdaj medtem, vrstica štiri tukaj, * x = 42. Samo da bo jasno, Kaj se dogaja tam spodaj? Na levi strani, * x. da je kot * 33 Oxford Street. Torej * x pomeni kaj? 

OBČINSTVO: Pojdi na. 

DAVID J. Malan: Pojdi na ta naslov. Kjerkoli, da kos pomnilnik, iti k njej. In dal kar tam, seveda? OBČINSTVO: 42. DAVID J. Malan: 42. V redu, * y, ista ideja. Pojdi na naslov v y. Dal številko 13 ni, ampak kaj je y v tem trenutku? OBČINSTVO: Ni pomnilnik za y. DAVID J. Malan: Obstaja Ni pomnilnik za y. Torej, kaj y verjetno vsebuje, kot smo že govorili? 

OBČINSTVO: Garbage. 

DAVID J. Malan: Nekateri smeti vrednost. Zdaj, smeti vrednost je še vedno številka. To še vedno lahko zamenjali za naslov. To je, kot da bi nekdo načečkal nekaj dol, in mi je razlagalo v tem smislu, nekatere stavbe na ulici. In če si poskusite, da gredo v nekatere stavbe nimate, ali nekatere kos pomnilnika, ki ga ima, ne bila dana, bi se slabe stvari dogajajo. Računalnik lahko crash, ali kakšno drugo nedoločen vedenje se lahko zgodi. 

Torej intro, potem bi Binky je to. Še vedno se spomnim, 20 nekaj čudno let kasneje, kje sem bil, ko sem končno razumeti napotke. 

Kar pomeni, če oditi v treh minutah in mislim, da ne razumeti napotke, zavedati Sem se spomnil na 20. leta za nekaj norega razloga kdaj in zakaj je na koncu potonila leta, ki je sedel s svojim poučevanjem kolega, Nishat Mehta v nazaj Eliot Dining Hall. Zdaj sem se spomnil zato, ker je bilo to ena izmed tem, I, v Zlasti je boril z. In potem, končno kliknil, kot sem si upal reči, veliko tem sčasoma bo. In zdaj, da to čutijo vsi srečnejši in vse bolj prepričljiva, Vzemimo končno podobo v naših Zadnje tri minute tukaj na Binky, od našega prijatelja, Nick Parlante iz Stanforda. 

[VIDEO PREDVAJANJE] 

Hej, Binky. Zbudi se! To je čas za zabavo kazalca. 

Kaj je to? Spoznajte kazalci? Oh, Goody! 

No, za začetek, mislim, da smo Potreboval bo nekaj nasvetov. 

-OK. Ta koda dodeljeni dve kazalci, , ki lahko kažejo na cela števila. -OK. No, vidim dva kazalca, vendar pa Ne zdi se, da kaže na nič. 

-To Desno. Sprva kazalci ne kažejo nič. Stvari, ki so kazali, da se imenujejo pointees in njihovo vzpostavitvijo jev ločen korak. 

Oh, prav, prav. Vedel sem, da je. V pointees sta ločena. Er, tako da kako dodeliti pointee? 

-OK. No, to kodo razporeja Novi celo pointee, in tem delu so x, da kaže na to. 

Hej, da izgleda bolje. Torej bi bilo nekaj storiti. 

-OK. Bom dereference kazalca x do shranite številko 42 v svojem pointee. Za ta trik, bom potreboval mojo Magic Wand of Dereferenciranje. 

Tvoj Magic Wand of Dereferenciranje? To--, da je super. 

Tole je tisto koda izgleda. Bom ustanovil številko in [POP] 

Hej, poglej. Tukaj gre. 

Torej delaš razrešimo na x sledi arrow dostop do svojega pointee. V tem primeru, trgovina 42 notri. Hej, poskusite ga uporabljali za shranjevanje številke 13 skozi drugi kazalec, y. 

-OK. Grem tja, da y, in dobili številko 13 postavitev. In potem, vzemi palico Dereferenciranje in samo [BUZZ] 

Oh! 

Oh, hej! Da ni delovalo. Pravijo, Binky, jaz ne mislim Dereferenciranje y je dobra ideja, saj veš, vzpostavitev pointee je samostojen korak. In mislim, da ne bomo nikoli naredili. 

Dobro točka. Ja. Dodeljena smo kazalec y, vendar smo Nikoli ga nastavite, da kaže na pointee. 

-Zelo Pazljiv. Hej, iščete dobro tam, Binky. Lahko popraviš, tako da y točke na isti pointee kot x? 

-Seveda. Uporabil bom svojo čarobno palico od Pointer odstopu. 

Je to bo problem, kot prej? Ne. To ne dotikajte pointees. To samo spremeni en kazalec opozarjajo na isto stvar kot drugo. 

Oh, vidim. Zdaj y opozarja na istem mestu kot x. Torej, počakajte. Zdaj je določen y. Ima pointee. Torej, lahko poskusite palico Ponovno Dereferenciranje poslati 13 konec. 

Uh, OK. Tukaj gre. [POP] 

Hej, poglej to. Zdaj Dereferenciranje dela na y. In ker so kazalci v skupni rabi da eno pointee, oba videli 13. Ja. Delitev, karkoli. Torej bomo preklopiti krajev zdaj? 

Oh, poglej. Zmanjkalo nam je časa. 

-But-- 

Samo spomnite tri pravila kazalec. Number One, osnovna struktura je, da imate kazalec, in se kaže kot na pointee. Ampak kazalec in pointee so ločeni, in skupna napaka je ustanoviti kazalec, ampak, da bi pozabili, da ga pointee. 

Število Dva, kazalec Dereferenciranje začne na kazalec in sledi svoji puščico nad dostop do svojega pointee. Kot vsi vemo, je to Deluje samo, če je pointee, katere vrste vrne na prvo pravilo. 

Številka Tri, kazalec Dodelitev traja en kazalec in ga spreminja, da kaže na Enako pointee kot drugi kazalec. Torej, po odstopu, dve kazalci bo opozorila na istem pointee. Včasih, da se imenuje delitev. In to je vse, kar je z njo, res. Adijo zdaj. [END VIDEO PREDVAJANJE] DAVID J. Malan: To je za CS50. Vam bomo videli naslednji teden.