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
[За възпроизвеждане на музика] DAVID J. Malan: Добре. Това е CS50, и този е краят на седмицата Four. И една от темите днес е, че на цифрови експертиза, изкуството на възстановяване на информация. И наистина, макар вие сте в разгара точно сега на мира в Three и Breakout, следващата седмица, фокусът ще бъде върху Именно тази област. 

Така че едно от най-готините работни места, което някога съм имал е върнал в завършил училище, когато работех за местните Middlesex County окръжния прокурор офис, правят криминалистите работят. Така че, по същество, на Massachusetts Щатската полиция, по повод, при работа по случаи би приведе в неща като твърди дискове и флопи дискове и карти с памет и други подобни. И те ще ги предадат за мен и моят ментор, и нашата цел е да намери доказателства, ако има такива, по тези медии. Сега, може би сте видели проблясъци от този свят на съдебната медицина в медиите, телевизията и филмите. Но работата, която имах, и Смея да твърдя, че свят, не е съвсем като теб ще го видя. Нека хвърлим един поглед към това, което вие вероятно сте виждали. [VIDEO PLAYBACK] -OK. Сега, нека да се получи добър поглед към вас. 

[За възпроизвеждане на музика] 

Дръж го. Бягай, че обратно. 

-Чакайте Минути. Отиди надясно. -Има. Замразете това. -Пълно Екран. 

-OK. Замразете това. -Tighten Нагоре по този въпрос, ще ви? 

-Vector В на това човек от задната волана. 

-Zoom В точно тук на това място. 

-С Право оборудване, на изображението може да бъде разширен и заточени. 

Какво е това? 

-Това Програма аксесоар. 

Можеш ли ясно, че до всеки? 

Не знам. Нека да го засили. 

-Enhance Раздел A6. I засилено детайла, и-- -I Мисля, че има достатъчно, за да се подобри. То съобщение за моя екран. 

-I Засилено отражението в окото си. Вървим стартирате тази през видео аксесоар. 

-Edgar, Може ли да се подобри това? 

Дръж нататък. 

-Никога Работи по този размисъл. 

Нечий -Има размисъл. 

-Reflection. -Има Е отражение на лицето на мъжа. 

-Таблицата Размисъл! -Има Размисъл. -Zoom В върху огледалото. Можете да видите отражение. 

Можеш ли да подобрят имиджа от тук? Можеш ли да го подобри? Можеш ли да го подобри? Може ли да се подобри това? Можеш ли да го подобри? Дръж се на второ място. Ще се подобри. -Zoom В по вратата. -Times 10. -Zoom. -Move Инча -Повече. Чакайте, спрете. -Спри. Тя -Pause. -Rotate Ни 75 градуса около вертикалата, моля. 

-Спри. Върни се в част около вратата отново. 

-Разбрах Подобрител образ, който може да растерна графика? 

Може би ние можем да използваме Pradeep Сингх метод, за да видите в прозорците. 

-Таблицата Софтуер е състоянието на техниката. 

-Таблицата Собствена стойност е изключен. 

-С Правото комбинация на algorithms-- 

Взето осветление -Той алгоритми към следващото ниво, и мога да ги използвам, за да За подобряване на тази снимка. 

-Lock На и разширяване на Z-ос. 

-Enhance. Подобрете. -Enhance. -Freeze И подобри. [END възпроизвеждане на видео] DAVID J. Malan: Така че тези, които са всички думи, но те не са били използва в изречения правилно. И наистина в бъдеще, по всяко време, моля, ще чуете някой да казва думата, "Повиши", кудкудякане само малко. Защото, когато се опитате да се подобри, Например, това е, което се случва. 

Така че тук е една красива снимка. Това е собствен Дейвън CS50 е. И предполагам, че ние искахме да съсредоточи в по блясъка в очите му, или отражението на лош човек, че е ясно заснето от охранителната камера. Това е, което се случва, когато вие увеличите изображение, което има само ограничен брой на битовете, свързани с него. 

Това е, което ще получите. И наистина, в окото на Дейвън е е само четири, може би шест пиксела че композирате точно какво блещукаше там. Така Проблем Set Four в крайна сметка ще има проучи този свят, особено от природата на нещо ние наричаме файл I / O, където I / O е само един луксозен начин на казвайки вход и изход. 

Така че до този момент, всички взаимодействия сме имали с компютър са били в голяма степен с клавиатура и екран но не толкова с твърд диск, или спестяване на файлове извън тези, които себе си пиша. Вашите програми до този момент имат не са създаване и съхраняване, и актуализиране на техните собствени файлове. 

Е, какво е файл? Е, нещо като JPEG. Това е образ, може да се Трябва или да качите на Facebook, или вижте навсякъде в интернет. Наистина, че снимка ние просто трион на Дейвън е JPEG. И това, което е интересно за файлове, като JPEG снимки е, че те могат да бъдат идентифицирани, обикновено, от някои модели на битове. 

С други думи, това, което е, че отличава JPEG от GIF от PING от Word документ от файл Excel? Е, това е просто различен модели на бита. И тези различни модели са обикновено в началото на тези файлове. 

Така че, когато компютърът ви се отваря Word формат, или когато компютърът отваря JPEG, тя изглежда обикновено в Първите няколко бита във файла. И ако в него се признава един модел, той казва, о, това е образ. Позволете ми да го покажете на потребителя като графика. Или, о, това прилича на док Word. Позволете ми да го покаже на потребителя, тъй като есе. 

Така например, JPEG снимки, Оказва се, че са доста сложна под предния капак. Но първите три байта в почти всяка JPEG се започне с тези три числа. Така байт нула, едно, две и са в почти всеки JPEG, 255, броят 216, броят 255. 

И това, което ще бъде в състояние да започнете да правите следващата седмица всъщност изпълзяват под качулката на файлове, като JPEG снимки и като растерни файлове, и виждайки това, което винаги е било там за толкова дълго, като сте били с помощта на компютър. 

Но това, което е там не е типично написана като десетични числа, като този. Компютърни учени не правят са склонни да говорят в десетичен. Те наистина не се говори в двоичен. Обикновено, когато искаме да изразят числа, ние всъщност използват шестнадесетичен, което може би си спомняте от, да речем, Задача Set One, който се справи с можете да помислите за друга система. 

Ние, разбира се, са запознати с десетична запетая, нула през девет. Ние говорихме за двоичен. И ние наистина не са да използвате, че много тук нататък, защото компютрите ще използват това. Но програмисти ще много често, но не винаги, използвате шестнайсетична, което просто означава, имате 16 букви в азбуката, за разлика от два или 10. 

Е, как да брои до по-висока от девет в шестнадесетичен? Отиваш 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а, б, в, г, д, е, просто по силата на споразумение. Но това, което е ключът е, че всеки на тях е един символ. Не е 10. Не е 11, сам по себе си, тъй като всеки от вашите цифри, точно както в десетичен и точно като в двоичен, просто трябва е един символ, чрез конвенция. 

