1 00:00:00,000 --> 00:00:01,110 >> [MUSIC JOC] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 David J. MALAN: Bine. 4 00:00:11,650 --> 00:00:15,610 Acest lucru este CS50, iar această este sfârșitul de patru saptamani. 5 00:00:15,610 --> 00:00:19,420 Iar unul dintre subiectele de astăzi este că de criminalistica digitale, 6 00:00:19,420 --> 00:00:20,989 arta de a recupera informații. 7 00:00:20,989 --> 00:00:22,780 Și într-adevăr, chiar dacă tu ești în mijlocul 8 00:00:22,780 --> 00:00:25,070 chiar acum de Pace de la Three și Breakout, săptămâna viitoare, 9 00:00:25,070 --> 00:00:27,880 accentul se va pune pe tocmai acest domeniu. 10 00:00:27,880 --> 00:00:30,686 >> Deci, una din cele mai tari locuri de muncă am vreodată a avut a fost din nou în școală absolvent, 11 00:00:30,686 --> 00:00:33,560 atunci când am fost de lucru pentru locale Middlesex County District Attorney lui 12 00:00:33,560 --> 00:00:34,950 birou, fac criminalistica de lucru. 13 00:00:34,950 --> 00:00:37,450 Deci, în esență, Massachusetts Poliția de stat, pe ocazie, 14 00:00:37,450 --> 00:00:40,100 atunci când se lucrează la cazuri ar aduce în lucruri cum ar fi hard disk-uri 15 00:00:40,100 --> 00:00:42,185 și dischete și carduri de memorie și altele asemenea. 16 00:00:42,185 --> 00:00:44,060 Și ei le-ar preda la mine și mentorul meu, 17 00:00:44,060 --> 00:00:48,070 și scopul nostru a fost de a găsi dovezi, dacă nu a fost cazul, pe aceste medii. 18 00:00:48,070 --> 00:00:50,700 Sclipiri Acum, este posibil să fi văzut din această lume de criminalistica 19 00:00:50,700 --> 00:00:53,000 în mass-media, TV și filme. 20 00:00:53,000 --> 00:00:55,730 Dar treaba am avut, și Îndrăznesc să spun că lumea, 21 00:00:55,730 --> 00:00:57,550 Nu este destul ca te-ar vedea. 22 00:00:57,550 --> 00:01:00,794 Să aruncăm o privire la ceea ce probabil ati vazut. 23 00:01:00,794 --> 00:01:01,460 [VIDEO PLAYBACK] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Acum, sa trecem o privire bine la tine. 26 00:01:05,380 --> 00:01:06,850 >> [MUSIC JOC] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> Stai așa. 29 00:01:12,932 --> 00:01:13,657 Fugi înapoi. 30 00:01:13,657 --> 00:01:14,733 >> Așteaptă un minut. 31 00:01:14,733 --> 00:01:15,233 Du-te drept. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 Acolo. 34 00:01:16,870 --> 00:01:17,369 Freeze asta. 35 00:01:17,369 --> 00:01:17,930 Full-ecran. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Freeze asta. 38 00:01:18,875 --> 00:01:20,160 -Tighten Pe care, da? 39 00:01:20,160 --> 00:01:22,126 >> -Vector În pe care tip de roata din spate. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom În chiar aici, pe acest loc. 41 00:01:24,435 --> 00:01:28,580 >> -Cu Echipamentul potrivit, Imaginea poate fi mărită și ascuțit. 42 00:01:28,580 --> 00:01:29,330 >> Ce-i asta? 43 00:01:29,330 --> 00:01:30,780 >> -E Un program de îmbunătățire. 44 00:01:30,780 --> 00:01:32,170 >> Pot tu clar că la orice? 45 00:01:32,170 --> 00:01:33,070 >> -Nu Stiu. 46 00:01:33,070 --> 00:01:34,150 Să spori. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Secțiunea A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Am îmbunătățit detaliu, si-- 50 00:01:38,562 --> 00:01:40,020 -Cred Nu e de ajuns pentru a spori. 51 00:01:40,020 --> 00:01:40,976 Eliberați-l la ecranul meu. 52 00:01:40,976 --> 00:01:42,559 >> -Am Sporită reflectarea în ochi. 53 00:01:42,559 --> 00:01:44,322 -Sa Rula acest lucru printr- accesoriu video. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Puteți îmbunătăți acest lucru? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Pe. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Am Fost de lucru pe această reflecție. 58 00:01:49,458 --> 00:01:50,402 >> Reflecție cuiva -Este. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -E O reflectare a feței bărbatului. 61 00:01:52,870 --> 00:01:53,694 >> Reflecție -Contravaloarea! 62 00:01:53,694 --> 00:01:54,610 -E O reflecție. 63 00:01:54,610 --> 00:01:55,880 -Zoom În pe oglinda. 64 00:01:55,880 --> 00:01:57,860 Puteți vedea o reflecție. 65 00:01:57,860 --> 00:01:59,630 >> -Poti Îmbunătăți imaginea de aici? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Pot Ai spori? 68 00:02:01,210 --> 00:02:02,190 -Pot Ai spori? 69 00:02:02,190 --> 00:02:03,066 -Putem Spori acest lucru? 70 00:02:03,066 --> 00:02:03,898 -Pot Ai spori? 71 00:02:03,898 --> 00:02:04,740 -Stai Pe un al doilea. 72 00:02:04,740 --> 00:02:05,281 Voi spori. 73 00:02:05,281 --> 00:02:06,470 -Zoom În pe ușă. 74 00:02:06,470 --> 00:02:06,970 Vremurile 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 Mișcă în. 77 00:02:08,509 --> 00:02:09,340 -Mai. 78 00:02:09,340 --> 00:02:10,094 Stai, nu mai. 79 00:02:10,094 --> 00:02:10,750 -Nu. 80 00:02:10,750 --> 00:02:11,250 -Pause Ea. 81 00:02:11,250 --> 00:02:13,542 Rotiți cilindrul ne 75 de grade în jurul verticală, vă rog. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -Nu. 84 00:02:16,127 --> 00:02:19,330 Du-te înapoi la partea despre ușa din nou. 85 00:02:19,330 --> 00:02:21,420 >> -Ai Un potențiator de imagine care poate bitmap? 86 00:02:21,420 --> 00:02:24,420 >> Poate putem folosi Pradeep Singh Metoda de a vedea în ferestre. 87 00:02:24,420 --> 00:02:25,902 >> -Contravaloarea Software-ul este de ultimă generație. 88 00:02:25,902 --> 00:02:26,866 >> -Contravaloarea Valoare proprie este oprit. 89 00:02:26,866 --> 00:02:29,758 >> -Cu Dreapta combinație de algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Iluminare luate -E algoritmi la nivelul următor, 91 00:02:32,168 --> 00:02:34,110 si eu le pot folosi pentru a spori această fotografie. 92 00:02:34,110 --> 00:02:36,840 >> -Lock Pe mări și axa Z. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Consolidarea. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze Și spori. 97 00:02:40,070 --> 00:02:43,420 [END VIDEO PLAYBACK] 98 00:02:43,420 --> 00:02:45,830 David J. MALAN: Deci, acestea sunt toate cuvintele, dar ele nu au fost 99 00:02:45,830 --> 00:02:47,870 utilizate în propoziții corect. 100 00:02:47,870 --> 00:02:52,370 Și într-adevăr, în viitor, în orice moment, vă rog, auzi pe cineva spune cuvântul, 101 00:02:52,370 --> 00:02:54,250 "Spori", chicotit doar un pic. 102 00:02:54,250 --> 00:02:57,190 Pentru că atunci când încercați pentru a spori, de exemplu, aceasta este ceea ce se întâmplă. 103 00:02:57,190 --> 00:02:58,580 >> Deci, aici este o fotografie superba. 104 00:02:58,580 --> 00:02:59,720 Acest lucru este propriu Daven CS50 lui. 105 00:02:59,720 --> 00:03:03,740 Și să presupunem că ne-am dorit să concentreze asupra sclipire în ochi, 106 00:03:03,740 --> 00:03:05,870 sau reflectarea băiat rău că a fost în mod clar 107 00:03:05,870 --> 00:03:07,820 capturat de camera de securitate. 108 00:03:07,820 --> 00:03:10,330 Aceasta este ceea ce se întâmplă atunci când te măriți o imagine care 109 00:03:10,330 --> 00:03:14,060 are numai un număr finit de biți asociat. 110 00:03:14,060 --> 00:03:15,420 >> Asta este ceea ce v-ar lua. 111 00:03:15,420 --> 00:03:19,190 Și, într-adevăr, în ochi Daven lui este însă patru, poate șase pixeli 112 00:03:19,190 --> 00:03:22,110 care compun exact ceea ce a fost strălucitor acolo. 113 00:03:22,110 --> 00:03:25,890 Deci, problema Set patru vor avea în cele din urmă să exploreze această lume, în special 114 00:03:25,890 --> 00:03:28,090 prin natura ceva noi numim fișier I / O, în cazul în care 115 00:03:28,090 --> 00:03:31,000 I / O este doar un mod fantezist de spune de intrare și ieșire. 116 00:03:31,000 --> 00:03:34,280 >> Deci până acum, toate interacțiunile am avut-o cu un calculator 117 00:03:34,280 --> 00:03:36,770 au fost în mare parte cu dumneavoastră tastatură și ecran, 118 00:03:36,770 --> 00:03:40,770 dar nu atât de mult cu hard disk, sau salvarea de fișiere dincolo de cele pe care le 119 00:03:40,770 --> 00:03:41,620 te scrie. 120 00:03:41,620 --> 00:03:44,570 Programele au până acum Nu a fost crearea și salvarea, 121 00:03:44,570 --> 00:03:46,270 și actualizarea lor fișiere. 122 00:03:46,270 --> 00:03:47,150 >> Ei bine, ceea ce este un fișier? 123 00:03:47,150 --> 00:03:48,105 Ei bine, ceva de genul un JPEG. 124 00:03:48,105 --> 00:03:50,520 Aceasta este o imagine pe care s-ar putea au sau încărca pe Facebook, 125 00:03:50,520 --> 00:03:51,690 sau vedea oriunde pe web. 126 00:03:51,690 --> 00:03:54,460 Într-adevăr, fotografia ne-am a văzut de Daven a fost un JPEG. 127 00:03:54,460 --> 00:03:57,570 Și ceea ce este interesant despre fișiere, cum ar fi JPEG 128 00:03:57,570 --> 00:04:02,170 este faptul că acestea pot fi identificate, în mod tipic, de anumite modele de biți. 129 00:04:02,170 --> 00:04:05,200 >> Cu alte cuvinte, ceea ce se face că distinge un JPEG de la un GIF 130 00:04:05,200 --> 00:04:08,109 de la un ping de la un cuvânt document de la un fișier Excel? 131 00:04:08,109 --> 00:04:09,900 Ei bine, e doar diferit modele de biți. 132 00:04:09,900 --> 00:04:12,820 Și aceste modele diferite sunt de obicei, la începutul aceste fișiere. 133 00:04:12,820 --> 00:04:18,200 >> Așa că, atunci când computerul se deschide un Word doc, sau atunci când un calculator se deschide un JPEG, 134 00:04:18,200 --> 00:04:20,940 se pare de obicei la prima serie de biți în dosar. 135 00:04:20,940 --> 00:04:24,059 Și dacă se recunoaște un model, se spune, oh, aceasta este o imagine. 136 00:04:24,059 --> 00:04:25,850 Lasă-mă să-l afișeze la utilizatorul ca un grafic. 137 00:04:25,850 --> 00:04:27,870 Sau, oh, acest lucru arata ca un doc Word. 138 00:04:27,870 --> 00:04:30,480 Lasă-mă să-l arate la utilizatorul ca un eseu. 139 00:04:30,480 --> 00:04:33,020 >> Deci, de exemplu, JPEG, se pare, sunt 140 00:04:33,020 --> 00:04:35,460 destul de sofisticat sub capota. 141 00:04:35,460 --> 00:04:40,140 Dar primele trei octeti din mai toate JPEG începe cu aceste trei numere. 142 00:04:40,140 --> 00:04:44,680 Deci octet zero, unu, doi și sunt, în cele mai multe fiecare JPEG, 255, atunci numărul 143 00:04:44,680 --> 00:04:46,675 216, atunci numărul 255. 144 00:04:46,675 --> 00:04:48,990 >> Și ceea ce vei putea pentru a începe să faci săptămâna viitoare 145 00:04:48,990 --> 00:04:52,920 este, de fapt bagi sub capota de fisiere cum ar fi JPEG 146 00:04:52,920 --> 00:04:57,210 și ca fișiere bitmap, și văzând ceea ce a fost mereu acolo pentru cât mai mult 147 00:04:57,210 --> 00:04:58,650 ca ai fost cu ajutorul unui calculator. 148 00:04:58,650 --> 00:05:01,860 >> Dar ceea ce este acolo nu este de obicei scris ca numere zecimale, cum ar fi acest lucru. 149 00:05:01,860 --> 00:05:04,620 Oamenii de stiinta de calculator nu au tendința de a vorbi în zecimal. 150 00:05:04,620 --> 00:05:06,139 Ei nu vorbesc cu adevărat în binar. 151 00:05:06,139 --> 00:05:07,930 De obicei, atunci când ne-o dorim pentru a exprima numere, 152 00:05:07,930 --> 00:05:10,710 vom folosi de fapt hexazecimal, care s-ar putea aminti 153 00:05:10,710 --> 00:05:13,027 de, să zicem, problema Set Unul, care a contestat 154 00:05:13,027 --> 00:05:14,610 să te gândești la un sistem diferit. 155 00:05:14,610 --> 00:05:17,170 >> Noi, desigur, sunt familiarizați cu zecimale, zero, prin noua. 156 00:05:17,170 --> 00:05:18,215 Am vorbit despre binar. 157 00:05:18,215 --> 00:05:20,710 Și noi nu prea am de a folosi atât de mult aici 158 00:05:20,710 --> 00:05:22,470 pe afară, pentru că computerele vor folosi asta. 159 00:05:22,470 --> 00:05:24,900 Dar programatori va foarte de multe ori, dar nu întotdeauna, 160 00:05:24,900 --> 00:05:29,360 utilizați hexazecimal, ceea ce înseamnă doar ai 16 litere din alfabetul, 161 00:05:29,360 --> 00:05:31,330 spre deosebire de două sau 10. 162 00:05:31,330 --> 00:05:34,530 >> Deci, cum a face tu numeri la mare decât nouă în hexazecimal? 163 00:05:34,530 --> 00:05:41,120 Mergi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, doar prin convenție. 164 00:05:41,120 --> 00:05:43,540 Dar ceea ce este esențial este că fiecare dintre acestea este un singur simbol. 165 00:05:43,540 --> 00:05:44,340 Nu există nici o 10. 166 00:05:44,340 --> 00:05:48,400 Nu există nici o 11, în sine, pentru că fiecare de cifre dvs., la fel ca în zecimal 167 00:05:48,400 --> 00:05:51,940 și la fel ca în binar, ar trebui doar fie un singur caracter, prin convenție. 168 00:05:51,940 --> 00:05:55,280 >> Așa că atunci este alfabetul avem la dispoziția noastră pentru hexazecimal. 169 00:05:55,280 --> 00:05:58,600 Deci, ce arata o JPEG ca daca au fost de a scrie cele primele trei 170 00:05:58,600 --> 00:06:01,980 Nu bytes ca zecimal, dar, de exemplu, așa cum hexazecimal? 171 00:06:01,980 --> 00:06:03,640 Și de ce este hex chiar tot ce util? 172 00:06:03,640 --> 00:06:05,290 >> Ei bine, o privire rapidă la un exemplu. 173 00:06:05,290 --> 00:06:09,030 Deci, dacă am scrie biți care reprezintă aceste numere, zecimal 174 00:06:09,030 --> 00:06:12,450 acest lucru ar putea fi un pic ruginit acum de la câteva săptămâni înapoi, 175 00:06:12,450 --> 00:06:14,820 dar cea din stânga și un drept sunt destul de ușor. 176 00:06:14,820 --> 00:06:17,990 255 a fost cel mai mare număr WE ar putea reprezenta cu opt biți. 177 00:06:17,990 --> 00:06:18,820 A fost toate cele. 178 00:06:18,820 --> 00:06:21,320 Deci, singurul care-i ușor interesant este cel din mijloc. 179 00:06:21,320 --> 00:06:24,700 Și dacă un fel de a face out matematica, va deduce că, într-adevăr, 180 00:06:24,700 --> 00:06:27,949 ca model de una și zero reprezintă 216. 181 00:06:27,949 --> 00:06:30,240 Așa că hai să prevadă pentru acum că acestea sunt corecte. 182 00:06:30,240 --> 00:06:31,730 Dar de ce este acest interesant? 183 00:06:31,730 --> 00:06:33,970 >> Ei bine, un octet, desigur, este de opt biti. 184 00:06:33,970 --> 00:06:38,980 Și se pare că, dacă credeți de un octet ca două bucăți de patru biți, 185 00:06:38,980 --> 00:06:39,500 ca aceasta. 186 00:06:39,500 --> 00:06:41,000 Lasă-mă să adăugați ceva spațiu. 187 00:06:41,000 --> 00:06:42,550 Deci, înainte, după. 188 00:06:42,550 --> 00:06:46,520 Tocmai am adăugat niște spațiu alb de dragul vizualizare lui aici. 189 00:06:46,520 --> 00:06:51,840 Cum am putea reprezenta acum în, să zicem, hexazecimal fiecare quad de biți, 190 00:06:51,840 --> 00:06:52,880 fiecare set de patru biți? 191 00:06:52,880 --> 00:06:56,420 >> Deci, de exemplu, pe partea stângă acum, avem 1111 în binar. 192 00:06:56,420 --> 00:07:00,420 Ce este acest număr în zecimal, dacă faci din matematica? 193 00:07:00,420 --> 00:07:03,780 Ai locul celor, locul doi cate doi, locul patru labe, și locul optari. 194 00:07:03,780 --> 00:07:04,341 >> Audiența: 15. 195 00:07:04,341 --> 00:07:05,340 David J. MALAN: E 15. 196 00:07:05,340 --> 00:07:08,340 Deci, dacă facem opt plus patru plus doi plus unu, avem 15. 197 00:07:08,340 --> 00:07:11,790 Așa că am putea scrie 15 de mai jos 1111, dar ideea aici 198 00:07:11,790 --> 00:07:13,190 este hexazecimal, nu zecimal. 199 00:07:13,190 --> 00:07:17,310 Deci, în loc de a scrie în jos 15, 1-5, Am de gând să scrie că în hex, 200 00:07:17,310 --> 00:07:22,311 care, dacă credeți înapoi, dacă aveți la zero prin f, ceea ce este de 15 va fi? 201 00:07:22,311 --> 00:07:22,810 Audiența: f. 202 00:07:22,810 --> 00:07:24,434 David J. MALAN: Deci, se dovedește că lui f. 203 00:07:24,434 --> 00:07:29,140 Și tu poți merge prin a spune, bine, în cazul în care o este de 10, atunci OK, f este de 15. 204 00:07:29,140 --> 00:07:33,250 Deci, într-adevăr, am putea rescrie acest același set de numere ar fi f f. 205 00:07:33,250 --> 00:07:35,750 Și apoi, dacă facem un pic de matematica, vom deduce că asta e d. 206 00:07:35,750 --> 00:07:38,650 Opt este destul de ușor, pentru că ne-am am unul în locul optari. 207 00:07:38,650 --> 00:07:40,620 Și atunci, avem un cuplu mai f f lui. 208 00:07:40,620 --> 00:07:44,669 >> Deci, ceea ce oamenii au tendința de a face, prin convenție atunci când utilizează hexazecimal este că doar 209 00:07:44,669 --> 00:07:47,710 Trimite aceasta un pic mai succint, scăpa de cele mai multe din acel spațiu alb. 210 00:07:47,710 --> 00:07:50,890 Și doar pentru a fi foarte clar pentru cititorii că aceasta este hexazecimal, 211 00:07:50,890 --> 00:07:54,670 Convenția de la simplu printre oameni se va scrie zero, 212 00:07:54,670 --> 00:07:58,000 x, care nu are altă semnificație decât un identificator vizuală a, 213 00:07:58,000 --> 00:07:59,590 aici vine un număr hexazecimal. 214 00:07:59,590 --> 00:08:04,210 >> Si apoi, ai pus cele două cifre, f f în acest caz, atunci d a, atunci f f. 215 00:08:04,210 --> 00:08:06,700 Deci, pe scurt, hexazecimal doar tinde 216 00:08:06,700 --> 00:08:11,990 pentru a fi utile pentru că fiecare dintre ei cifre, zero, prin f, perfect linii 217 00:08:11,990 --> 00:08:13,880 cu un model de patru biți. 218 00:08:13,880 --> 00:08:18,080 >> Deci, dacă aveți două cifre hexazecimale, zero, prin F, din nou și din nou, 219 00:08:18,080 --> 00:08:20,256 care vă oferă perfect opt biți sau un octet. 220 00:08:20,256 --> 00:08:22,380 Deci, de aceea tinde sa fi convențional util. 221 00:08:22,380 --> 00:08:24,990 Nu e nici un intelectual conținut într-adevăr dincolo de asta, 222 00:08:24,990 --> 00:08:27,010 altele decât utilitatea reală. 223 00:08:27,010 --> 00:08:29,310 >> Acum, JPEG nu sunt singura fișier formate pentru grafica. 224 00:08:29,310 --> 00:08:33,230 S-ar putea aminti că există fișiere, cum ar fi acest lucru din lume, 225 00:08:33,230 --> 00:08:34,830 cel puțin de câțiva ani. 226 00:08:34,830 --> 00:08:37,580 >> Deci asta a fost de fapt instalate în Windows XP 227 00:08:37,580 --> 00:08:39,960 pe milioane de PC-uri din intreaga lume. 228 00:08:39,960 --> 00:08:43,000 Și acesta a fost un fișier de tip bitmap, BMP. 229 00:08:43,000 --> 00:08:47,690 Și un fișier bitmap, după cum veți vedea în continuare săptămână, înseamnă doar un model de puncte, 230 00:08:47,690 --> 00:08:51,710 pixeli ca acestea sunt numite, o hartă pe biți, într-adevăr. 231 00:08:51,710 --> 00:08:55,160 >> Deci, ceea ce este interesant, însă, despre acest format de fișier, BMP, este 232 00:08:55,160 --> 00:08:58,590 că sub capota, se are mai mult de doar trei bytes 233 00:08:58,590 --> 00:09:01,020 care compun antet sale, așa de a vorbi, primele câteva mușcături. 234 00:09:01,020 --> 00:09:03,330 De fapt, pare un pic complicat la prima vedere. 235 00:09:03,330 --> 00:09:04,704 Și veți vedea acest lucru în setul P. 236 00:09:04,704 --> 00:09:06,810 Și obtinerea ceva în special de acest lucru acum 237 00:09:06,810 --> 00:09:10,720 nu este atât de important, ca doar faptul că, la începutul fiecărui bitmap 238 00:09:10,720 --> 00:09:13,823 fișier, un format grafic, există o grămadă de numere. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Acum Microsoft, autor al acestui format, 241 00:09:16,720 --> 00:09:18,820 tinde să cheme pe cei Lucrurile nu int și caractere 242 00:09:18,820 --> 00:09:22,259 , pluteste, dar cuvintele și d cuvinte și lungi și bytes. 243 00:09:22,259 --> 00:09:23,800 Deci, ele sunt doar diferite tipuri de date. 244 00:09:23,800 --> 00:09:25,170 Sunt nume diferite pentru același lucru. 245 00:09:25,170 --> 00:09:26,740 Dar veți vedea că în P Set patru. 246 00:09:26,740 --> 00:09:31,450 >> Dar aceasta este doar să spun că, dacă un om dublu-clic pe un fisier BMP pe lui 247 00:09:31,450 --> 00:09:35,015 sau hard disk ei, și o fereastră se deschide care să arate că el sau ea a imaginii, 248 00:09:35,015 --> 00:09:38,500 că sa întâmplat pentru că de operare Sistemul presupune observat nu numai 249 00:09:38,500 --> 00:09:41,460 extensia BMP în numele de fișier, 250 00:09:41,460 --> 00:09:45,010 dar, de asemenea, faptul că există unele convenție la modelul de biți 251 00:09:45,010 --> 00:09:47,490 de la bun început de care fișier de tip bitmap. 252 00:09:47,490 --> 00:09:50,270 >> Dar să ne concentrăm acum asupra un astfel de dosar complicat, 253 00:09:50,270 --> 00:09:52,120 dar în schimb pe ceva de genul asta. 254 00:09:52,120 --> 00:09:55,190 Să presupunem că aici în gedit, I Trebuie doar începuturile 255 00:09:55,190 --> 00:09:57,070 de un program care este destul de simplu. 256 00:09:57,070 --> 00:09:58,860 Am niște include până sus. 257 00:09:58,860 --> 00:10:02,120 Acum am # include "structs.h", dar Voi reveni la faptul că într-o clipă. 258 00:10:02,120 --> 00:10:03,974 Dar acest lucru este util pentru acum. 259 00:10:03,974 --> 00:10:05,890 Deci, acesta este un program de care va pune în aplicare 260 00:10:05,890 --> 00:10:07,335 cum ar fi baza de date a registratorului. 261 00:10:07,335 --> 00:10:09,710 Deci, o bază de date de studenți, și fiecare elev din lume 262 00:10:09,710 --> 00:10:13,190 are un nume și o casă și, probabil, unele alte chestii, dar vom păstra simplu. 263 00:10:13,190 --> 00:10:15,140 Fiecare elev are un nume și o casă. 264 00:10:15,140 --> 00:10:17,700 >> Deci, dacă am vrut să scrie o program ale cărui scop în viață 265 00:10:17,700 --> 00:10:19,860 a fost doar pentru a repeta de la zero până la trei, 266 00:10:19,860 --> 00:10:22,070 în cazul în care există trei elevi de la Universitatea Harvard. 267 00:10:22,070 --> 00:10:25,350 Și eu vreau doar pentru a obține, cu ajutorul getString, Numele și casa fiecărui elev, 268 00:10:25,350 --> 00:10:26,600 și apoi doar imprima cele mai. 269 00:10:26,600 --> 00:10:28,630 >> Aceasta este un fel de Săptămâna Una, doua saptamani, lucrurile acum, 270 00:10:28,630 --> 00:10:30,810 unde vreau doar o pentru buclă sau ceva de genul asta. 271 00:10:30,810 --> 00:10:34,500 Și vreau să numesc getString câteva ori, și apoi imprimați f de câteva ori. 272 00:10:34,500 --> 00:10:37,340 Deci, cum s-ar putea face acest lucru, deși, atunci când atât un nume și o casă 273 00:10:37,340 --> 00:10:39,070 sunt implicate pentru fiecare elev? 274 00:10:39,070 --> 00:10:42,830 >> Deci, primul meu instinct ar putea fi de a face ceva de genul asta. 275 00:10:42,830 --> 00:10:49,620 S-ar putea spune în primul rând, bine, da-mi, spune, o serie de siruri de caractere, numite nume. 276 00:10:49,620 --> 00:10:51,530 Și eu nu vreau o hardcodati trei aici. 277 00:10:51,530 --> 00:10:53,064 Ce vreau să pun acolo? 278 00:10:53,064 --> 00:10:55,730 Astfel încât elevii, pentru că e doar o constantă a declarat în partea de sus, 279 00:10:55,730 --> 00:10:57,860 doar ca eu nu trebuie să hardcodati trei în mai multe locuri. 280 00:10:57,860 --> 00:11:00,859 În acest fel, am putea schimba un singur loc, și aceasta afectează o schimbare peste tot. 281 00:11:00,859 --> 00:11:04,470 Și apoi, s-ar putea face șir case elevi. 282 00:11:04,470 --> 00:11:10,250 >> Și acum, s-ar putea face ceva de genul pentru (int i = 0; i 00:11:14,390 Deci, eu sunt tastarea rapidă, dar acest lucru este probabil sintaxă familiar acum. 284 00:11:14,390 --> 00:11:17,030 >> Și acum, aceasta a fost mult mai recent. 285 00:11:17,030 --> 00:11:22,890 Dacă vreau să pun în i-lea Numele elevului, cred că fac asta. 286 00:11:22,890 --> 00:11:26,480 Și apoi, nu numele dar casele bracketing i. 287 00:11:26,480 --> 00:11:29,930 Eu fac acest lucru, getString, și să mă duc înapoi și repara această linie. 288 00:11:29,930 --> 00:11:30,430 De acord? 289 00:11:30,430 --> 00:11:31,200 Nu sunt de acord? 290 00:11:31,200 --> 00:11:32,366 Nu este foarte user-friendly. 291 00:11:32,366 --> 00:11:33,890 Nu am spus utilizatorul ce să facă. 292 00:11:33,890 --> 00:11:36,520 >> Dar acum, dacă eu, de asemenea, a vrut să mai târziu, să 293 00:11:36,520 --> 00:11:40,060 să zicem, imprima aceste lucruri out-- așa TODO mai târziu. 294 00:11:40,060 --> 00:11:42,330 Am de gând să facă mai mult cu asta-- această îndoială este 295 00:11:42,330 --> 00:11:45,970 o punere în aplicare corectă a obtinerea numelor si case, trei 296 00:11:45,970 --> 00:11:48,870 dintre acestea totală a fiecărui, de la un utilizator. 297 00:11:48,870 --> 00:11:51,280 >> Dar acest lucru nu este un design foarte bun, nu? 298 00:11:51,280 --> 00:11:55,220 Ce se întâmplă dacă un elev are nu doar un nume și o casă, dar, de asemenea, un număr de identificare, 299 00:11:55,220 --> 00:11:57,770 și un număr de telefon, și o adresă de e-mail, 300 00:11:57,770 --> 00:12:00,280 și, poate, o pagină de start, și poate un mâner Twitter, 301 00:12:00,280 --> 00:12:03,730 și orice număr de alte detalii asociat cu un elev sau o persoană, 302 00:12:03,730 --> 00:12:04,610 mai general. 303 00:12:04,610 --> 00:12:07,720 Cum ne-ar începe să adăugați funcționalitate pentru acest program? 304 00:12:07,720 --> 00:12:14,080 >> Ei bine, mă simt ca cel mai simplu mod s-ar putea fie de a face ceva de genul, să zicem, 305 00:12:14,080 --> 00:12:16,490 int IDS elevi. 306 00:12:16,490 --> 00:12:18,380 Deci, eu pot pune toate ID-urile lor acolo. 307 00:12:18,380 --> 00:12:22,240 Și apoi, pentru ceva cum ar fi numere de telefon, 308 00:12:22,240 --> 00:12:24,400 Nu sunt sigur cum să reprezintă faptul că doar încă. 309 00:12:24,400 --> 00:12:30,280 Deci, să mergem mai departe și doar apel acest Twitters studenți, care 310 00:12:30,280 --> 00:12:33,550 este un pic ciudat, dar-- și un buchet mai multe câmpuri. 311 00:12:33,550 --> 00:12:36,360 >> Am început să efectiv copy si paste aici. 312 00:12:36,360 --> 00:12:39,416 Și acest lucru este de gând să crească destul de greoi destul de repede, nu? 313 00:12:39,416 --> 00:12:42,290 Nu ar fi frumos dacă ar exista în lume o structură de date cunoscute 314 00:12:42,290 --> 00:12:45,600 nu ca un întreg sau un șir de caractere, dar ceva nivel mai înalt, o abstracțiune, așa 315 00:12:45,600 --> 00:12:47,570 de a vorbi, cunoscut ca un elev? 316 00:12:47,570 --> 00:12:50,220 C nu a venit cu built-in funcționalitate pentru studenți, 317 00:12:50,220 --> 00:12:52,260 dar ce se întâmplă dacă am vrut să-i dea o astfel? 318 00:12:52,260 --> 00:12:55,640 >> Ei bine, se pare, am de gând să deschide un fișier numit structs.h aici, 319 00:12:55,640 --> 00:12:57,090 și puteți face exact asta. 320 00:12:57,090 --> 00:12:58,290 Și vom începe să faci acest lucru acum. 321 00:12:58,290 --> 00:13:01,490 Și sub capota P Set trei, ai fost deja fac asta acum. 322 00:13:01,490 --> 00:13:05,920 Nu există nici un astfel de lucru ca o g rect sau un g oval în limbajul de programare C. 323 00:13:05,920 --> 00:13:10,570 >> Cei de la Stanford în aplicare a celor tipuri de date prin utilizarea acestei abordări aici, 324 00:13:10,570 --> 00:13:13,900 declararea lor de date nou tipuri utilizând un cuvânt cheie nou 325 00:13:13,900 --> 00:13:16,744 numit struct și un alt unul numit typedef. 326 00:13:16,744 --> 00:13:19,660 Și într-adevăr, chiar dacă sintaxa arată un pic diferit de chestii 327 00:13:19,660 --> 00:13:23,550 am văzut înainte, în principiu, e foarte simplu. 328 00:13:23,550 --> 00:13:25,297 >> Acest lucru înseamnă doar "a defini un tip." 329 00:13:25,297 --> 00:13:27,255 Asta va fi o structură, și o structură 330 00:13:27,255 --> 00:13:29,400 este la fel ca un recipient pentru mai multe lucruri. 331 00:13:29,400 --> 00:13:31,780 Și că structura se întâmplă pentru a avea un șir numit nume, 332 00:13:31,780 --> 00:13:33,210 și un șir numit casă. 333 00:13:33,210 --> 00:13:37,520 Si sa-i spunem, doar pentru comoditate, tot acest elev structură de date. 334 00:13:37,520 --> 00:13:40,320 >> Deci, în momentul în care ajunge la punct și virgulă, aveți acum 335 00:13:40,320 --> 00:13:43,280 a creat propriul date tip numit elev 336 00:13:43,280 --> 00:13:46,420 care acum se află alături de int, și float, char și, și de coarde, 337 00:13:46,420 --> 00:13:50,270 și g rect, și g ovale, și orice număr de alte lucruri pe care oamenii s-au inventat. 338 00:13:50,270 --> 00:13:53,340 >> Deci, ce este util despre acest acum este că, dacă mă duc înapoi 339 00:13:53,340 --> 00:13:57,430 la struct 0 și să termin această punerea în aplicare, pe care am scris 340 00:13:57,430 --> 00:14:02,080 în prealabil aici, observăm că toate de messiness inevitabil că 341 00:14:02,080 --> 00:14:05,490 era pe cale să înceapă acum ca am adaugat numere de telefon și pe Twitter și toate 342 00:14:05,490 --> 00:14:07,370 alte lucruri definiție a unui student, 343 00:14:07,370 --> 00:14:11,810 acum este succint înfășurat ca doar un singur element de elevi. 344 00:14:11,810 --> 00:14:15,500 >> Și fiecare dintre aceste elevi acum are mai multe lucruri în interiorul de el. 345 00:14:15,500 --> 00:14:16,930 Așa că lasă doar o singură întrebare. 346 00:14:16,930 --> 00:14:19,700 Cum puteți obține la numele, și casa, și ID-ul, 347 00:14:19,700 --> 00:14:21,640 și orice altceva este în interiorul a elevului? 348 00:14:21,640 --> 00:14:22,930 Super simplu, de asemenea. 349 00:14:22,930 --> 00:14:25,730 New sintaxă, dar o idee simplă. 350 00:14:25,730 --> 00:14:29,239 >> Ești pur și simplu index în matrice, așa cum am făcut-o săptămâna trecută și acest lucru. 351 00:14:29,239 --> 00:14:31,030 Și ceea ce este în mod clar noua piesa de sintaxă? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Doar., Care înseamnă "a merge în interiorul structura și de a lua domeniu numit 354 00:14:35,880 --> 00:14:39,030 nume, pentru a primi câmpul numit casa, obține câmpul numit elev. " 355 00:14:39,030 --> 00:14:41,940 >> Deci, în P a stabilit trei, dacă ești încă de lucru pe care, 356 00:14:41,940 --> 00:14:44,020 și majoritatea oamenilor încă se, își dau seama că pe măsură ce 357 00:14:44,020 --> 00:14:46,130 începe să utilizați lucruri cum ar fi g rects și g ovale 358 00:14:46,130 --> 00:14:50,201 și alte lucruri care nu par să provin din Săptămâna zero, unu, sau doi, 359 00:14:50,201 --> 00:14:52,950 dau seama că asta pentru ca Stanford a declarat unor noi tipuri de date. 360 00:14:52,950 --> 00:14:56,160 >> Și într-adevăr, asta este exact ceea ce vom face, de asemenea, în P Set patru, atunci când 361 00:14:56,160 --> 00:14:59,880 vom începe să se ocupe cu lucruri cum ar fi imagini, bitmap, și mai mult. 362 00:14:59,880 --> 00:15:02,882 Deci, asta e doar un teaser și un model mental pentru ceea ce va veni. 363 00:15:02,882 --> 00:15:04,590 Acum, am tergiversat un pic în această dimineață. 364 00:15:04,590 --> 00:15:09,560 Am fost un fel de curios să văd ce tapet Microsoft de fapt 365 00:15:09,560 --> 00:15:10,310 arata ca azi. 366 00:15:10,310 --> 00:15:15,200 Și se pare că cineva în 2006 de fapt, sa dus la aproape exact 367 00:15:15,200 --> 00:15:19,210 în același loc pentru a fotografia în realitate ceea ce arata ca aceste zile. 368 00:15:19,210 --> 00:15:21,380 Câmpul este acum un pic prea mare. 369 00:15:21,380 --> 00:15:24,850 >> Deci, vorbind acum de imagini, Să aducem înapoi Daven aici 370 00:15:24,850 --> 00:15:26,890 pe ecran și Nicolae, și doar să vă reamintesc 371 00:15:26,890 --> 00:15:30,540 că, dacă doriți să vă alăturați nouă pentru masa de prânz vineri, cap la URL-ul nostru obișnuit 372 00:15:30,540 --> 00:15:31,440 aici. 373 00:15:31,440 --> 00:15:33,530 >> Deci, unde ne-am lăsa pe luni? 374 00:15:33,530 --> 00:15:35,140 Am introdus această problemă, nu? 375 00:15:35,140 --> 00:15:37,610 Aceasta a fost aparent o corectă punerea în aplicare a swap, 376 00:15:37,610 --> 00:15:40,460 prin care vă luați două int, unul numit, unul numit b, 377 00:15:40,460 --> 00:15:44,130 le schimba, la fel ca Laura a făcut aici pe scena cu laptele și apa, 378 00:15:44,130 --> 00:15:46,820 prin utilizarea unui temporară variabilă, sau o ceașcă goală, 379 00:15:46,820 --> 00:15:50,540 astfel încât să putem pune b într-o și o în b fără a face o mizerie de lucruri. 380 00:15:50,540 --> 00:15:51,560 Am folosit o variabilă. 381 00:15:51,560 --> 00:15:52,870 Se numește temp. 382 00:15:52,870 --> 00:15:55,520 >> Dar ceea ce a fost fundamentală problema cu acest cod pe luni? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Care a fost problema aici? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Da. 387 00:16:00,605 --> 00:16:01,970 >> Audiența: Este nevoie de mai mult spațiu. 388 00:16:01,970 --> 00:16:04,719 >> David J. MALAN: Ocupă mai mult spațiu, pentru că eu sunt, folosind o variabilă, 389 00:16:04,719 --> 00:16:05,400 și asta e bine. 390 00:16:05,400 --> 00:16:07,300 Acest lucru este adevărat, dar eu sunt O să spun că e în regulă. 391 00:16:07,300 --> 00:16:10,030 Este doar 32 de biți în Marele schemă a lucrurilor, deci nu este o afacere mare. 392 00:16:10,030 --> 00:16:10,655 Alte gânduri? 393 00:16:10,655 --> 00:16:12,572 Audiența: Se swap doar variabilele la nivel local. 394 00:16:12,572 --> 00:16:13,571 David J. MALAN: Exact. 395 00:16:13,571 --> 00:16:15,090 Acesta swap doar variabilele la nivel local. 396 00:16:15,090 --> 00:16:18,173 Pentru că de fiecare dată când suni un function-- când am avut tăvi de Annenberg 397 00:16:18,173 --> 00:16:19,840 ultima dată, aveți principal pe partea de jos. 398 00:16:19,840 --> 00:16:23,560 De îndată ce ați apela o funcție numită de swap, de swap nu se x și y, 399 00:16:23,560 --> 00:16:24,400 valorile originale. 400 00:16:24,400 --> 00:16:26,392 Ce face get schimb, ne-am pretinde? 401 00:16:26,392 --> 00:16:27,100 Audiența: Copii. 402 00:16:27,100 --> 00:16:28,090 David J. MALAN: Deci, copii ale acestora. 403 00:16:28,090 --> 00:16:31,120 Deci, acesta devine unul și doi, dacă amintesc exemplul din ultimul timp, 404 00:16:31,120 --> 00:16:34,730 ci o copie a unu și doi care sunt schimbate cu succes. 405 00:16:34,730 --> 00:16:38,550 Dar, din păcate, în cele din urmă, aceste valori sunt în continuare la fel. 406 00:16:38,550 --> 00:16:41,880 Deci, putem vedea acest lucru cu nostru nou prieten, sperăm GDB, 407 00:16:41,880 --> 00:16:45,180 că tu sau TFS și lui Ca au fost director tu față de cum urmează. 408 00:16:45,180 --> 00:16:51,210 >> Deci, nici o rechemare de swap arata ca-- să deschide asta-- arata ca acest lucru. 409 00:16:51,210 --> 00:16:54,160 Am inițializat x uneia, y la doi. 410 00:16:54,160 --> 00:16:55,620 Am avut o grămadă de imprimare f lui. 411 00:16:55,620 --> 00:16:58,080 Dar apoi, apelul cheie aici a fost de a schimba, care 412 00:16:58,080 --> 00:17:00,260 este exact codul WE tocmai am văzut în urmă cu o clipă. 413 00:17:00,260 --> 00:17:03,180 Ceea ce este corect în primul vedere, dar funcțional, 414 00:17:03,180 --> 00:17:06,800 acest program nu funcționează, pentru că aceasta nu schimba permanent x și y. 415 00:17:06,800 --> 00:17:10,190 >> Deci, hai sa vedem aceasta, o încălzire rapidă, aici cu GDB, o ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 O grămadă de informații copleșitoare care Voi scăpa de cu control L pentru acum. 418 00:17:15,200 --> 00:17:17,516 Și acum, am de gând să mergeți mai departe și a alerga it. 419 00:17:17,516 --> 00:17:19,349 Și, din păcate, că nu a fost faptul că util. 420 00:17:19,349 --> 00:17:22,355 Ea a fugit programul în interiorul acestui program numit GDB, un debugger, 421 00:17:22,355 --> 00:17:23,730 dar nu-mi băga în jurul. 422 00:17:23,730 --> 00:17:26,229 >> Deci, cum pot de fapt o pauză execuție în acest program? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Deci, pauza. 425 00:17:28,329 --> 00:17:32,340 Și am putea rupe în orice linie număr, unul, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Dar pot, de asemenea, rupe simbolic prin a spune pauză principal. 427 00:17:35,530 --> 00:17:38,980 Și care va stabili o pauză punct, se pare că la linia 16 in principal. 428 00:17:38,980 --> 00:17:40,050 Și unde este linia 16? 429 00:17:40,050 --> 00:17:42,960 Să mergem până la codul și du-te până la noswap. 430 00:17:42,960 --> 00:17:46,930 Și într-adevăr, linia 16 este prima în program. 431 00:17:46,930 --> 00:17:52,130 >> Deci, acum, dacă am merge mai departe și de tip rula acest moment, Enter, se opri. 432 00:17:52,130 --> 00:17:53,080 Așa că haideți să scormoni în jurul. 433 00:17:53,080 --> 00:17:55,716 Printeaza X- de ce este x la zero? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Și ignora semnul dolar. 436 00:17:57,830 --> 00:17:59,725 Asta e doar pentru crescator utilizare a programului. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 De ce este x zero, în acest moment? 439 00:18:03,140 --> 00:18:03,640 Da. 440 00:18:03,640 --> 00:18:07,061 >> Audiența: Este oprit chiar înainte de linia 16, nu de fapt, pe linia 16. 441 00:18:07,061 --> 00:18:08,060 David J. MALAN: Exact. 442 00:18:08,060 --> 00:18:11,630 GDB, în mod implicit, a întrerupt execuție chiar înainte de linia 16. 443 00:18:11,630 --> 00:18:14,820 Deci, nu a executat, care înseamnă că x este de o anumită valoare necunoscută. 444 00:18:14,820 --> 00:18:17,150 Și am avut noroc că e ceva curat ca zero. 445 00:18:17,150 --> 00:18:20,310 Deci, acum, dacă am introduce următorul, acum executat 16. 446 00:18:20,310 --> 00:18:22,000 Se așteaptă ca eu să execute 17. 447 00:18:22,000 --> 00:18:23,400 Lasă-mă să mergeți mai departe și de imprimare x. 448 00:18:23,400 --> 00:18:24,094 Este una. 449 00:18:24,094 --> 00:18:25,260 Lasă-mă să mergeți mai departe și de imprimare y. 450 00:18:25,260 --> 00:18:26,176 Ce ar trebui să vedeți acum? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> Audiența: [inaudibil] 453 00:18:28,560 --> 00:18:29,165 >> David J. MALAN: Un pic mai tare. 454 00:18:29,165 --> 00:18:30,040 >> Audiența: [inaudibil] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 David J. MALAN: Nu chiar un consens. 457 00:18:32,120 --> 00:18:34,760 Deci, da, vedem o anumită valoare gunoi. 458 00:18:34,760 --> 00:18:37,862 Acum, y este 134514064 acolo. 459 00:18:37,862 --> 00:18:39,320 Ei bine, e doar o valoare gunoi. 460 00:18:39,320 --> 00:18:41,350 Programul meu foloseste RAM pentru scopuri diferite. 461 00:18:41,350 --> 00:18:42,350 Există și alte funcții. 462 00:18:42,350 --> 00:18:44,040 Alte persoane au scris în interiorul computerului meu. 463 00:18:44,040 --> 00:18:46,789 Deci cele de biți au fost utilizate pentru alte valori, și ceea ce văd 464 00:18:46,789 --> 00:18:49,470 este resturi de unele utilizare înainte de acea amintire. 465 00:18:49,470 --> 00:18:53,350 >> Deci, nu e mare lucru, pentru că în cel mai scurt cum am tip următor și apoi imprimați y, 466 00:18:53,350 --> 00:18:55,640 este inițializat la valoarea pe care vreau. 467 00:18:55,640 --> 00:18:57,400 Deci, acum, să mergem mai departe un pic mai repede. 468 00:18:57,400 --> 00:18:58,540 N pentru viitor. 469 00:18:58,540 --> 00:18:59,570 Să o facem din nou. 470 00:18:59,570 --> 00:19:00,530 Să o facem din nou. 471 00:19:00,530 --> 00:19:02,404 Dar eu nu vreau să lovi ea aici, pentru că dacă eu 472 00:19:02,404 --> 00:19:05,110 Vreau să văd ce se întâmplă în interiorul de schimb, ceea ce-i comanda? 473 00:19:05,110 --> 00:19:05,520 >> Audiența: pași. 474 00:19:05,520 --> 00:19:06,436 >> David J. MALAN: pași. 475 00:19:06,436 --> 00:19:09,800 Deci, asta-mi pașii într-o funcție, mai degrabă decât asupra ei. 476 00:19:09,800 --> 00:19:12,270 Și acum, e un pic criptic sincer, dar aceasta este doar 477 00:19:12,270 --> 00:19:14,581 mi-a spus că sunt în linia 33 acum. 478 00:19:14,581 --> 00:19:15,580 Și să facem asta din nou. 479 00:19:15,580 --> 00:19:16,080 Temperatura de imprimare. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Valoare gunoi, negativ de această dată, dar asta e doar încă o valoare gunoi. 482 00:19:20,170 --> 00:19:22,810 Așa că haideți să facă în continuare, temperatura de imprimare. 483 00:19:22,810 --> 00:19:27,130 Este inițializată la 1, ceea ce a fost valoarea x, aka o. 484 00:19:27,130 --> 00:19:29,110 >> Acum, în cazul în care sunt noastră o și x provenind din? 485 00:19:29,110 --> 00:19:32,510 Ei bine, observa in principal, ne-am numit aceste valori x și y. 486 00:19:32,510 --> 00:19:34,740 Apoi am trecut-le pentru a schimba, după cum urmează. 487 00:19:34,740 --> 00:19:37,010 X a venit primul, virgulă y. 488 00:19:37,010 --> 00:19:40,020 Și apoi, de swap-ar putea să le numesc x si y. 489 00:19:40,020 --> 00:19:42,630 Dar pentru claritate, este numindu-le o și b. 490 00:19:42,630 --> 00:19:45,970 Dar a și b sunt acum de gând să fie copii ale x și y, respectiv. 491 00:19:45,970 --> 00:19:50,660 >> Deci, dacă mă întorc la GDB, temp este acum un an și este acum unul. 492 00:19:50,660 --> 00:19:56,130 Dar dacă am face în continuare și acum face print o, o a fost deja mutat. 493 00:19:56,130 --> 00:20:00,030 Laptele a fost turnat în prima pahar de suc de portocale, sau invers. 494 00:20:00,030 --> 00:20:04,750 >> Și dacă eu fac în continuare din nou, iar acum dacă am imprima ca un control bun-simț, 495 00:20:04,750 --> 00:20:07,687 o este încă doi, dar b este acum unul. 496 00:20:07,687 --> 00:20:08,770 Sincer, este încă acolo. 497 00:20:08,770 --> 00:20:10,670 Nu-mi pasă ce temperatura este. 498 00:20:10,670 --> 00:20:16,850 Dar, de îndată ce acum eu tip, să zicem, continua să se întoarcă, acum eu sunt la capătul 499 00:20:16,850 --> 00:20:17,480 programul. 500 00:20:17,480 --> 00:20:20,730 Și, din păcate, x este încă una și y este încă doi. 501 00:20:20,730 --> 00:20:22,272 >> Deci, ce a fost utilitatea GDB acolo? 502 00:20:22,272 --> 00:20:23,980 Aceasta nu a ajutat-mi repara Problema în sine, 503 00:20:23,980 --> 00:20:26,265 dar sperăm să mă ajute Înțeleg că prin realizarea 504 00:20:26,265 --> 00:20:30,000 că da, logica mea este drept, dar codul meu nu este în cele din urmă au 505 00:20:30,000 --> 00:20:31,450 un impact permanent. 506 00:20:31,450 --> 00:20:34,570 Deci asta eo problemă că suntem va rezolva acum astăzi. 507 00:20:34,570 --> 00:20:37,870 >> Dar să ajungem acolo prin aceasta. 508 00:20:37,870 --> 00:20:39,230 String este o minciună. 509 00:20:39,230 --> 00:20:41,860 Este, de asemenea, nu un tip de date care există în C. Este 510 00:20:41,860 --> 00:20:44,750 a fost un sinonim pentru unii timp pentru altceva, 511 00:20:44,750 --> 00:20:47,300 și putem descoperi că, după cum urmează. 512 00:20:47,300 --> 00:20:53,282 >> Lasă-mă să mergeți mai departe și să se deschidă un program numit compara-0. 513 00:20:53,282 --> 00:20:56,240 Și, mai degrabă decât acest tip unul, vom începe să se plimbe prin codul 514 00:20:56,240 --> 00:20:58,040 I-am scris deja, dar e doar câteva rânduri. 515 00:20:58,040 --> 00:20:59,570 Deci, acest lucru este compara-0. 516 00:20:59,570 --> 00:21:02,380 Și primul lucru pe care fac devine o linie de text. 517 00:21:02,380 --> 00:21:05,610 >> Dar observați ce am face pentru prima dată. 518 00:21:05,610 --> 00:21:07,910 Ceea ce este diferit în mod clar despre linia 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 De fapt, stai un minut. 521 00:21:11,402 --> 00:21:12,110 Aceasta este copia două. 522 00:21:12,110 --> 00:21:13,568 Asta nu este chiar programul potrivit. 523 00:21:13,568 --> 00:21:14,780 Bine, alertă spoiler. 524 00:21:14,780 --> 00:21:16,890 Bine, nu contează atât de asta. 525 00:21:16,890 --> 00:21:18,520 Ăsta e răspunsul la o întrebare viitor. 526 00:21:18,520 --> 00:21:21,450 >> Aici se compara-0, și eu sunt pe cale de a obține o linie de text. 527 00:21:21,450 --> 00:21:22,435 Programul mult mai simplu. 528 00:21:22,435 --> 00:21:23,560 Deci, acest lucru este simplu. 529 00:21:23,560 --> 00:21:28,070 Acest lucru este ca Saptamana Una, doua saptamani, lucrurile în acest moment. string s = getString. 530 00:21:28,070 --> 00:21:29,700 Acum, o spun din nou aici. 531 00:21:29,700 --> 00:21:31,830 șir t = getString. 532 00:21:31,830 --> 00:21:35,300 Și apoi, ultimul lucru în acest Programul, așa cum sugerează și numele, 533 00:21:35,300 --> 00:21:37,090 este am de gând să încerce să le compara. 534 00:21:37,090 --> 00:21:40,709 >> Deci, dacă s, primul șir, este egal cu = t, atunci eu sunt 535 00:21:40,709 --> 00:21:42,250 O să spun ce tastați același lucru. 536 00:21:42,250 --> 00:21:44,291 Altfel, am de gând să spun tastați lucruri diferite. 537 00:21:44,291 --> 00:21:45,880 Deci, haideți să compila și rula acest program. 538 00:21:45,880 --> 00:21:48,481 Deci, asigurați compara zero. 539 00:21:48,481 --> 00:21:48,980 Arată bine. 540 00:21:48,980 --> 00:21:50,490 Nu erori de compilare. 541 00:21:50,490 --> 00:21:52,386 >> Lasă-mă să merg mai departe acum și de tip ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Lasă-mă să mergeți mai departe și spune ceva : Daven și ceva: Rob. 544 00:21:59,220 --> 00:22:00,450 Și eu scriu lucruri diferite. 545 00:22:00,450 --> 00:22:01,250 Până în prezent, atât de bine. 546 00:22:01,250 --> 00:22:02,680 Programul pare a fi corect. 547 00:22:02,680 --> 00:22:03,880 >> Dar să-l ruleze din nou. 548 00:22:03,880 --> 00:22:05,800 Spune ceva: Gabe. 549 00:22:05,800 --> 00:22:07,140 Spune ceva: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 În regulă. 552 00:22:09,020 --> 00:22:10,851 Poate am lovit bara de spațiu sau ceva funky. 553 00:22:10,851 --> 00:22:11,600 Să o facem din nou. 554 00:22:11,600 --> 00:22:13,020 Deci, Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Diferite lucruri. 559 00:22:17,330 --> 00:22:19,430 Deci, ce se întâmplă? 560 00:22:19,430 --> 00:22:23,200 >> Deci avem aceste două linii de cod, getString fiind numit de două ori. 561 00:22:23,200 --> 00:22:25,760 Și apoi, eu sunt pur și simplu încercarea de a compara s și t. 562 00:22:25,760 --> 00:22:28,370 Dar ceea ce atunci se întâmplă? 563 00:22:28,370 --> 00:22:31,180 Ei bine, scrisul meu e pe cale să macelari acest exemplu oarecum. 564 00:22:31,180 --> 00:22:34,630 Și să arunce efectiv asta aici, de asemenea. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Deci, avem o linie de genul string s = getString. 567 00:22:45,712 --> 00:22:48,295 Deci, asta e pur și simplu primul linie interesant din acest program. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Dar ceea ce a fost în tot acest timp întâmplă sub capotă? 570 00:22:52,974 --> 00:22:55,890 Ei bine, pe stâng lateral este șir, care este un anumit tip de variabile, 571 00:22:55,890 --> 00:22:56,785 și se numește uri. 572 00:22:56,785 --> 00:23:00,019 Deci, eu știu că acest lucru este cu ajutorul memoriei, sau RAM, in cumva computerul meu. 573 00:23:00,019 --> 00:23:02,060 Așa că am de gând să abstract trage ca pe un pătrat. 574 00:23:02,060 --> 00:23:04,820 32 de biți, se pare, dar mai mult pe faptul că, în viitor. 575 00:23:04,820 --> 00:23:06,410 Și atunci, ce se întâmplă aici? 576 00:23:06,410 --> 00:23:08,700 >> Ei bine, evident getString devine un șir de utilizator. 577 00:23:08,700 --> 00:23:11,360 Și getString primit Zamyla sau Gabe sau Daven. 578 00:23:11,360 --> 00:23:14,640 Deci, haideți să aleagă primul de aceia, care a fost Daven. 579 00:23:14,640 --> 00:23:19,174 Deci, în mod eficient, ceea ce getString primit mă în care primul caz a fost D-o-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Și apoi, ce altceva a făcut ea mi-a dat în secret? 582 00:23:25,045 --> 00:23:25,920 Audiența: [inaudibil] 583 00:23:25,920 --> 00:23:28,720 David J. MALAN: Da, / 0 sau null caracter. 584 00:23:28,720 --> 00:23:30,550 Așa că mi-a dat în mod eficient un șir. 585 00:23:30,550 --> 00:23:34,550 Dar noi știm deja de la precedenta arată că un șir este doar o matrice 586 00:23:34,550 --> 00:23:37,895 de caractere, și este reziliat de către acest caracter special Sentinel, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Dar dacă acest lucru este adevărat și acesta este un pătrat, 589 00:23:42,310 --> 00:23:44,160 acest lucru este în mod clar un dreptunghi mult mai mare. 590 00:23:44,160 --> 00:23:46,830 Și într-adevăr, aceasta este, Eu susțin, doar 32 de biți. 591 00:23:46,830 --> 00:23:49,500 Și acest lucru este în mod clar mai mult de 32 biți, pentru că aceasta este, probabil, 592 00:23:49,500 --> 00:23:51,583 opt plus opt plus opt plus opt plus opt, 593 00:23:51,583 --> 00:23:53,320 doar din cauza octeți în ASCII. 594 00:23:53,320 --> 00:23:57,030 Cum naiba vom potrivi Daven în această cutiuță aici? 595 00:23:57,030 --> 00:23:59,880 >> Ei bine, ceea ce este de fapt getString face? 596 00:23:59,880 --> 00:24:03,680 Ei bine, această grilă reprezintă aici memorie sau RAM computerul meu. 597 00:24:03,680 --> 00:24:07,564 Deci, să spunem în mod arbitrar că în cazul în care fiecare dintre acestea reprezintă un octet, 598 00:24:07,564 --> 00:24:09,730 atunci ne putem gândi la fiecare octet ca având o adresă, 599 00:24:09,730 --> 00:24:13,830 ca 33 Oxford Street, sau 34 Oxford Street, sau 35 de Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Deci, la fel ca și casele au adrese și clădiri au adrese, 601 00:24:16,700 --> 00:24:19,810 face acest lucru bytes individuale ale memorie au adrese sau numere 602 00:24:19,810 --> 00:24:21,042 care le identifica în mod unic. 603 00:24:21,042 --> 00:24:22,000 Acum, acest lucru este arbitrară. 604 00:24:22,000 --> 00:24:25,370 Dar să-l păstrați simplu, am de gând să folosi hexazecimal doar prin convenție, 605 00:24:25,370 --> 00:24:28,200 dar 0x înseamnă nimic altceva decât "aceasta este hexazecimal." 606 00:24:28,200 --> 00:24:31,030 și am de gând să pretind că "D" se încheie până la Byte Una din memorie. 607 00:24:31,030 --> 00:24:34,210 >> Nu am nimic altceva se întâmplă în memorie, astfel încât Daven luat primul loc 608 00:24:34,210 --> 00:24:35,509 la Byte One. 609 00:24:35,509 --> 00:24:36,800 Acest lucru, atunci, va fi 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Acest lucru se întâmplă pentru 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Acest lucru va fi 0x4. 614 00:24:41,800 --> 00:24:43,025 Acest lucru se întâmplă pentru 0x5. 615 00:24:43,025 --> 00:24:44,025 Acest lucru va fi 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Dar, odată ce începi să te gândești despre ceea ce face a calculatorului 618 00:24:48,290 --> 00:24:50,710 sub capota, puteți începe să deducem 619 00:24:50,710 --> 00:24:54,960 cum, în urmă cu câțiva ani, ar fi au pus în aplicare C în sine. 620 00:24:54,960 --> 00:24:58,360 Ce este getString probabil returning-- deoarece 621 00:24:58,360 --> 00:25:00,946 se simte ca nu e revenind Daven, în sine, 622 00:25:00,946 --> 00:25:03,320 pentru că el cu siguranță nu se va pentru a se potrivi în acest mic box-- 623 00:25:03,320 --> 00:25:05,090 astfel încât ceea ce este, probabil, getString întoarce? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> Audiența: [inaudibil] 626 00:25:08,920 --> 00:25:10,540 >> David J. MALAN: Locul de amplasare a Daven. 627 00:25:10,540 --> 00:25:12,770 Și a făcut acest lucru încă de săptămâna One. 628 00:25:12,770 --> 00:25:16,150 Ceea ce este cu adevărat getString returnarea nu este un șir, în sine. 629 00:25:16,150 --> 00:25:17,780 Aceasta este una dintre cele mai mici minciuni albe. 630 00:25:17,780 --> 00:25:22,520 Se întoarce adresa șir în memorie, adresa unică. 631 00:25:22,520 --> 00:25:24,820 Daven locuiește la 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Dar mai succint, Gavin trăiește la 0x1, Adresa Number One. 633 00:25:29,310 --> 00:25:32,280 >> Deci, ceea ce se pune în acest cutie mică atunci, să fie clar, 634 00:25:32,280 --> 00:25:35,930 este doar adresa de acel șir. 635 00:25:35,930 --> 00:25:38,110 Deci, în tot acest timp, acest a fost întâmplă. 636 00:25:38,110 --> 00:25:41,650 Dar ceea ce sugerează acest lucru la acum este că dacă tot e are 637 00:25:41,650 --> 00:25:44,710 este un număr interiorul ei, care este să te oprească, programator, 638 00:25:44,710 --> 00:25:47,970 de a pune orice număr din orice variabilă și chiar sărind 639 00:25:47,970 --> 00:25:49,080 pentru că bucata de memorie? 640 00:25:49,080 --> 00:25:51,320 Și într-adevăr, vom vedea că este o amenințare data viitoare. 641 00:25:51,320 --> 00:25:53,500 >> Dar pentru acum, acest lucru se simte insuficient. 642 00:25:53,500 --> 00:25:55,630 Dacă spun, adu-mi o șir, să-mi dai Daven. 643 00:25:55,630 --> 00:25:57,230 Dar tu nu prea-mi Daven. 644 00:25:57,230 --> 00:25:59,310 Tot ce-mi da este adresa Daven lui. 645 00:25:59,310 --> 00:26:04,310 Cum atunci știu sigur unde Daven începe și ends-- 646 00:26:04,310 --> 00:26:07,140 Povestea din ce in ce weird-- unde Daven începe și se termină, 647 00:26:07,140 --> 00:26:10,435 și apoi, următoarea șir în memorie începe? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Ei bine, dacă sunteți predarea mă începutul Daven, 650 00:26:13,620 --> 00:26:17,230 în esență, cum știu în cazul în care la sfârșitul numelui său este? 651 00:26:17,230 --> 00:26:20,550 Asta caracter nul special, care este cu atât mai important acum 652 00:26:20,550 --> 00:26:23,040 dacă siruri de caractere sub capota sunt pur și simplu identificate 653 00:26:23,040 --> 00:26:25,820 unic prin amplasarea lor în memorie. 654 00:26:25,820 --> 00:26:28,130 Deci, în tot acest timp, asta-i ceea ce se întâmplă. 655 00:26:28,130 --> 00:26:32,470 >> Așa că atunci când ne uităm acum la codul de aici, explica 656 00:26:32,470 --> 00:26:35,790 dacă ar fi bug-ul în linia 26. 657 00:26:35,790 --> 00:26:39,560 De ce este Zamyla și Zamyla diferit? 658 00:26:39,560 --> 00:26:41,330 De ce este Gabe și Gabe diferit? 659 00:26:41,330 --> 00:26:42,154 Da, în spate. 660 00:26:42,154 --> 00:26:43,390 >> Audiența: Ei au adrese diferite. 661 00:26:43,390 --> 00:26:45,931 >> David J. MALAN: Pur și simplu pentru că ei au adrese diferite. 662 00:26:45,931 --> 00:26:48,820 Pentru că atunci când te sun getString din nou, ceea ce voi face repede aici, 663 00:26:48,820 --> 00:26:52,870 în cazul în care aceasta este a doua linie, șirul t, așa cum am făcut în acest program, 664 00:26:52,870 --> 00:26:55,030 este egal cu un alt apel la getString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Data viitoare eu numesc GetString, am de gând 667 00:26:58,670 --> 00:27:00,190 pentru a obține o bucată diferit de memorie. 668 00:27:00,190 --> 00:27:02,220 >> GetString este permis să solicite de operare 669 00:27:02,220 --> 00:27:03,800 sistem pentru mai multe și mai multă memorie. 670 00:27:03,800 --> 00:27:07,894 Nu se va refolosi la fel șase bytes de fiecare dată. 671 00:27:07,894 --> 00:27:09,810 Va obține un nou bucată de memorie, care 672 00:27:09,810 --> 00:27:12,780 înseamnă t este mergi la a lua o altă valoare pe aici. 673 00:27:12,780 --> 00:27:15,380 >> Așa că atunci când am face s egal = t, tu nu esti comparat 674 00:27:15,380 --> 00:27:17,880 D împotriva acestei și A împotriva aceasta și V împotriva acestui lucru. 675 00:27:17,880 --> 00:27:19,588 Ai comparat asta împotriva acestei, care 676 00:27:19,588 --> 00:27:24,020 sincer este destul de useless-- useful-- este destul de inutil, pentru că într-adevăr cine 677 00:27:24,020 --> 00:27:25,830 îi pasă în cazul în care siruri de caractere sunt în memorie? 678 00:27:25,830 --> 00:27:26,850 >> Și într-adevăr, noi nu avem. 679 00:27:26,850 --> 00:27:28,980 Iar noi nu vom începe deosebit de grijuliu. 680 00:27:28,980 --> 00:27:34,180 Numai în măsura în care bug-uri pot apărea și amenințările la adresa securității pot apărea voința 681 00:27:34,180 --> 00:27:36,100 am de fapt, începe să le pese de acest lucru. 682 00:27:36,100 --> 00:27:37,230 Așa că haideți să rezolve această problemă. 683 00:27:37,230 --> 00:27:39,650 Se pare, sa-l repari foarte simplu. 684 00:27:39,650 --> 00:27:42,600 >> Și să de fapt, înainte de a arată că, din nou, ceea ce ar fi 685 00:27:42,600 --> 00:27:47,170 ai face dacă într-o clasă CS50, și a trebuit să pună în aplicare 686 00:27:47,170 --> 00:27:48,600 o comparație împotriva a două șiruri. 687 00:27:48,600 --> 00:27:51,440 Tu clar nu se poate folosi doar e egal = t. 688 00:27:51,440 --> 00:27:54,090 Dar în mod logic, cum ai compara acest șir 689 00:27:54,090 --> 00:27:56,370 În acest șir folosind cod C? 690 00:27:56,370 --> 00:27:56,880 Da. 691 00:27:56,880 --> 00:27:58,780 >> Audiența: Fă pentru buclă [inaudibil] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 David J. MALAN: Perfect. 694 00:28:01,670 --> 00:28:02,900 Audiența: [inaudibil] 695 00:28:02,900 --> 00:28:03,310 David J. MALAN: Da. 696 00:28:03,310 --> 00:28:05,390 Doar folosi o buclă pentru sau o în timp ce buclă sau orice altceva. 697 00:28:05,390 --> 00:28:08,710 Dar se aplică doar ideea de bază că, dacă aceasta este o bucată de memorie sau un tablou 698 00:28:08,710 --> 00:28:11,590 și aceasta este, itera ambele în același timp. 699 00:28:11,590 --> 00:28:12,960 Și tocmai compara literele. 700 00:28:12,960 --> 00:28:14,260 >> Și tu trebuie să fii un puțin atent, pentru că 701 00:28:14,260 --> 00:28:16,247 Nu vreau un deget sa dribleze pe de altă parte 702 00:28:16,247 --> 00:28:18,080 pentru că un șir este mai mult decât celălalt. 703 00:28:18,080 --> 00:28:21,380 Deci, ai de gând să doriți să verificați pentru această valoare deosebită la sfârșitul anului, nul. 704 00:28:21,380 --> 00:28:24,017 Dar este într-adevăr, în final, la fel de simplu ca asta. 705 00:28:24,017 --> 00:28:26,100 Și sincer, nu avem nevoie de să reinventeze roata. 706 00:28:26,100 --> 00:28:27,960 Aici este versiunea a doua. 707 00:28:27,960 --> 00:28:32,910 Și ceea ce am de gând să spun aici este că în loc de a compara uri este egal = t, 708 00:28:32,910 --> 00:28:38,964 Eu în schimb să spun, dacă string comparație cu virgulă s t este egal cu = 0. 709 00:28:38,964 --> 00:28:40,130 Acum, ceea ce este compara șir? 710 00:28:40,130 --> 00:28:43,046 >> Se pare, este o funcție care vine cu C, al cărei scop în viață 711 00:28:43,046 --> 00:28:44,650 este de a compara doua siruri de caractere. 712 00:28:44,650 --> 00:28:48,300 Și se amestecă compara, dacă citim sale Pagina de om sau documentație sau CS50 713 00:28:48,300 --> 00:28:50,630 referință, se va pur și simplu să vă spun că se amestecă 714 00:28:50,630 --> 00:28:55,730 compara întoarce fie un negativ număr sau un număr pozitiv sau zero, 715 00:28:55,730 --> 00:28:57,660 unde înseamnă zero, ele sunt egale. 716 00:28:57,660 --> 00:28:58,570 >> Deci, doar presupuneri. 717 00:28:58,570 --> 00:29:00,390 Ce s-ar putea însemna dacă se amestecă întoarce comparare 718 00:29:00,390 --> 00:29:02,110 valoare negativă sau pozitivă de valoare? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 Audiența: Mai mare sau mai mic de. 721 00:29:04,285 --> 00:29:05,570 David J. MALAN: Da, mai mare sau mai mic de. 722 00:29:05,570 --> 00:29:08,640 Deci, dacă ai vrut să rezolve un întreg buchet de siruri de caractere într-un dictionary-- 723 00:29:08,640 --> 00:29:12,975 cum vom în cele din urmă în jos road-- Funcția perfect pentru a utiliza potențial, 724 00:29:12,975 --> 00:29:15,850 pentru ca va face asta comparație cu siruri de caractere pentru voi, și spune- 725 00:29:15,850 --> 00:29:20,060 tu nu o are, înainte de b, sau nu b veni înainte de o alfabetic. 726 00:29:20,060 --> 00:29:21,490 Putem face exact asta. 727 00:29:21,490 --> 00:29:23,620 >> Si observa am facut o alta lucru în acest exemplu. 728 00:29:23,620 --> 00:29:26,870 Ce altceva sa schimbat mare în această funcție principală? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 Și acest lucru este că alte minciună albă. 732 00:29:31,150 --> 00:29:33,750 În tot acest timp, când ai scris șir, 733 00:29:33,750 --> 00:29:38,350 am fost rescrierea secret șir de char *, astfel încât zăngănit de fapt 734 00:29:38,350 --> 00:29:39,270 te înțelege. 735 00:29:39,270 --> 00:29:42,450 >> Cu alte cuvinte, în CS50.h și cum vom vedea în cele din urmă, 736 00:29:42,450 --> 00:29:45,950 ne-am făcut un șir sinonim numit că e același lucru ca char *. 737 00:29:45,950 --> 00:29:49,910 Și acum, știu doar că *, În acest context, cel puțin, 738 00:29:49,910 --> 00:29:51,286 înseamnă adresa. 739 00:29:51,286 --> 00:29:52,210 >> Adresa de ce? 740 00:29:52,210 --> 00:29:56,390 Ei bine, faptul că i-am spus char *, și nu int * sau float *, 741 00:29:56,390 --> 00:30:00,820 înseamnă că char * este adresa unui char. 742 00:30:00,820 --> 00:30:06,770 Deci, acest mic cutie aici, alias șir, este într-adevăr de tip char *, 743 00:30:06,770 --> 00:30:10,490 care este pur și simplu un mod fantezist de a spune, în această casetă va merge o adresă. 744 00:30:10,490 --> 00:30:12,430 Și ce adresa se referă la? 745 00:30:12,430 --> 00:30:13,780 Aparent, un char. 746 00:30:13,780 --> 00:30:16,410 >> Dar am putut absolut au int * și alte lucruri. 747 00:30:16,410 --> 00:30:20,790 Dar pentru acum, char * este într-adevăr cel mai simplă și una de interes. 748 00:30:20,790 --> 00:30:23,310 Deci, această problemă se întâmplă să crească, deși, din nou. 749 00:30:23,310 --> 00:30:24,830 >> Să presupunem că am deschide acest program. 750 00:30:24,830 --> 00:30:27,670 Să vedem dacă acum putem prezice Ce e în neregulă cu acest cod. 751 00:30:27,670 --> 00:30:31,140 Deci, în acest program, copiați-0, sunt O să mergeți mai departe și de apel din nou 752 00:30:31,140 --> 00:30:34,190 GetString și stoca valoarea în s. 753 00:30:34,190 --> 00:30:38,800 >> Și apoi, de ce fac acest lucru, la fel ca un memento de săptămâna trecut? 754 00:30:38,800 --> 00:30:40,960 Noi am spus că getString uneori returneaza null. 755 00:30:40,960 --> 00:30:42,793 Ce înseamnă dacă GetString returneaza null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Ceva a mers prost. 758 00:30:46,034 --> 00:30:48,950 Este, probabil, înseamnă că șirul este prea mare, afară computerului de memorie. 759 00:30:48,950 --> 00:30:51,724 Se întâmplă super, super, super- rar, dar s-ar putea întâmpla. 760 00:30:51,724 --> 00:30:53,890 Vrem să verificați pentru ea, și asta e tot ce facem. 761 00:30:53,890 --> 00:30:57,910 >> Pentru că vom vedea acum, dacă tu nu faci începe verificarea în mod obișnuit pentru lucruri 762 00:30:57,910 --> 00:31:00,870 ca nul, s-ar putea de fapt începe să meargă 763 00:31:00,870 --> 00:31:03,106 la adrese din memorie care nu sunt valide. 764 00:31:03,106 --> 00:31:05,980 Și ai de gând să înceapă inducerea tot mai multe defecte de segmentare. 765 00:31:05,980 --> 00:31:08,360 Sau într-un Mac sau un PC, doar provocând un calculator pentru a închide 766 00:31:08,360 --> 00:31:10,340 sau un program de a îngheța, potențial. 767 00:31:10,340 --> 00:31:14,930 >> Deci, acum, eu susțin în copie-0.c, pe care am am de gând pentru a copia aceste siruri de caractere de drum 768 00:31:14,930 --> 00:31:15,685 de linia 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Și apoi, am de gând a pretinde în partea de jos 771 00:31:18,750 --> 00:31:21,430 aici că am de gând pentru a schimba una dintre ele. 772 00:31:21,430 --> 00:31:22,330 >> Deci, observa acest lucru. 773 00:31:22,330 --> 00:31:24,370 Am sunat vechiul nostru prieten strlen. 774 00:31:24,370 --> 00:31:28,960 Și explica în limba engleză ceea ce face această linie 34? 775 00:31:28,960 --> 00:31:32,480 Ce face t suport 0 reprezintă pe stânga. 776 00:31:32,480 --> 00:31:32,980 Da. 777 00:31:32,980 --> 00:31:34,339 >> Audiența: Primul caracter al t? 778 00:31:34,339 --> 00:31:35,880 David J. MALAN: Primul caracter de t. 779 00:31:35,880 --> 00:31:36,379 Asta este. 780 00:31:36,379 --> 00:31:40,024 Primul caracter al t, vreau pentru a atribui versiunea majuscule 781 00:31:40,024 --> 00:31:41,190 a primului caracter din t. 782 00:31:41,190 --> 00:31:43,200 Deci, acest lucru este valorificarea prima scrisoare. 783 00:31:43,200 --> 00:31:46,340 Și apoi, ultimul lucru pe care îl fac în acest program este ca eu pretind aici e 784 00:31:46,340 --> 00:31:50,340 originalul, e, și aici e copie, t. 785 00:31:50,340 --> 00:31:54,610 >> Dar, bazat pe povestea pe care tocmai a spus despre ce siruri de caractere sunt într-adevăr, 786 00:31:54,610 --> 00:31:57,520 ceea ce este într-adevăr linia 28 a face, și ceea ce este 787 00:31:57,520 --> 00:31:59,405 bug-ul rezultat va să fie pe ecran? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Deci, în primul rând, prima întrebare, 28. 790 00:32:03,500 --> 00:32:09,040 Ce se string t = i într-adevăr face? 791 00:32:09,040 --> 00:32:16,430 Dacă avem pe-stânga lateral aici șir t = s; 792 00:32:16,430 --> 00:32:19,400 care îmi dă o cutie aici și o cutie de aici. 793 00:32:19,400 --> 00:32:25,530 Și să presupunem că această adresă este 0x, să zicem, 50 de această dată, în mod arbitrar. 794 00:32:25,530 --> 00:32:28,847 Ce șir t = s face sub capota? 795 00:32:28,847 --> 00:32:30,340 >> Audiența: [inaudibil] 796 00:32:30,340 --> 00:32:34,100 >> David J. MALAN: Se stochează în memoria aborda acolo, deci 0x50 merge acolo. 797 00:32:34,100 --> 00:32:37,980 Deci, dacă acum, mă duc la primul caracter în t și majuscule ea, 798 00:32:37,980 --> 00:32:39,535 ceea ce fac eu în mod eficient la s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Fac într-adevăr același lucru, nu? 801 00:32:43,450 --> 00:32:47,680 Pentru că, dacă Adresa 0x50-- și doar, eu Nu avem prea mult loc pe placa de aici, 802 00:32:47,680 --> 00:32:51,750 dar presupun că acest lucru este 0x50 aici, undeva în memoria calculatorului meu. 803 00:32:51,750 --> 00:32:55,825 >> Si eu am, de exemplu, Gabe cu litere mici aici, ca aceasta. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Și am spus t suport 0 se capitalizate. 806 00:33:01,980 --> 00:33:04,860 Ei bine, t suport 0 este prima literă din t. 807 00:33:04,860 --> 00:33:07,840 Atât de puțin g se va deveni mare G. Dar problema 808 00:33:07,840 --> 00:33:09,410 este, ceea ce nu e de asemenea, punctul de? 809 00:33:09,410 --> 00:33:10,300 >> Audiența: La fel. 810 00:33:10,300 --> 00:33:11,841 >> David J. MALAN: exact același lucru. 811 00:33:11,841 --> 00:33:16,342 Deci, o explicație simplă, probabil, chiar dacă sintaxa este un pic ciudat. 812 00:33:16,342 --> 00:33:17,050 Deci, hai sa facem acest lucru. 813 00:33:17,050 --> 00:33:20,210 Asigurați-copie 0 și apoi ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Spune ceva: Gabe. 816 00:33:24,110 --> 00:33:26,760 Și, din păcate, atât de le-au fost capitalizate, 817 00:33:26,760 --> 00:33:29,500 dar pentru că la baza motiv pentru care suntem pur și simplu 818 00:33:29,500 --> 00:33:32,350 acum de-a face cu adrese. 819 00:33:32,350 --> 00:33:36,470 >> Deci, cum putem începe să address-- nr joc de cuvinte intended-- 820 00:33:36,470 --> 00:33:39,270 cum putem incepe sa abordeze această problemă special? 821 00:33:39,270 --> 00:33:44,400 Ei bine, în copy1.c, lucrurile merg pentru a obține un pic mai complicat. 822 00:33:44,400 --> 00:33:49,310 Dar mi-ar pretinde o soluție conceptual simplu. 823 00:33:49,310 --> 00:33:50,852 >> Atât de greu pentru a ajunge la prima vedere. 824 00:33:50,852 --> 00:33:53,560 Nu va fi ușor pentru primul dată când îl introduceți în, probabil, 825 00:33:53,560 --> 00:33:57,440 dar dacă problema este că pur și simplu a face t = s doar 826 00:33:57,440 --> 00:33:59,694 exemplare adresa, ceea ce, din nou, în cazul în care pot alege pe tine, 827 00:33:59,694 --> 00:34:02,110 va fi solutia pentru copierea de fapt un șir? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> Audiența: Vom probabil folosi din nou o buclă. 830 00:34:06,770 --> 00:34:06,890 >> David J. MALAN: Da. 831 00:34:06,890 --> 00:34:08,390 Deci, vom avea nevoie din nou de o buclă. 832 00:34:08,390 --> 00:34:11,800 Și pentru că, dacă vrem să copiați o s șir într-un alt șir, 833 00:34:11,800 --> 00:34:14,120 probabil vrem să o facem caracter cu caracter. 834 00:34:14,120 --> 00:34:17,199 Dar problema este, în cazul în care aceasta este originar s, 835 00:34:17,199 --> 00:34:22,159 acum avem nevoie pentru a începe în mod explicit alocarea de memorie pentru t. 836 00:34:22,159 --> 00:34:24,320 >> Cu alte cuvinte, să redesena aceasta ultima dată. 837 00:34:24,320 --> 00:34:28,659 În cazul în care acest lucru este șir s = getString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Și să punem asta aici, de asemenea. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Acest lucru este getString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Și apoi, imaginea de ceva așa va fi ca înainte, 844 00:34:43,860 --> 00:34:44,360 g-a-b-e-/ 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Pare ceva de genul asta. 847 00:34:48,960 --> 00:34:53,650 Și s de aceea, noi numim acest 0x50, și că va fi 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Deci, aceasta este 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Și apoi, eu fac șir t. 851 00:34:59,690 --> 00:35:02,450 În memorie, care este doar de gând să da-mi un pic de pătrat ca asta. 852 00:35:02,450 --> 00:35:04,080 Deci care este pasul cheie acum? 853 00:35:04,080 --> 00:35:09,870 Dacă vreau să copiați s în t, ceea ce gol ce avem nevoie pentru a umple aici? 854 00:35:09,870 --> 00:35:12,050 Sau de ce avem nevoie pentru a face la un nivel înalt? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Da? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Cineva? 859 00:35:17,020 --> 00:35:17,690 Da. 860 00:35:17,690 --> 00:35:19,214 >> Audiența: Avem nevoie de [neauzit]. 861 00:35:19,214 --> 00:35:21,380 David J. MALAN: Da, ne-am Trebuie să completați acest gol. 862 00:35:21,380 --> 00:35:24,340 Eu nu pot copia și apoi valorifica Numele lui Gabe 863 00:35:24,340 --> 00:35:28,120 până când am cere sistemul de operare pentru un alt segment de memorie 864 00:35:28,120 --> 00:35:30,640 care este cel puțin la fel de mare ca și originalul. 865 00:35:30,640 --> 00:35:32,130 Așa că ne lasă cu o întrebare. 866 00:35:32,130 --> 00:35:36,080 >> Cum pot cere sistemul de operare nu doar pentru un simplu mic pointer-- 867 00:35:36,080 --> 00:35:38,530 ca aceasta se numește, o adresă, o pointer-- nu 868 00:35:38,530 --> 00:35:40,980 pentru o cutie simplă puțin ca aceasta numit un șir? 869 00:35:40,980 --> 00:35:44,200 Cum pot întreba de operare sistem pentru o mare parte din memorie? 870 00:35:44,200 --> 00:35:48,430 Până acum, am primit doar că înapoi indirect prin apel getString. 871 00:35:48,430 --> 00:35:50,740 Deci, cum este getString chiar obtinerea memoria sa? 872 00:35:50,740 --> 00:35:53,430 >> Ei bine, se pare că nu există această altă funcție aici 873 00:35:53,430 --> 00:35:55,160 că vom începe acum să folosească. 874 00:35:55,160 --> 00:35:59,780 Acum, acest lucru pare than-- mod mai criptic și eu sunt singurul care poate vedea it-- 875 00:35:59,780 --> 00:36:03,150 această linie pare mult mai criptic atunci ar trebui la prima vedere. 876 00:36:03,150 --> 00:36:04,650 Dar să-l tachineze pe langa. 877 00:36:04,650 --> 00:36:07,950 >> Pe partea stângă, am char * t. 878 00:36:07,950 --> 00:36:13,280 Deci, în limba engleză, să începem să formuleze Exemple adecvate în jargonul tehnic. 879 00:36:13,280 --> 00:36:19,757 Deci, aceasta este alocarea unui variabila de tip char * numit t. 880 00:36:19,757 --> 00:36:21,090 Acum, ce înseamnă de fapt acest lucru? 881 00:36:21,090 --> 00:36:23,881 >> Ei bine, asta înseamnă că, ceea ce am de gând pentru a pune în această variabilă numită t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 O adresă de un char. 884 00:36:26,402 --> 00:36:28,360 Deci, asta e doar cel mai simplu, mai mult mod rezonabil 885 00:36:28,360 --> 00:36:29,930 a descrie partea stângă. 886 00:36:29,930 --> 00:36:32,890 Deci, care creează această casetă aici numai. 887 00:36:32,890 --> 00:36:34,760 Deci, partea dreaptă, probabil, se va 888 00:36:34,760 --> 00:36:37,170 să aloce că mai mare bucată de memorie cum? 889 00:36:37,170 --> 00:36:38,340 Așa că haideți să tachineze acest afară. 890 00:36:38,340 --> 00:36:41,131 >> E copleșitor, la prima vedere, dar ceea ce se întâmplă în interiorul aici? 891 00:36:41,131 --> 00:36:43,740 În primul rând, nu e malloc, care este aparent noul nostru prieten, 892 00:36:43,740 --> 00:36:45,450 "Memorie aloca." 893 00:36:45,450 --> 00:36:49,560 Deci, acesta este argumentul fiind trecut în ea, așa că este un argument destul de mare. 894 00:36:49,560 --> 00:36:50,970 Așa că haideți să tachineze acest afară. 895 00:36:50,970 --> 00:36:53,410 >> strlen de s, desigur, reprezintă Cel-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Audiența: Numărul de caractere. 898 00:36:55,600 --> 00:36:56,710 David J. MALAN: Doar Numărul de caractere din s. 899 00:36:56,710 --> 00:36:59,040 Astfel lungimea s, șirul original. 900 00:36:59,040 --> 00:37:00,350 Deci G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Deci, este, probabil, patru în acest caz. 902 00:37:02,320 --> 00:37:05,485 De ce fac una după apel strlen de s? 903 00:37:05,485 --> 00:37:06,360 Audiența: [inaudibil] 904 00:37:06,360 --> 00:37:07,590 David J. MALAN: Pentru că caracter nul special. 905 00:37:07,590 --> 00:37:11,260 Dacă mă întrebați pe mine ce-i durata de Numele lui Gabe, am de gând să spun patru. 906 00:37:11,260 --> 00:37:14,480 Sub capota, deși, am nevoie de că al cincilea octet pentru caracterul nul. 907 00:37:14,480 --> 00:37:16,100 De aceea fac un. 908 00:37:16,100 --> 00:37:21,730 >> Acum, doar în cazul în care se execută acest Programul pe un alt calculator decât, să zicem, 909 00:37:21,730 --> 00:37:24,610 aparatul CS50, în cazul în care dimensiunea unui char 910 00:37:24,610 --> 00:37:26,350 pot fi diferite din propria mea computer-- 911 00:37:26,350 --> 00:37:30,590 se dovedește că eu pot suna la acest Operatorul sizeof, cere doar computerul, 912 00:37:30,590 --> 00:37:32,870 ceea ce este de mărimea unui char pe acest calculator? 913 00:37:32,870 --> 00:37:37,400 >> Și prin înmulțirea cinci în acest exemplu de dimensiunea unei char, care 914 00:37:37,400 --> 00:37:40,440 pe majoritatea calculatoarelor se va doar unul, malloc 915 00:37:40,440 --> 00:37:44,830 se va aloca pentru mine acest mare bucată de memorie pe aici pe dreapta. 916 00:37:44,830 --> 00:37:47,140 Și o să revenim acesta este un function-- asa ca este 917 00:37:47,140 --> 00:37:48,265 O să se întoarcă la mine ce? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 Audiența: Adresa? 920 00:37:51,830 --> 00:37:53,709 David J. MALAN: Adresa de ce? 921 00:37:53,709 --> 00:37:55,250 Audiența: Din memoria este alocată? 922 00:37:55,250 --> 00:37:56,450 David J. MALAN: Din memorie este alocată. 923 00:37:56,450 --> 00:37:59,189 Deci, nu am nici o idee, sincer, în cazul în care acest lucru se va termina. 924 00:37:59,189 --> 00:38:01,480 Am de gând să propună se va ajunge la 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Complet arbitrar, ci în altă parte decât 0x50, 927 00:38:06,009 --> 00:38:08,800 deoarece sistemul de operare, ceea ce Windows și Mac OS face pentru mine, este 928 00:38:08,800 --> 00:38:11,230 asigurați-vă că ea dă ma diferite bucăți de RAM. 929 00:38:11,230 --> 00:38:14,210 >> Deci, aceasta este valoarea în cazul în care acest lucru bucată de memorie s-ar putea ajunge. 930 00:38:14,210 --> 00:38:16,060 Deci, asta este ceea ce se termină aici, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Deci, acum, în mod clar, eu pot înțelege că acest lucru nu este la fel ca aceasta, 933 00:38:21,570 --> 00:38:23,960 deoarece acestea sunt îndreptat la diferite bucăți de memorie. 934 00:38:23,960 --> 00:38:29,980 Deci, dacă am acum de fapt, vreau să copiați acest în, hai să facem soluția propusă. 935 00:38:29,980 --> 00:38:36,870 >> Să mergem, de a crea o buclă pentru, și de a face t suport i se s suport i. 936 00:38:36,870 --> 00:38:39,760 Pentru că acum pot folosi această notație-matrice ca, 937 00:38:39,760 --> 00:38:43,390 deoarece chiar dacă malloc foarte generic mă alocă memorie, 938 00:38:43,390 --> 00:38:45,290 memorie este doar bytes învecinate. 939 00:38:45,290 --> 00:38:47,240 Byte, octet, octet, spate în spate la spate. 940 00:38:47,240 --> 00:38:50,030 >> Pot cu siguranță ca un programator trata ca pe o matrice, care 941 00:38:50,030 --> 00:38:55,090 înseamnă că pot folosi acest final, familiar notație de doar câteva paranteze pătrate. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Deci, permiteți-mi să pauză acolo, pentru că aceasta este mult dintr-o dată, chiar 944 00:39:00,020 --> 00:39:03,530 deși ideea de bază a recapitulare este că șir, în tot acest timp, 945 00:39:03,530 --> 00:39:05,550 nu este un nou tip de date în sine. 946 00:39:05,550 --> 00:39:10,150 E doar un așa-numit pointer, o adresă a unui caracter, 947 00:39:10,150 --> 00:39:12,650 ceea ce înseamnă doar că e un număr care prin convenție umană 948 00:39:12,650 --> 00:39:15,350 avem tendința de a scrie ca 0x ceva. 949 00:39:15,350 --> 00:39:18,590 >> Dar este doar un număr, ca 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 care se întâmplă să fie Adresa CS clădiri. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Orice întrebări cu privire la aceste detalii? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Da? 955 00:39:25,289 --> 00:39:28,530 >> Audiența: De ce verifica pentru t egal la null? 956 00:39:28,530 --> 00:39:30,740 >> David J. MALAN: De ce nu ne-am verifica pentru t egal la null? 957 00:39:30,740 --> 00:39:33,250 Dacă citim documentation-- mare intrebare pentru malloc, 958 00:39:33,250 --> 00:39:37,020 se va spune în imprimare amenzii, uneori malloc s-ar putea intoarce null, 959 00:39:37,020 --> 00:39:38,080 la fel ca getString. 960 00:39:38,080 --> 00:39:41,820 Și într-adevăr, getString returneaza null în cazul în care, la rândul său, malloc returnează null, 961 00:39:41,820 --> 00:39:43,130 deoarece getString utilizează malloc. 962 00:39:43,130 --> 00:39:46,400 >> Și asta s-ar putea întâmpla în cazul în care sistemul de operare, Mac OS, Windows, orice, este pur și simplu 963 00:39:46,400 --> 00:39:48,130 din memorie pentru tine. 964 00:39:48,130 --> 00:39:49,820 Deci, asta e ceea ce sa întâmplat acolo. 965 00:39:49,820 --> 00:39:52,910 >> Și lasă-mă să dezvălui un alt lucru care s-ar putea sufla doar mintea ta 966 00:39:52,910 --> 00:39:55,100 sau complet să fie prea departe peste linie. 967 00:39:55,100 --> 00:39:59,770 Dar permiteți-mi să trag în sus aceeași pentru bucla de copiere, 968 00:39:59,770 --> 00:40:05,480 care în urmă cu o clipă, rechemare a fost aceasta. t suport i se s suport i. 969 00:40:05,480 --> 00:40:06,740 >> Frumos și ușor de utilizat. 970 00:40:06,740 --> 00:40:09,330 Se simte ca doua saptamani din nou. 971 00:40:09,330 --> 00:40:14,920 Dar această versiune de fapt, poate fi rescrisă ca aceasta, care pare criptic. 972 00:40:14,920 --> 00:40:18,280 Este o tehnica numita pointer aritmetică, adresa aritmetică. 973 00:40:18,280 --> 00:40:19,600 Dar de ce face acest lucru? 974 00:40:19,600 --> 00:40:22,220 >> Acum enervant, autori de C a decis să introducă 975 00:40:22,220 --> 00:40:25,070 simbolul * pentru diferite scopuri. 976 00:40:25,070 --> 00:40:29,020 Am văzut o dată folosit deja, char *, care înseamnă "da-mi o variabilă 977 00:40:29,020 --> 00:40:31,210 care va conține adresa unui char. " 978 00:40:31,210 --> 00:40:33,990 * Deci, char în acest context înseamnă "da-mi o variabilă." 979 00:40:33,990 --> 00:40:40,050 >> Din păcate, dacă utilizați * fără un cuvânt în fața ei, cum ar fi char, 980 00:40:40,050 --> 00:40:41,905 aceasta se numește acum operatorul dereference. 981 00:40:41,905 --> 00:40:43,530 Și vom vedea mai mult de acest lucru înainte de mult. 982 00:40:43,530 --> 00:40:44,930 Dar aceasta înseamnă doar "du-te acolo." 983 00:40:44,930 --> 00:40:49,070 E ca si cum spune, dacă cineva mi-a dat pe o bucată de hârtie "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 dacă fac "* 33 Oxford Street," care înseamnă "Du-te pe drumul spre clădirea CS." 985 00:40:53,830 --> 00:40:57,220 >> Deci * înseamnă doar du-te acolo, dacă nu există nici un cuvânt în fața lui. 986 00:40:57,220 --> 00:40:59,100 Deci, ce este t, pentru a fi clar? 987 00:40:59,100 --> 00:41:03,250 t este adresa bucată de memorie care a fost dat înapoi la mine. 988 00:41:03,250 --> 00:41:06,650 s este adresa de ceea ce, să fie clar, în exemplul de care am discutat, 989 00:41:06,650 --> 00:41:07,500 de Gabe litere mici? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s este adresa de-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 Audiența: Șirul. 994 00:41:12,460 --> 00:41:14,126 David J. MALAN: De numele original al lui Gabe. 995 00:41:14,126 --> 00:41:16,660 Deci, este adresa de această bucată de memorie. 996 00:41:16,660 --> 00:41:22,220 Deci, dacă eu spun t + Eu-- i, aviz, este doar vechiul nostru prieten. 997 00:41:22,220 --> 00:41:24,770 E doar o variabilă index care este iterarea de la zero pe sus 998 00:41:24,770 --> 00:41:26,960 cu lungimea șir s. 999 00:41:26,960 --> 00:41:30,367 Deci, va fi zero, atunci una, apoi două, apoi trei, apoi patru. 1000 00:41:30,367 --> 00:41:33,200 Deci, haideți să adune aceste noi Piese de puzzle-Scratch ca, daca vreti, 1001 00:41:33,200 --> 00:41:36,140 deși, din nou, sintaxa este mult mai arcane decât zero. 1002 00:41:36,140 --> 00:41:39,522 Deci t este o adresă + i este de gând să-mi dea 1003 00:41:39,522 --> 00:41:42,480 un număr, pentru că acestea sunt toate Numerele pe care le-am desenat ca hex. 1004 00:41:42,480 --> 00:41:43,560 Dar sunt doar numere. 1005 00:41:43,560 --> 00:41:49,960 >> Deci, în cazul în care adresa de t-am spus a fost 0x88, ceea ce este 0x88 plus zero. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Chiar dacă nu sunteți confortabil cu hex încă, să ia o presupunere. 1008 00:41:53,980 --> 00:41:54,410 >> Audiența: Originalul. 1009 00:41:54,410 --> 00:41:55,850 >> David J. MALAN: Încă 0x88. 1010 00:41:55,850 --> 00:41:58,910 Deci, ce * 0x88 înseamnă? 1011 00:41:58,910 --> 00:42:02,670 Aceasta înseamnă, "du-te acolo", ceea ce înseamnă în mod eficient, "a pus degetul aici." 1012 00:42:02,670 --> 00:42:06,930 Și acum pe partea dreaptă a această expresie, * și apoi în parens, 1013 00:42:06,930 --> 00:42:11,586 s + i înseamnă s, care este aborda aici de mic g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 este, desigur, s, oricare ar fi s este. 1015 00:42:16,220 --> 00:42:21,230 >> Deci, acum, e s *, care la fel ca * 33 Oxford Street înseamnă a merge la adresa 1016 00:42:21,230 --> 00:42:22,010 uri. 1017 00:42:22,010 --> 00:42:24,170 Deci, aici e deget, mâna dreaptă. 1018 00:42:24,170 --> 00:42:26,050 Deci, ce am de gând să copieze în ce? 1019 00:42:26,050 --> 00:42:30,260 Lucrul pe dreapta, care este Gabe, mic g aici, în aici. 1020 00:42:30,260 --> 00:42:32,750 >> Și astfel efectul de care prima iterație a buclei, 1021 00:42:32,750 --> 00:42:36,200 cum ai cerut, chiar dacă se pare nebun mai complicat decât orice 1022 00:42:36,200 --> 00:42:42,110 am văzut înainte, se spune pur și simplu du-te aici și copia acel caracter aici. 1023 00:42:42,110 --> 00:42:44,700 Este oferindu-vă o hartă de ambele locații. 1024 00:42:44,700 --> 00:42:46,130 >> Și vom vedea mult mai mult de acest lucru. 1025 00:42:46,130 --> 00:42:50,600 Dar pentru acum, speranța este doar de a introduce unele dintre aceste idei de bază. 1026 00:42:50,600 --> 00:42:53,550 Și într-adevăr, să ne uităm la un program de finală aici, 1027 00:42:53,550 --> 00:42:57,480 și apoi claymation promis, care va face totul în regulă. 1028 00:42:57,480 --> 00:42:57,980 În regulă. 1029 00:42:57,980 --> 00:43:01,680 Așa că lasă-mă să deschid up-- acolo mergem. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Așa că haideți să mine-- vom reveni la această imagine înainte de mult timp. 1032 00:43:05,440 --> 00:43:08,360 Lasă-mă să deschid acest ultim exemplu aici. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Deci, aici este o super, super program care realizează 1035 00:43:12,710 --> 00:43:15,050 nimic în viață care face următoarele. 1036 00:43:15,050 --> 00:43:18,740 Ea declară primele două variabile, x și y, care nu sunt numere de această dată, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 Ei nu sunt numere întregi, în sine. 1039 00:43:20,448 --> 00:43:22,899 Ele sunt aparent int *. 1040 00:43:22,899 --> 00:43:25,690 Deci oricine, ceea ce înseamnă dacă tipul de date, variabila, 1041 00:43:25,690 --> 00:43:26,860 este de tip int * stea? 1042 00:43:26,860 --> 00:43:30,240 Asta e adresa de int. 1043 00:43:30,240 --> 00:43:31,990 >> Deci, nu am nici o idee unde este încă. 1044 00:43:31,990 --> 00:43:35,150 Aceasta înseamnă doar "a pus, în cele din urmă, adresa de int aici. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, ori de câte ori este în memorie, o adresă se întâmplă acolo. 1046 00:43:38,340 --> 00:43:40,200 Și asta e ceea ce y este Va fi, de asemenea. 1047 00:43:40,200 --> 00:43:44,920 >> Dacă spun acum x = malloc (sizeof (int)), acesta este un mod fantezist de a spune, 1048 00:43:44,920 --> 00:43:49,000 hei sistem de operare, prin malloc, da-mi suficientă memorie pentru dimensiunea 1049 00:43:49,000 --> 00:43:52,370 de un întreg, care este, probabil, va fi de 32 biți sau patru bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Deci, ce se întoarce malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc returnează o adresă. 1052 00:43:55,250 --> 00:43:57,020 Deci, ceea ce se va primi stocate în x? 1053 00:43:57,020 --> 00:44:00,600 Adresa de bucată de memorie, cele patru bytes, că malloc 1054 00:44:00,600 --> 00:44:03,360 doar găsite pentru mine, cerându sistemul de operare. 1055 00:44:03,360 --> 00:44:08,240 >> Acum între timp, linie patru aici, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Doar pentru a fi clar, Ce se întâmplă acolo jos? 1057 00:44:09,990 --> 00:44:11,530 Pe partea stângă, * x. 1058 00:44:11,530 --> 00:44:13,610 asta e ca * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Deci * x înseamnă ce? 1060 00:44:15,523 --> 00:44:16,450 >> Audiența: Du-te la. 1061 00:44:16,450 --> 00:44:17,908 >> David J. MALAN: Du-te la acea adresă. 1062 00:44:17,908 --> 00:44:20,466 Ori de câte ori că bucata de memorie este, du-te la ea. 1063 00:44:20,466 --> 00:44:21,979 Și a pus ceea ce acolo, în mod evident? 1064 00:44:21,979 --> 00:44:22,520 Audiența: 42. 1065 00:44:22,520 --> 00:44:23,580 David J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Bine, * y, aceeași idee. 1067 00:44:25,650 --> 00:44:26,860 Du-te la adresa din y. 1068 00:44:26,860 --> 00:44:31,740 Pune numărul 13 acolo, dar ceea ce este si in acest moment? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 Audiența: Nu există nici o memorie de y. 1071 00:44:34,630 --> 00:44:35,710 David J. MALAN: Nu este nici o memorie de y. 1072 00:44:35,710 --> 00:44:38,215 Deci, ce face, probabil, y conține, așa cum ne-am spus? 1073 00:44:38,215 --> 00:44:38,520 >> Audiența: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> David J. MALAN: O valoare gunoi. 1075 00:44:39,480 --> 00:44:41,320 Acum, valoarea gunoi este încă un număr. 1076 00:44:41,320 --> 00:44:43,160 Ea poate fi totuși confundată cu o adresă. 1077 00:44:43,160 --> 00:44:45,160 E ca și cum cineva mâzgălit ceva în jos, 1078 00:44:45,160 --> 00:44:48,002 și l-am interpretat în sensul unele clădiri pe stradă. 1079 00:44:48,002 --> 00:44:50,460 Și dacă încearcă să meargă în unele clădiri nu vă aparține, 1080 00:44:50,460 --> 00:44:53,710 sau unele bucată de memorie nu au a fost dat, lucruri rele s-ar putea întâmpla. 1081 00:44:53,710 --> 00:44:57,740 Computer-ar putea prăbuși, sau un alt Comportamentul nedeterminata s-ar putea întâmpla. 1082 00:44:57,740 --> 00:45:01,310 >> Deci intro, apoi, la Binky este aceasta. 1083 00:45:01,310 --> 00:45:04,290 Încă îmi amintesc, 20 câțiva ani mai târziu ciudat, 1084 00:45:04,290 --> 00:45:07,200 unde am fost când am în cele din urmă înțeles indicii. 1085 00:45:07,200 --> 00:45:09,520 >> Ceea ce este de spus, dacă pleca de aici în trei minute 1086 00:45:09,520 --> 00:45:12,170 și cred că eu nu fac înțelege indicii, realiza 1087 00:45:12,170 --> 00:45:14,410 Am amintit de 20 ani pentru un motiv oarecare nebun 1088 00:45:14,410 --> 00:45:17,140 când și de ce în cele din urmă sa scufundat în, de zi cu învățătura mea 1089 00:45:17,140 --> 00:45:19,501 colegi, Nishat Mehta în înapoi de Eliot sala de mese. 1090 00:45:19,501 --> 00:45:21,250 Acum, mi-am amintit acest lucru, deoarece acest lucru a fost 1091 00:45:21,250 --> 00:45:23,920 unul dintre subiectele I, în special, sa luptat cu. 1092 00:45:23,920 --> 00:45:26,470 Și apoi, în cele din urmă a făcut clic, ca și cum aș îndrăzni să spun o mulțime de subiecte 1093 00:45:26,470 --> 00:45:27,460 în cele din urmă o va face. 1094 00:45:27,460 --> 00:45:32,590 Iar acum, pentru a face ca simt mai fericit și mai convingătoare, 1095 00:45:32,590 --> 00:45:35,360 haideți să aruncăm o privire finală în nostru ultimele trei minute aici la Binky, 1096 00:45:35,360 --> 00:45:37,675 de la prietenul nostru, Nick Parlante de la Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO PLAYBACK] 1099 00:45:41,580 --> 00:45:42,750 >> Hei, Binky. 1100 00:45:42,750 --> 00:45:43,500 Treziți-vă! 1101 00:45:43,500 --> 00:45:45,960 E timpul pentru distracție pointer. 1102 00:45:45,960 --> 00:45:47,012 >> Ce-i asta? 1103 00:45:47,012 --> 00:45:48,723 Aflați mai multe despre indicii? 1104 00:45:48,723 --> 00:45:50,580 Ce bine! 1105 00:45:50,580 --> 00:45:53,563 >> Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Acest cod alocă două indicii, care pot indica numere întregi. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Ei bine, eu văd cele două indicii, dar ele nu par a fi îndreptat la nimic. 1110 00:46:02,140 --> 00:46:02,980 >> Asta-i drept. 1111 00:46:02,980 --> 00:46:05,100 Inițial, indicii nu indică nimic. 1112 00:46:05,100 --> 00:46:08,030 Lucrurile pe care le indica sunt numite pointees, și a le propune lui 1113 00:46:08,030 --> 00:46:09,370 o etapă separată. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, da, corect. 1115 00:46:10,220 --> 00:46:10,950 Știam că. 1116 00:46:10,950 --> 00:46:12,385 Cele pointees sunt separate. 1117 00:46:12,385 --> 00:46:14,315 Er, așa cum a face tu aloca un pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Ei bine, acest cod alocă un nou pointee întreg, 1121 00:46:18,970 --> 00:46:20,950 și acest seturi de piese x pentru a indica spre el. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hei, care arată mai bine. 1124 00:46:23,230 --> 00:46:25,060 Deci, face o fac ceva. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Voi dereference indicatorul x la stocați numărul 42 în pointee sale. 1127 00:46:30,455 --> 00:46:32,830 Pentru acest truc, am nevoie meu Magic Wand de dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> Tău Magic Wand de dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Asta-- asta e minunat. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Asta este ceea ce codul pare. 1134 00:46:41,080 --> 00:46:44,110 Voi doar înființat numărul, și [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hei, uite. 1136 00:46:44,700 --> 00:46:46,140 Nu merge. 1137 00:46:46,140 --> 00:46:50,980 >> Deci a face o dereference pe x urmează săgeata pentru a accesa pointee sale. 1138 00:46:50,980 --> 00:46:53,160 În acest caz, un magazin de 42 de acolo. 1139 00:46:53,160 --> 00:46:57,710 Hei, încercați să utilizați-l pentru a stoca numărul 13 prin cealaltă indicatorul, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Mă duc doar aici la y, și pentru a obține numărul 13 set up. 1142 00:47:03,270 --> 00:47:07,930 Și apoi, ia Bagheta de Dereferencing și doar [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hei! 1145 00:47:09,500 --> 00:47:11,090 Asta nu a mers. 1146 00:47:11,090 --> 00:47:15,630 Spune, Binky, nu cred că dereferencing y este o idee bună, pentru că știi, 1147 00:47:15,630 --> 00:47:17,850 înființarea pointee este o etapă separată. 1148 00:47:17,850 --> 00:47:20,450 Și nu cred că am făcut-o vreodată. 1149 00:47:20,450 --> 00:47:21,480 >> Punct Bună. 1150 00:47:21,480 --> 00:47:21,980 Da. 1151 00:47:21,980 --> 00:47:25,680 Am alocat y pointer, dar ne-am nu-l setat pentru a indica o pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> Foarte atent. 1154 00:47:28,616 --> 00:47:30,240 Hei, arăți bine acolo, Binky. 1155 00:47:30,240 --> 00:47:33,400 Poți să-l repari, astfel încât punctele de y la aceeași pointee ca x? 1156 00:47:33,400 --> 00:47:34,000 >> Sigur. 1157 00:47:34,000 --> 00:47:36,780 Voi folosi Magic Wand meu de Pointer Atribuire. 1158 00:47:36,780 --> 00:47:38,740 >> -E Care va fi o problemă ca înainte? 1159 00:47:38,740 --> 00:47:39,240 Nu. 1160 00:47:39,240 --> 00:47:40,660 Acest lucru nu atinge pointees. 1161 00:47:40,660 --> 00:47:44,450 Se schimbă doar un pointer la indica acelasi lucru ca un alt. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, văd. 1163 00:47:45,450 --> 00:47:48,200 Acum puncte y în același loc ca x. 1164 00:47:48,200 --> 00:47:48,910 Deci, așteptați. 1165 00:47:48,910 --> 00:47:49,950 Acum, y este fix. 1166 00:47:49,950 --> 00:47:51,120 Ea are o pointee. 1167 00:47:51,120 --> 00:47:54,510 Astfel, puteți încerca Bagheta de Dereferencing din nou pentru a trimite peste 13 ani. 1168 00:47:54,510 --> 00:47:56,510 >> Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Aici merge. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hei, uita-te la asta. 1171 00:47:59,340 --> 00:48:00,750 Acum dereferencing lucrări pe y. 1172 00:48:00,750 --> 00:48:04,991 Și pentru că indicii sunt de partajare că unul pointee, amândoi vedea 13. 1173 00:48:04,991 --> 00:48:05,490 Da. 1174 00:48:05,490 --> 00:48:06,870 Schimbul, indiferent de. 1175 00:48:06,870 --> 00:48:08,820 Deci, vom schimba locurile acum? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, uite. 1177 00:48:09,440 --> 00:48:10,830 Nu mai avem timp. 1178 00:48:10,830 --> 00:48:11,570 >> -Dar 1179 00:48:11,570 --> 00:48:13,530 >> Doar amintiți-vă cele trei reguli indicatorul. 1180 00:48:13,530 --> 00:48:16,560 Number One, structura de bază este că veți avea un pointer, 1181 00:48:16,560 --> 00:48:18,680 și-l arată pe de o pointee. 1182 00:48:18,680 --> 00:48:20,640 Dar indicatorul și pointee sunt separate, 1183 00:48:20,640 --> 00:48:22,610 și eroarea comună este de a crea un pointer, 1184 00:48:22,610 --> 00:48:25,000 dar a uitat să-i dea un pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Number Two, pointer dereferencing pornește de la indicatorul 1186 00:48:28,170 --> 00:48:31,050 și urmează săgeata peste pentru a accesa pointee acestuia. 1187 00:48:31,050 --> 00:48:33,400 După cum știm cu toții, această funcționează doar dacă există 1188 00:48:33,400 --> 00:48:36,270 o pointee, ce fel de se întoarce la regula numărul unu. 1189 00:48:36,270 --> 00:48:39,000 >> Numărul Trei, pointer cesiune are un pointer 1190 00:48:39,000 --> 00:48:42,320 și se schimbă pentru a indica același pointee ca un alt indicator. 1191 00:48:42,320 --> 00:48:44,160 Deci, după atribuirea, cele două indicii 1192 00:48:44,160 --> 00:48:45,910 va indica la aceeași pointee. 1193 00:48:45,910 --> 00:48:47,990 Uneori, aceasta se numește partajare. 1194 00:48:47,990 --> 00:48:49,740 Și asta e tot acolo este să-l, într-adevăr. 1195 00:48:49,740 --> 00:48:50,277 La revedere acum. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO PLAYBACK] 1197 00:48:51,110 --> 00:48:52,568 David J. MALAN: Asta e pentru CS50. 1198 00:48:52,568 --> 00:48:55,110 Ne vedem săptămâna viitoare. 1199 00:48:55,110 --> 00:48:56,064