Така че след това е азбуката имаме на наше разположение за шестнадесетичен вид. Така че това, което прави JPEG изглежда като, ако бяха да напиша тези първи три не байтове като десетични, но например, като шестнадесетичен? И защо е шестнадесетичен дори всичко, което полезно? 

Е, един бърз поглед на един пример. Така че, ако аз пиша от бита, които представляват тези десетични numbers-- това може да е малко ръждясал Сега от няколко седмици назад, но лявата и право за едно са доста лесно. 255 е най-големият номер, с който може да представлява с осем бита. Тя беше на всички такива. Така че единственото, което е меко казано Интересно е среден. И ако нещо се направи прекъсване на математика, ще заключим, че, наистина, този модел на един и нули представлява 216. Така че нека просто да предвидят за сега, че те са правилни. Но защо е интересно това? 

Е, един байт, разбира се, е осем бита. И се оказва, че ако смятате, на един байт като две парчета от по четири бита, по този начин. Нека само да добавите малко пространство. Така че, преди, след. Току-що добавя малко празно пространство заради тук визуализация на. Как може ние сега представляват в, да речем, шестнадесетичен всеки четириядрен на бита, всеки набор от четири бита? 

Така например, в ляво Сега, ние имаме 1111 в двоичен. Какво е това число в десетична запетая, ако го направите по математика? Вие имате такива мястото, на двойки мястото, Мястото на четири крака, и осмици място. 

АУДИТОРИЯ: 15. DAVID J. Malan: Това е 15. Така че, ако ние направим осем плюс четири плюс две плюс едно, ние получаваме 15. Така че мога да запиша 15 по-долу 1111, но цялата работа тук е в шестнадесетичен вид, не е десетична. Така че, вместо да записвам 15, 05.01, Отивам да напиша, че в шестнадесетичен, които, ако си мислиш, обратно, ако имате нула през F, което е 15 щеше да бъде? АУДИТОРИЯ: F. DAVID J. Malan: Така се оказва, това е F. И вие можете да го измисля, като казва, добре, ако е 10, а след това OK, F е 15. Така че, наистина, можем да пренапише същия набор от числа, като е F. И след това, ако ние направим малко математика, ние ще се заключи, че това е г. Осем е доста лесно, защото ние има един в осмици място. И след това, имаме още няколко F F е. 

Така че това, което хората са склонни да направят по силата на споразумение когато те използват шестнадесетичен е, че те просто пиша това малко по-сбито, се отървете от голяма част от тези бяло пространство. И само за да бъде супер ясно читатели, че това е в шестнадесетичен вид, простата конвенция между хората ви пишат нула X, която няма друго значение от визуален идентификатор, тук идва редица шестнадесетичен. 

И след това, да поставите двете цифри, е е в този случай, тогава г А, след това е F. Така че, дълга история кратко, шестнадесетичен просто тенденция да бъде полезна, защото всеки от своите цифри, нула чрез F, перфектно линии с модел от четири бита. 

Така че, ако имате две шестнадесетични цифри, нула чрез F, отново и отново, , която ви дава перфектно осем бита или един байт. Така че това е защо тя е склонна да е обикновено полезно. Няма по интелектуална съдържание наистина отвъд това, различна от действителната му полезност. 

Сега JPEG файлове не са единствените файлови формати за графика. Може да се припомни, че има файлове, като този в света, най-малко от няколко години назад. 

Така че това е всъщност инсталирана в Windows XP на милиони компютри по целия свят. И това е файл растерна графика, BMP. И един файл растерна графика, както ще видите следващия седмица, просто означава, модел от точки, пиксела, тъй като те се наричат, карта на бита, наистина. 

Така че това, което е интересно, все пак, за този файлов формат, BMP, е че под предния капак, той има повече от само три байта който композира своята заглавна част, така че да се каже, първите няколко хапки. То всъщност изглежда малко сложно на пръв поглед. И вие ще видите това в множеството P. И все нещо специално от това сега не е толкова важно, тъй като само факта че в началото на всеки растерни файл, графичен формат, има цял куп номера. 

Сега Microsoft, на автор на този формат, има тенденция да се обадя на тези, Нещата не цели числа и символи и плувки, но думите и г думи и копнее и байтове. Така че те са просто различни типове данни. Те са с различни имена за едно и също нещо. Но вие ще видите, че в P Set Four. 

Но това е само да се каже, че ако човек двукратно щракване някои .BMP файл на своята или твърдия си диск, и се отваря прозорец до него или нея, че снимката показва, което се е случило, тъй като оперативните система вероятно забелязал не само разширение .BMP файл в името на файла, но също така и факта, че има някакъв конвенция на модела на битовете в самото начало на тази растерна графика файл. 

Но нека сега да се съсредоточи върху такава сложна файл, но вместо на нещо като това. Да предположим, че тук, в GEdit, I Просто трябва наченки на програма, която е доста проста. Имам някои включва до върха. Сега аз имам # включват "structs.h", но Ще се върна на това в един миг. Но това е полезно за сега. Така че това е програма че това ще се приложи като база данни на секретаря. Така че една база данни на студентите, и всеки студент в света има име и къща и вероятно някои други неща, но ние ще го прости. Всеки студент има име и къща. 

Така че, ако аз исках да напиша програма, чиято цел в живота Тъкмо да превъртите от нула до три, ако има трима студенти в Харвардския университет. И аз просто искам да се получи, като се използва GetString, име на всеки студент и къща, и след това просто да отпечатате тези навън. 

Това е нещо като Week One, Седмица Две неща сега, където аз просто искам за линия или нещо подобно. И аз искам да се обадя GetString няколко пъти, а след това да отпечатате е няколко пъти. Е, как бих могъл да направя това, все пак, когато едновременно име и къща са включени за всеки ученик? 

Така че първият ми инстинкт мощ бъде да се направи нещо подобно. Може първо да кажа, добре, дай ми, се каже, масив от низове, наречени имена. И аз не искам hardcode три тук. Какво искам да се сложи там? Така че учениците, защото това е просто постоянна обявен в горната част, просто така че не е нужно да се hardcode три в няколко места. По този начин, не мога да го променя на едно място, и това се отразява промяна навсякъде. И тогава, може да се направи низ помещава студенти. 

И сега, аз може да направи нещо подобно за (INT I = 0; и <СТУДЕНТИ, аз ++. Така че аз съм пишете бързо, но това е вероятно са запознати синтаксис сега. 

И сега, това е по-нова. Ако искам да поставя в I-та име на студента, мисля, че правя това. И след това, а не имена но къщи скобата аз. Аз правя това, GetString, и нека ми се върна и да поправя тази линия. Съгласен? Не съм съгласен? Това не е много лесен за употреба. Не съм казал на потребителя какво да правя. 

Но сега, ако аз също Исках по-късно, нека да речем, отпечатайте тези неща out-- така TODO-късно. Отивам да се направи повече с по- това-- това безспорно IS правилното прилагане на получаване на имена и къщи, три от тях общо на всеки, от потребителя. 

Но това не е много добър дизайн, нали? Какво става, ако един студент не е просто име и къща, но също така и идентификационен номер, и телефонен номер, и имейл адрес, а може би и на началната страница, и може би Twitter дръжка, и произволен брой други подробности свързана със студент или лице, по-общо. Как бихме могли да започнем да добавите функционалност към тази програма? 

Е, аз се чувствам като най-простият начин мощ бъде да се направи нещо подобно, да кажем, INT IDS студенти. Така че мога да сложа всичките си документи за самоличност в там. И тогава, за нещо като телефонни номера, Аз не съм сигурен как да се Заявявам, че просто все още. Така че нека да вървим напред и просто разговор този туитове СТУДЕНТИ, които е малко странно, но-- и куп още полета. 

Аз бях започнал да ефективно копирайте и поставете тук. И това се случва, за да растат доста тромава доста бързо, нали? Не би ли било хубаво, ако имаше в света структура на данни известен не като едно цяло число или низ, но нещо по-високо ниво, абстракция, така че да се каже, известен като студент? C не дойде с вграден функционалност за студенти, но какво ще стане ако аз исках да го дам такъв? 

Е, оказва се, аз отивам да отворите файл, наречен structs.h тук, и можете да направите точно това. И ние ще започнем да правим това сега. И под капака на P постави три, вече сте били прави това сега. Няма такова нещо като грам прякото или един грам овална език за програмиране С. 

Хора от Станфордския изпълнени тези типове данни, с помощта на този подход тук, обявяване на новите си данни видове с помощта на нова ключова дума нарича структура и друга една, наречена typedef. И наистина, въпреки че синтаксис изглежда малко по-различно от нещата сме виждали преди, в принцип, това е супер проста. 

Това просто означава "определи тип." Това ще бъде структура и структура е просто като контейнер за няколко неща. И тази структура ще да има низ наречен име, и низ наречен къща. И нека да се обади, просто за удобство, цялата тази структура от данни студент. 

Така че в момента ти се да точка и запетая, имате сега създали своя собствена данни тип, наречен студент че сега стои редом INT, и плувка, и Чар, и низ, и г прякото, и г овални, и произволен брой на други неща, които хората са измислили. 

Така че това, което е полезно за това сега е, че ако се върна да STRUCT 0 и да завърши тази изпълнение, което съм написал предварително тук, забележете, че всички на неизбежна обърканост, че е на път да започнат да се случват, както аз добавяне телефонни номера и туитове и всички тези други неща, за да определение на студента, сега тя лаконично увит просто като един масив от студенти. 

И всеки един от тези студенти, сега има няколко неща в нея. Така че просто оставя един въпрос. Как можете да получите на името, и къщата, и идентификацията, и каквото друго е вътре на ученика? Супер прост, както и. New синтаксис, но една проста идея. 

Вие просто индекс в масива, както направихме миналата седмица и това. И това, което е ясно ново парче на синтаксис? Just., Което означава "Влез в структура и се нарича областта име, се областта, наречена къща, получите областта наречена студент. " 

Така че в P постави три, ако сте Все още работим върху това, и повечето хора все още се, осъзнават, че колкото започнете да използвате неща, като гр rects и грам овали и други неща, които не изглежда да идват от Week нула, едно или две, осъзнават, че това е, защото Stanford обявен някои нови типове данни. 

И наистина, това е точно това, което ние ще правя, както и, в P Set Four, когато ние започваме да се занимава с неща, като изображения, растерни изображения, и повече. Така че това е просто една закачка и мисловен модел за това, което предстои. Сега, аз отлага малко тази сутрин. Бях вид любопитен да видя какво тапета Microsoft всъщност Прилича днес. И се оказва, че някой през 2006 г. всъщност отиде в почти точно на същото място, за да снимам в реалност какво прилича, че тези дни. Полето сега е малко обрасли. 

Така погледнато сега на изображения, нека върнем Дейвън тук на екрана и Никола, и само да ви напомня че ако искате да се присъедините към нас за обяд този петък, ръководител на обичайната ни URL тук. 

Така че откъде да си тръгнем в понеделник? Ние въведохме този проблем, нали? Това е на пръв поглед правилно изпълнение на суап, при което те взема две цели числа, един нарича, един наречен б, суап тях, точно като Лора го тук на сцената заедно с млякото и водата, с помощта на временно променлива, или празна чаша, така че ние може да постави б в и в б, без да прави каша на нещата. Ние използвахме променлива. Тя се нарича темп. 

Но това, което беше основното проблем с този код, в понеделник? Какъв е проблемът тук? Да. 

АУДИТОРИЯ: Той заема повече място. 

DAVID J. Malan: заема повече пространство, защото аз съм с помощта на променлива, и това е ОК. Това е вярно, но аз съм щях да кажа, че е OK. Това е само 32 бита във Великото схема на нещата, така че не е голяма работа. Други мисли? АУДИТОРИЯ: То само суапове променливите на местно ниво. DAVID J. Malan: Точно така. Той суапове само променливите на местно ниво. Защото всеки път, когато се обадя на function-- когато имах тавите от Annenberg Последният път, имате основната на дъното. Веднага след като ти се обадя функция, наречена суап суап не получите х и у, първоначалните стойности. Какво прави суап получи, сме иск? Публика: екземпляра. DAVID J. Malan: Така че копия от тях. Така той получава една и две, ако сте припомни примера от последния път, но копие на една и две които успешно се разменя. Но за съжаление в края на краищата, тези стойности са си все същите. Така че можем да видим това с нашия нов приятел, надявам GDB, че вие ​​или на TFS и Ca имат били те води към по следния начин. 

Така че без суап отзоваване изглежда като-- оставим отвори това-- изглежда по този начин. Ние инициализира х към едно, база до две. Имаше тълпа от печат е всичко. Но тогава, клавиша за повикване, тук е да сменяте, които е точно от нас код Току-що видях преди малко. Кое е правилно в първото поглед, но функционално, тази програма не работи, защото не постоянно сменяте X и Y. 

Така че нека да видим това, един бърз топло до тук с GDB, а ./noswap. А китка на преобладаващото информация, която Ще се отървем от с Control L за сега. И сега, аз отивам да отидете напред и да го стартирате. И за съжаление, че не беше полезен. Тя се завтече програмата вътре в този програма, наречена GDB, дебъгер, но тя не ме остави да мушкам наоколо. 

Е, как може аз всъщност пауза изпълнение в рамките на тази програма? Така че да се счупи. И аз може да се прекъсне по всяко линия номер, една, 10, 15. Но аз също може да прекъсне символично като казва, почивка главната. И това се случва, за да зададете пауза точка, очевидно по линия 16 в основната. И къде е ред 16? Нека да отидем до кода и отидете до noswap. И наистина, линия 16 е Първата в програмата. 

Така че сега, ако отида напред и тип тече това време, Enter, тя замълча. Така че нека да мушкам наоколо. Печат x-- защо е х нула? И игнорират знака за долар. Това е само за красиви използване на програмата. Защо е х нула в момента? Да. 

АУДИТОРИЯ: Той спря точно преди линия 16, които не са действително по линия 16. DAVID J. Malan: Точно така. GDB, по подразбиране, е на пауза изпълнение точно преди линия 16. Така че това не е изпълнено, което означава х е от някаква неизвестна стойност. И ние имаме късмет, че това е нещо чисто, подобно на нула. Така че сега, ако пиша следващия, сега тя изпълнява 16. Той ме чака да се изпълни 17. Позволете ми да отида напред и печат на х. Това е едно. Позволете ми да отида напред и печат у. Какво трябва да видим сега? 

АУДИТОРИЯ: [недоловим] 

DAVID J. Malan: Малко по-силно. 

АУДИТОРИЯ: [недоловим] DAVID J. Malan: Не съвсем консенсус. Така че, да, ние виждаме някаква стойност боклук. Сега, Y е 134514064 там. Е, това е просто някаква стойност боклук. Моята програма използва RAM за различни цели. Има и други функции. Други хора са писали в моя компютър. Така че тези битове са били използвани за други ценности, и това, което аз виждам е останките на някои преди използване на тази памет. 

Така че не е голяма работа, защото в момента докато пиша следващия и тогава у отпечатате, това е инициализира с стойността, която искам. Така че сега, да вървим напред малко по-бързо. N за следващия. Да го направим отново. Да го направим отново. Но аз не искам да се удари тук, защото ако Искам да видя какво става вътре суап, какво е командата? 

АУДИТОРИЯ: стъпки. 

DAVID J. Malan: стъпки. Така че това ми стъпки в функция, а не над нея. И сега, това е малко загадъчен честно казано, но това е само ми казва, че съм в ред 33 сега. И нека го направим отново. Print темп. Стойност Garbage, отрицателна този път, но това е само още стойност за боклук. Така че нека да направим следващата, печат темп. Това е инициализира с 1, който е стойността на X, известен на. 

Сега, къде са ни на и х идва? Е, забележите в основния, ние нарича тези стойности х и у. Ние след това преминава тях да сменяте, както следва. X дойде първо, запетая у. И тогава, суап може да им се обадя х и у. Но за по-голяма яснота, това е наричайки ги а и б. Но А и Б сега ще бъде копия на X и Y, съответно. 

Така че, ако се върнем към GDB, Темп сега е едно, а сега е един. Но ако го направя следващия и сега правя печат А, вече е преместен. Млякото се излива в първата чаша портокалов сок е, или обратното. 

И ако го направя следващия път, и сега ако разпечатате като проверка здрав разум, а е все още две, но б е един. Честно казано, това е все още там. Не ме интересува какво е темп. Но щом сега пиша, да речем, продължи да се върна, сега съм в края програмата. За съжаление, х е все едно и Y е все още два. 

Така че каква е ползата от GDB там? Той не ми помогне да се определи проблема за себе си, но се надяваме да ми помогне го разберем чрез реализиране че отговорът е да, моята логика е точно, но моя код не е в крайна сметка като постоянно въздействие. Така че това е проблем, който ние сме ще се реши днес. 

Но нека да стигнем до там по пътя на това. String е лъжа. Той също не е тип данни която съществува в C. Това е е синоним на някои време за нещо друго, и може да се установи, че както следва. 

Нека да вървим напред и да се отворят програма, наречена сравни-0. И вместо да въведете този един, ние ще започнем да ходим чрез кода Аз вече написах, но Това е само няколко реда. Така че това е сравни-0. И първото нещо, което правя става все по линия на текст. 

Но забележете какво съм прави за първи път. Какво е различното ясно за ред 21? Всъщност, чакай малко. Това е два копие. Това дори не е правилната програма. Добре, предупреждение спойлер. Добре, така че да не говорим за това. Това е отговорът на един бъдещ въпрос. 

Тук е сравни-0, и аз съм за да получите ред от текста. Програмата е много по-просто. Така че, това е ясно. Това е като Week One, Седмица Две неща в момента. низ S = GetString. Сега, аз го кажа отново тук. низ т = GetString. И след това, последното нещо в тази програма, както подсказва името му, е аз ще се опитам да ги сравни. 

Така че, ако S, първия низ, равнява = т, тогава аз съм щях да кажа изпишете на едно и също нещо. Иначе, аз отивам да се каже, изпишете различни неща. Така че нека да компилирате и стартирате тази програма. Така че направи сравнение нула. Изглежда добре. Няма грешки компилиране. 

Позволете ми давай сега и въведете ./compare-0. Позволете ми да отида напред и да кажа нещо : Дейвън и нещо: Роб. И пиша различни неща. Дотук добре. Програмата изглежда да бъде вярна. 

Но нека да го стартирате отново. Кажи нещо: Гейб. Кажи нещо: Гейб. Добре. Може би аз удари бар пространство или нещо фънки. Да го направим отново. Така Zamyla. Zamyla. Различни неща. И така, какво се случва? 

Така че ние имаме тези две линии на код, GetString се нарича два пъти. И тогава, аз съм просто се опитва да сравни с и т. Но това, което наистина се случва след това? Е, за моя почерк, за да заколи този пример донякъде. И нека действително хвърлят това до тук, както добре. 

Така че ние имаме един ред като низ S = GetString. Така че това е просто първата интересна линия от тази програма. Но това, което е била през цялото това време става под капака? Е, от лявата страна е низ, който е някакъв вид на променлива и тя се нарича S. Така че аз знам, че това е използването на паметта, или RAM, в моя компютър по някакъв начин. Така че аз отивам да абстрактно изготвя, че като квадрат. 32 бита, оказва се, но повече за това в бъдеще. И тогава, какво става тук? 

Е, очевидно GetString получава низ от потребителя. И GetString имам Zamyla или Габе или Дейвън. Така че нека да изберете първия на тези, които е Дейвън. Така ефективно, какво GetString имам мен в онзи първи случай е D-а-V-е-н. И тогава, какво друго е направил тя ми даде тайно? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Да, от / 0 или нулев характер. Така че той на практика ми даде низ. Но ние вече знаем от предишния изглежда, че низ е просто масив на героите, и това е прекратено от този специален страж характер, / 0. 

Но ако това е вярно и това е квадрат, това е ясно много по-голям правоъгълник. И наистина, това е, Аз твърдя, само на 32 бита. И това е ясно на повече от 32 бита, защото това е най-вероятно осем плюс осем плюс осем плюс осем плюс осем, само защото на байта ASCII. Как, по дяволите, отиваме да се поберат Дейвън в тази малка кутийка тук? 

Е, това, което се GetString всъщност прави? Е, тази мрежа тук представлява памет или RAM на моя компютър. Така че нека да кажем, че ако произволно всеки от тях представлява един байт, тогава можем да мислим за всеки байт като като адрес, като 33 Oxford Street, или 34 Oxford Street, или 35 Oxford Street. 

Така че просто като домове имат адреси и сгради имат адреси, така правя индивидуални байта памет има адреси или номера които еднозначно да ги идентифицира. Сега, това е произволно. Но за да го прости, аз отивам да използвате шестнайсетична просто по силата на споразумение, но 0x означава нищо друго, от "това е в шестнадесетичен вид." и аз отивам да се твърди, че "D" се озовава в Byte One в паметта. 

Нямам какво друго се случва в памет, така че Дейвън получи първия място в Byte One. Това, тогава, ще бъде 0x2. Това ще е 0x3. Това ще бъде 0x4. Това ще е 0x5. Това ще бъде 0x6. 

Но след като започнем да мислим за това, което прави компютъра под капака, можете да започнете да заключим как си, преди няколко години, би са приложили C себе си. Какво е GetString вероятно returning-- защото се чувства като тя не е връщане Дейвън, сами по себе си, защото той със сигурност не става за да се поберат в тази малка box-- така че това, което се GetString вероятно връщане? 

АУДИТОРИЯ: [недоловим] 

DAVID J. Malan: Мястото на Дейвън. И това е правил това откакто Week One. Какво GetString е наистина връщане не е низ, сам по себе си. Това е една от малките бели лъжи. Това е връщане на адреса на низ в памет, уникален адрес. Дейвън живее в 33 Oxford Street. Но по-сбито, Gavin живее при 0x1, Адрес Number One. 

Така че това, което получава сложи в тази малка кутия, а след това, за да бъде ясно, е само адреса на низ. Така че през цялото това време, това е била става. Но какво е това загатва сега е, че ако всичко е има няколко вътре в него, който е да ви спре, програмист, от поставянето на каквато и номер в всяка променлива и просто скачайки на това парче на памет? И наистина, ние ще видим това е заплаха следващия път. 

Но за сега, това се чувства недостатъчно. Ако кажа, донеси ми низ, можете да ми дадете Дейвън. Но наистина не ми даде Дейвън. Всичко, което ми даде, е адрес на Дейвън. Как мога да знам със сигурност, а след това където Дейвън започва и ends-- на историята все weird-- където Дейвън започва и завършва, и след това, на следващия низ в паметта започва? 

Е, ако сте да дадете ми в началото на Дейвън, по същество, как да знам , където в края на името му е? Този специален нула характер, които е още по-важно сега ако струни под качулка просто са идентифицирани уникално по своето място в паметта. Така че през цялото това време, това е какво става нататък. 

Така че, когато ние гледаме сега в кода тук, обясни ако би бъг в ред 26. Защо е Zamyla и Zamyla различно? Защо е Габе и Гейб различно? Да, в гърба. 

АУДИТОРИЯ: Те имат различни адреси. 

DAVID J. Malan: Просто защото те имат различни адреси. Защото, когато ти се обадя GetString отново, което аз ще направя бързо тук, ако това е втората линия, низ т, както направих аз в тази програма, се равнява на друг разговор да GetString. Следващият път, когато се обадя GetString, аз отивам да се получи различен парче на памет. 

GetString е позволено да поиска от експлоатация система, за повече и повече памет. Тя няма да се използва един и същи шест байта всеки път. Това ще получите нова парче на памет, който означава тона ще се получи, някаква друга стойност тук. 

Така че, когато аз правя S е равно на = т, не сте сравняване D срещу това и срещу A това и V срещу това. Вие сравнявате тази срещу това, което честно казано е доста useful-- useless-- е доста безполезно, защото, които наистина грижи, където конците са в паметта? 

И наистина, ние не сме. И ние няма да начало особено грижа. Само до степен, че могат да възникнат грешки и заплахи за сигурността могат да възникнат воля ние действително започне да се грижи за това. Така че нека да решите този проблем. Оказа се, че сте го оправя супер просто. 

И нека е всъщност, преди да разкриват, че отново, какво бихте да направите, ако в CS50 клас, и трябваше да се приложат сравнението срещу две струни. Вие очевидно не може просто да използвате и се равнява = тон. Но само логично, как бихте сравнили този низ срещу този низ с помощта на C код? Да. 

АУДИТОРИЯ: Просто направете за линия [недоловим] DAVID J. Malan: Perfect. АУДИТОРИЯ: [недоловим] DAVID J. Malan: Да. Просто използвайте за линия или докато линия или нещо такова. Но просто прилага основната идея, че ако това е парче на памет или масив и това е, обхождане както в същото време. И само за сравнение на буквите. 

И ти трябва да бъде внимателни, защото сте Не искам един пръст да отида покрай другото защото един низ е дълъг от другия. Така че вие ​​ще искате да проверите за тази специална стойност в края, нула. Но тя наистина е в край, като просто. И честно казано, ние не се нуждаем да преосмисли това колело. Ето Version Two. И това, което аз щях да кажа тук е, че вместо да се сравняват и се равнява = т, Аз, вместо да каже, ако низ сравнение на S запетая т равнява = 0. Сега, това, което е низ сравнение? 

Оказва се, че това е функция, която идва с C, чиято цел в живота е да се сравнят две струни. И се разбърква за сравнение, ако четем му мъж страница или документация или CS50 препратка, тя ще просто ви кажа, че раздвижване сравни възвращаемостта или отрицателно номер или положително число или нула, където нула означава, че те са равни. 

Така че просто предположение. Какво може да означава, ако разбърква се връща сравни отрицателна стойност или положителна стойност? АУДИТОРИЯ: По-голямо или по-малко, отколкото. DAVID J. Malan: Да, по-голяма или по-малко от. Така че, ако искате да сортирате цяло куп струни в dictionary-- тъй като ние в крайна сметка ще надолу по road-- перфектна функция, за да използвате потенциално защото тя ще направи това Сравнение на низове за вас, и да кажа ви прави идва преди б, или прави б дойде преди по азбучен ред. Ние можем да направим точно това. 

И забележете, което направих една друга нещо в този пример. Какво друго се е променило по-висока в тази основна функция? Char *. И това е, че друга бяла лъжа. През цялото това време, когато сте писането на низ, ние сме били тайно пренаписване низ като Чар *, така че всъщност трясък те разбира. 

С други думи, в CS50.h и тъй като ние в крайна сметка ще видите, ние направихме синоним нарича низ това е същото нещо като знак *. И за сега, знам единствено, че *, В този контекст, най-малко, означава адрес. 

Адресът на какво? Е, фактът, че казах Чар *, а не * Int или плаваш * означава, че Чар * е адреса на знак. Така че тази малка кутийка тук, известен още като низ, е наистина от типа Чар *, което е просто един луксозен начин на казвайки: в това поле ще отидете на адрес. И какво общо има този адрес се отнасят до? Очевидно, Чар. 

Но бихме могли абсолютно има INT * и други неща. Но за сега, Чар * е наистина най- ясен и един от интерес. Така че този проблем ще да се покачва, въпреки че, отново. 

Да предположим, че отварянето на тази програма. Да видим дали сега можем да се предскаже какво не е наред с този код. Така че в тази програма, копирайте-0, аз съм ще вървим напред и отново се обади GetString и съхранява стойността в с. 

И после, защо правя това, Просто като напомняне от седмица минало? Ние направихме кажа, че GetString понякога връща нула. Какво означава това, ако GetString връща нула? Нещо се е объркало. Това вероятно означава, низ е твърде голям, посочени на компютъра памет. Това се случва, супер, супер, супер рядко, но може да се случи. Искаме да се провери за него, и това е всичко, което правим. 

Защото ние ще видим сега, ако не го направиш започне проверка обичайно за неща, като нищожна, може да се действително започне да отидете до адреси в паметта, че са невалидни. И ти започваш да се започне предизвикване все повече и повече за сегментиране на повреди. Или в Mac или PC, просто причинявайки компютър да виси или програма, за да се замразява, потенциално. 

Така че сега, аз твърдя, в копие-0.c, че аз отивам да копирате тези струни чрез на линия 28. И тогава, аз отивам претенция в дъното И ето, че аз отивам да се промени един от тях. 

Така че забележите това. Обаждам нашия стар приятел strlen. И точно обясни на английски какво тази линия 34 се правиш? Какво прави т конзола 0 представляват в ляво. Да. 

АУДИТОРИЯ: Първо характер на тона? DAVID J. Malan: Първо характер на тон. Това е всичко. Първият символ на тон, искам да възложи на главна версия на първия символ в тон. Така че това е капитализиране първата буква. И тогава, най-последното нещо, което правя в тази програма е, аз твърдя, ето оригинала, S, и тук е копие, т. 

Но въз основа на историята, ние просто разказа за това, което наистина са струни, какво е линия 28 наистина правите, и онова, което е получената бъг ще да бъде на екрана? 

Така че, на първо място, на първия въпрос, 28. Какво е низ т = S наистина правят? Ако имаме в лявата страна страна тук низ т = S; това ми дава една кутия тук и една кутия тук. И предполагам, че този адрес е 0x, да речем, 50 този път, произволно. Какво прави низ т = S направи под капака? 

АУДИТОРИЯ: [недоловим] 

DAVID J. Malan: Тя съхранява паметта адреса там, така 0x50 отива там. Така че, ако сега, отивам на първа характер в тона и главни букви, аз какво прави, за да е ефективно? Аз съм наистина правиш едно и също нещо, нали? Защото ако Адрес 0x50-- и просто, аз не разполагате с много място на дъската тук, но се предполага, че това е 0x50 тук, някъде в памет на моя компютър. 

И аз, например, Гейб с малки букви тук, ето така. И казах тона скоба 0 получава капитализирана. Е, т скоба 0 е първата буква в тон. Така че малко грама ще стане голям G. Но проблемът е, какво прави S посочват също? 

АУДИТОРИЯ: Същото. 

DAVID J. Malan: Едни и същи неща. Така че просто обяснение може би, дори ако синтаксисът е малко странно. Така че нека да направим това. Направете копие-0 и след това ./copy-0. Кажи нещо: Гейб. И за съжаление, както на тях вече са капитализирани, но че в основата причина, че ние сме просто сега се занимава с адреси. 

Е, как да започнем да address-- не игра на думи intended-- как можем да започнем да се справи този конкретен проблем? Е, в copy1.c, нещата вървят да се получи малко по-сложно. Но аз ще претендира за концептуално просто решение. 

Толкова е трудно да се получи на пръв поглед. Няма да бъде лесно за първи път, когато го напишете, може би, но ако проблемът е, че просто да правиш т = а само копия на адреса, какво, отново, ако мога да се заяждам с теб, ще бъде решение за фактически копирате низ? 

АУДИТОРИЯ: Вероятно ще използвате една линия отново. 

DAVID J. Malan: Да. Така че ние ще се нуждаем от цикъл отново. И тъй, ако искаме да копирате низ и в друг низ, ние вероятно ще искате да го направите знак по знак. Но проблемът е, ако това е първоначално S, Сега ние трябва да започнем изрично разпределяне на памет за тон. 

С други думи, нека да преначертае това за последен път. Ако това е низ S = GetString. И нека да поставим този тук, както добре. Това е GetString. И тогава, на снимката за нещо така ще бъде както преди, г-а-Ь-електронна / 0. Това изглежда малко нещо като това. А и поради това, ние наричаме този 0x50, и че ще бъде 51, 52. 

Така че това е 0x50. И след това, което правя низ тон. В памет, това е просто ще дай ми малко квадрат като този. Така че това, което е ключова стъпка в момента? Ако искате да копирате, и в тона, което празно имаме нужда да попълните тук? Или това, което ни е нужно, за да направи най-високо ниво? Да? Някой? Да. 

АУДИТОРИЯ: Ние трябва да [недоловим]. DAVID J. Malan: Да, ние Необходимо е да попълните това поле празно. Аз не може да копира и след това капитализира име Гейб докато аз питам операционната система за друг парче на памет това е най-малко толкова голям, колкото оригинала. Така, че ни оставя с един въпрос. 

Как мога да задам на операционната система не само за един прост малко pointer-- тъй като това се нарича, на адрес, а не pointer-- за проста малка кутия като това се нарича низ? Как мога да задам на оперативните система за голяма част от паметта? До този момент, аз съм само намерила, че обратно непряко чрез обаждане GetString. И така, как се GetString дори получаване паметта си? 

Е, оказва се, че има тази друга функция тук че сега ще започнете да използвате. Сега, това изглежда много по-загадъчен отколкото-- и аз съм единственият, който може да види it-- тази линия изглежда много по-загадъчен След това трябва на пръв поглед. Но нека си го дразни един от друг. 

На лявата ръка, имам Чар * т. Така че, на английски език, нека да започнем да формулираме правилни изречения в технически жаргон. Така че това е разпределяне на променлива от тип Чар * нарича тон. Сега, какво значи това наистина означава? 

Е, това означава, че това, което съм аз ще да се постави в тази променлива, наречена т? Адрес на Чар. Така че това е просто по-простите, по-разумен начин за описване на лявата ръка. Така че, който създава тази кутия тук само. Така че дясната ръка, Предполага се, че става да се разпредели, че по-голяма парче на паметта как? Така че нека да дразни този апарт. 

Това е преобладаващото на пръв поглед, но това, което става тук вътре? Първо, налице е изчистване, които очевидно е нашият нов приятел, "Памет разпредели." Така че това е аргументът да се прехвърлят в нея, така че е доста голям аргумент. Така че нека да дразни този апарт. 

strlen на и, разбира се, представлява по-- АУДИТОРИЯ: Броят на знака. DAVID J. Malan: Само брой символи в с. Така дължината на S, първоначалното низ. Така G-а-Ь-д. Така че това е може би четири в този случай. Защо правя едно след призовава strlen на S? АУДИТОРИЯ: [недоловим] DAVID J. Malan: За тази специален нула характер. Ако ме питате каква е дължината на Име на Гейб, аз отивам да се каже, четири. Под предния капак, все пак, аз трябва че петият байт за нищожна характер. Така че това е защо го правя на 1. 

Сега само в случай, че използвате този програма на компютър, различен от, да речем, на CS50 уреда, когато размерът на знак може да се различава от моя собствен computer-- Оказва се, че мога да се обадя тази оператора sizeof, просто попитайте на компютъра, какъв е размерът на Чар на този компютър? 

И като се умножи пет в тази например от размера на знак, който на повечето компютри ще да бъде само един, изчистване ще се разпредели за мен този голям парче на паметта тук отдясно. И това ще return-- е function-- така че е ще се върне при мене какво? АУДИТОРИЯ: Адресът? DAVID J. Malan: Адресът на какво? АУДИТОРИЯ: От паметта за да ги предостави? DAVID J. Malan: От памет да ги предостави. Така че аз нямам представа, честно казано, , когато това се случва, за да се свърши. Отивам да предложи че ще се окажете в 0x88. Напълно произволно, но някъде, различна от 0x50, защото на операционната система, което Windows и Mac OS направи за мен, е уверете се, че това е даване ми различни парчета от RAM. 

Така че това е стойността, когато това парче на паметта може да свърши. Така че това е, което се озовава в тук, 0x88. Така че сега е ясно, мога да разбера че това не е същото като това, защото те са сочеше различни части от паметта. Така че, ако аз сега всъщност искате да копирате този в, нека да направим предложен вашето решение. 

Нека просто да отидете, да създадете за контур, и да направим тон скоба аз получава и скоба аз. Защото сега мога да използвам този масив-като бройна система, защото въпреки че много изчистване генерично ми заделя памет, памет е само съседни байта. Байт, байт, байт, да се върна обратно към гърба. 

Аз мога със сигурност като програмист лечение на него като масив, който означава, че може да използва тази накрая запознати нотация на само няколко квадратни скоби. 

Така че нека пауза там, защото това е много наведнъж, дори че основната идея да набележи е, че низ, през цялото това време, не е нов тип данни сами по себе си. Това е просто така наречената показалка, адрес на герой, което просто означава, че това е номер че от човешки конвенция ние сме склонни да пиша като 0x нещо. 

Но това е просто номер, като 33 Oxford Street, което се случва, да бъде Адрес CS сградата. Всички въпроси, свързани с тези данни? Да? 

АУДИТОРИЯ: Защо ние проверяваме за тон, равна на нула? 

DAVID J. Malan: Защо правим проверите за тон, равна на нула? Ако четем documentation-- голяма въпрос- за изчистване, това ще да кажа в дребен шрифт, понякога изчистване може да върне нула, точно като GetString. И наистина, GetString връща нула Ако в ред, изчистване връща нула, защото GetString използва изчистване. 

И това може да се случи, ако операционната система, Mac OS, Windows, каквото и да е просто Недостиг на памет за вас. Така че това е, което се е случило там. 

И нека ти разкрия още нещо , че може просто да ви оставят без дъх или напълно да бъде твърде далеч над линията. Но нека да дръпнете нагоре Същото важи и за линия за копиране, които преди малко, изземване беше това. т скоба аз получава и скоба аз. 

Ница и лесен за употреба. Усеща Седмица Две отново. Но тази версия всъщност може да бъде пренаписан, тъй като това, което изглежда загадъчно. Това е техника, наречена показалка аритметика, адресна аритметика. Но защо става това? 

Сега дразнещо, на автори на C решили да използват символа * за различни цели. Виждали сме го използва веднъж вече, Чар *, което означава "дай ми една променлива че това ще се съдържа адреса на знак. " Така Чар * в този контекст означава "дай ми една променлива." 

За съжаление, ако използвате * без дума пред него, като Чар, тя сега се нарича оператор и сочен. И ние ще видим повече от това не след дълго. Но това просто означава "отиде там." Това е като да кажеш, ако някой ми подаде на парче хартия "33 Oxford Street," ако го направя "* 33 Oxford Street," това означава, че "Отиде надолу по пътя до сградата CS." 

Така * просто означава, отидете там, ако Няма нито дума пред него. И така, какво е тон, за да бъде ясно? т е адресът на парчето памет, която е върната към мен. S е адресът на това, което, за да бъде ясно, в примера, които сме обсъждали, на малки букви Габе? S е адресът на-- АУДИТОРИЯ: The низ. DAVID J. Malan: От първоначалното име на Гейб. Така че това е адресът на това парче на паметта. Така че, ако кажа, т + Аз--, забележка, е просто стар наш приятел. Това е просто една променлива индекс че е итерации от нула нагоре на дължината на низ S. Така че това ще бъде нула, а след една, след две, след това три, след това четири. Така че нека да се съберат тези нови Скреч-като пъзел парчета, ако щете, въпреки че отново, синтаксиса е далеч по-тайнствена от Scratch. Така т е адрес + аз ще да ми даде номер, тъй като всички те са номера, които ние сме били рисуване като шестнадесетичен. Но те са само числа. 

Така че, ако адресът на тон казахме е 0x88, 0x88, което е плюс нула. Дори ако не сте доволни с още шестнадесетичен, да предположите. 

АУДИТОРИЯ: Оригиналът. 

DAVID J. Malan: Все още 0x88. Е, какво значи * 0x88 кажеш? Това означава, "там", което означава ефективно, "Дай си пръста тук." И сега от дясната страна на този израз, * и след това в parens, S + I означава и, което е най- справяне тук на малкото грама. S + 0 е, разбира се, S, каквото и да е е. 

Така че сега, това е * а, които точно като * 33 Oxford Street означава, отидете на адрес S. Така че тук е този пръст, дясната ръка. Така че това, което съм аз ще копирате в какво? Работата на правото, което е Габе, малко грама тук, в тук. 

И така че ефектът на този първата итерация на цикъла, както ти предложи, макар и да изглежда луд по-сложно, отколкото нищо сме виждали преди, просто се казва, отидете тук и да копирате този герой тук. Тя ти дава карта на двете места. 

И ние ще видим много повече от това. Но за сега, надеждата е само да представим някои от тези основни идеи. И наистина, нека да разгледаме един последен програма тук, и тогава обеща claymation, която ще направи всичко наред. Добре. Така че нека да се отвори up-- там отиваме. Така че нека мен-- ще се върнем тази картина преди дълго. Позволете ми да се отвори този последен пример тук. 

Така че тук е супер, супер програма, която изпълнява нищо в живота, който прави следното. Първоначално тя декларира две променливи, х и Y, които не са номера това време, сам по себе си. Те не са цели числа, само по себе си. Те са очевидно INT *. Така че просто някой, какво означава това ако вашият тип данни, вашият променлива, е от тип INT * звезда? Това е адресът на вътр. 

Така че, нямам представа къде е все още. Това просто означава "казано, в крайна сметка, адреса на INT тук. " 0x50, 0x88, където и да е в памет, адрес става там. И това е, което у е ще бъде, както и. 

Ако аз сега кажа х = изчистване (sizeof (INT)), това е един луксозен начин на казвайки: хей операционна система, чрез изчистване, дайте ми достатъчно памет за размера на междинно съединение, което е вероятно ще бъде 32 бита или четири байта. 

Така че това, което се връща изчистване? Изчистване връща адрес. Така че това, което ще се съхранява в х? Адресът на парчето Памет, четири байта, че изчистване що разбрах за мен с въпроса операционната система. 

Сега Междувременно, ред четири тук, на * х = 42. Само за да бъде ясно, какво става там долу? На лявата ръка, * х. това е като * 33 Oxford Street. Така * х означава какво? 

АУДИТОРИЯ: Отиди на. 

DAVID J. Malan: Отиди на този адрес. Където това парче на памет е, отидете в него. И сложи това там, очевидно? АУДИТОРИЯ: 42. DAVID J. Malan: 42. Добре, * г., същата идея. Отидете на адрес в у. Поставете номер 13 там, но това, което е у в момента? АУДИТОРИЯ: Няма и помен за у. DAVID J. Malan: Има не е памет за у. Така че това, което прави г-вероятно съдържа, тъй като ние сме били казвам? 

АУДИТОРИЯ: Garbage. 

DAVID J. Malan: Някои стойност боклук. Сега, стойност отпадъци е все още редица. Все пак той може да бъде погрешно за един адрес. Това е като че ли някой надраска нещо надолу, и аз го тълкува погрешно в смисъл, някаква сграда надолу по улицата. А ако просто се опитват да отидат в някаква сграда не притежавате, или някаква буца на паметта все още не сте било дадено, лоши неща може да се случат. Компютърът ви може да се срине, или някакъв друг неопределен поведение може да се случи. 

Така че интрото, след това, да Binky е това. Все още си спомням, 20 някои странни години по-късно, където бях, когато най-накрая разбира указатели. 

Което е да се каже, ако сте оставя тук след три минути и мисля, че не го правят разбирам указатели, да разбере, Си спомних за 20 година за някои луди причина кога и защо накрая потънал в, седнал с моето учение колега, Nishat Мехта в обратно на Елиът Dining Hall. Сега, аз съм си спомни това, защото това е една от темите, I, в специално, се бореше с. И тогава, най-накрая се натисне, като смея да кажа много теми в крайна сметка ще. И сега, за да се направи, че се чувстват всички по-щастливи и още по-убедителен, нека хвърлим един последен поглед в нашата последните три минути тук в Бинки, от нашия приятел, Ник Parlante от Станфорд. 

[VIDEO PLAYBACK] 

Хей, Бинки. Събуди се! Това е време, за показалка забавно. 

Какво е това? Научете повече за указатели? О, лакомство! 

Ами, да започнем, аз предполагам, че сме Ще трябват няколко насоки. 

-OK. Този код се отпускат две насоки, който може да посочи числа. -OK. Е, виждам, двете стрелки, но те не изглежда да сочи към нищо. 

-Това Е прав. Първоначално, показалки не сочи към нищо. Нещата, които те сочат, се наричат pointees и установяването им е отделен етап. 

О, добре, добре. Знаех това. На pointees са отделни. Er, така че как да се разпредели pointee? 

-OK. Е, този код разпределя нов число pointee, и тази част излага х да сочат към него. 

Хей, това изглежда по-добре. Така че да го направим нещо. 

-OK. Аз ще сочен показалеца Х към съхраните номера 42 в своята pointee. За този трик, ще ми трябва Magic Wand на Dereferencing. 

Твоята Magic Wand на Dereferencing? Че-- това е страхотно. 

-Това Е какво кодът прилича. Аз просто ще създаде номера и [РОР] 

Хей, виж. Там тя отива. 

Значи правиш сочен за х следва стрелката, за да получите достъп до своята pointee. В този случай, склад 42 в там. Ей опитайте да го използвате, за да съхраните номера 13 чрез друга показалеца, Y. 

-OK. Аз просто ще отида тук, за да Y, и да получите номер 13 набор нагоре. И тогава, да вземе пръчката на Dereferencing и просто [BUZZ] 

О! 

О, хей! Това не е работа. Кажете, Бинки, аз не мисля, че dereferencing Y е добра идея, защото вие знаете, създаване на pointee е отделен етап. И аз не мисля, че някога го е направил. 

Добър въпрос. Да. Ние разпределени на показалеца Y, но ние Никога не го настроите да се насочи към pointee. 

-Много Наблюдателен. Хей, ти изглеждаш добре там, Бинки. Можеш ли да го оправя, така че у точки на същото pointee като X? 

Разбира. Аз ще използвам моя Magic Wand на Pointer задача. 

-Има, Че ще бъде проблем, както преди? Не. Това не докосвайте pointees. Тя просто се променя един указател към сочат към едно и също нещо като друг. 

О, аз виждам. Сега у точки към едно и също място като х. Така че чакаме. Сега, Y е фиксиран. Той има pointee. Така че можете да опитате Жезъла на Dereferencing отново да изпрати 13 свърши. 

-Uh, OK. Тук тя отива. [POP] 

Хей, виж това. Сега dereferencing произведения на у. И тъй като указателите споделят че един pointee, двамата видите 13. Да. Споделяне, независимо. Така че отиваме да си разменят местата в момента? 

О, виж. Ние сме извън времето. 

-Но-- 

-Просто Не забравяйте трите правила на показалеца. Number One, основната структура е, че имате една показалка, и посочва към един pointee. Но показалеца и pointee са отделни, и общата грешка е да се създаде една показалка, но да се забрави да му се даде pointee. 

Номер Две, показалеца dereferencing започва на показалеца и следва неговата стрелка над за достъп до своя pointee. Както всички знаем, това работи само ако има а pointee, какъв вид се върне към Правило номер едно. 

Номер три, показалеца задача се взема една показалка и да го променя да сочи към същото pointee като друг показалка. Така след назначението двете стрелки ще сочи към същия pointee. Понякога това се нарича споделяне. И това е всичко там е до него, наистина. Чао-чао сега. [END възпроизвеждане на видео] DAVID J. Malan: Това е за CS50. Ние ще се видим следващата седмица.