1 00:00:00,000 --> 00:00:03,395 >> [MUSIC JOC] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 David J. MALAN: Acest lucru este ca un seminar student în anul întâi de azi. 4 00:00:13,280 --> 00:00:14,060 BINE. 5 00:00:14,060 --> 00:00:15,024 Deci, foarte ploios afară. 6 00:00:15,024 --> 00:00:17,690 Acest lucru tinde să se întâmple în zilele de miercuri, dar cu atât mai mult posibilitatea de 7 00:00:17,690 --> 00:00:18,700 Pentru întrebări astăzi. 8 00:00:18,700 --> 00:00:22,210 Așa că haideți să începem de fapt cu filmul intr-o clipa. 9 00:00:22,210 --> 00:00:24,560 Dar vom începe grandios ca întotdeauna. 10 00:00:24,560 --> 00:00:28,000 >> Aceasta este CS50, iar acest lucru este sfârșitul săptămânii 4. 11 00:00:28,000 --> 00:00:30,820 Deci, dacă am privit vreodată TV sau un film în care 12 00:00:30,820 --> 00:00:34,690 există unii experți în informatică și poliție, sau FBI-ul, sau o agenție 13 00:00:34,690 --> 00:00:36,930 este încercarea de a captura unele adversar, ei bine, ai 14 00:00:36,930 --> 00:00:40,850 probabil a auzit expresia "spori" prin care într-un fel tehnician 15 00:00:40,850 --> 00:00:44,750 magic mărește în infinit departe pentru a vedea criminali 16 00:00:44,750 --> 00:00:48,640 de identitate sau numărul de înmatriculare în chiar stralucirea unei oglinzi 17 00:00:48,640 --> 00:00:50,390 sau sclipirea ochilor cuiva. 18 00:00:50,390 --> 00:00:55,196 Deci, într-adevăr, haideți să aruncăm o privire la cateva astfel de scene de la Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -OK, Acum sa trecem o privire la tine. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Ține-l. 23 00:01:07,415 --> 00:01:08,267 Executați înapoi. 24 00:01:08,267 --> 00:01:09,121 >> -Asteapta un minut. 25 00:01:09,121 --> 00:01:11,300 Faceți dreapta. 26 00:01:11,300 --> 00:01:12,209 >> -Nu, Congela asta. 27 00:01:12,209 --> 00:01:12,750 -Ecran complet. 28 00:01:12,750 --> 00:01:13,558 -OK, Congela asta. 29 00:01:13,558 --> 00:01:14,820 -Tighten Pe care, vrei? 30 00:01:14,820 --> 00:01:16,530 -Vector În care pe tip de roata din spate. 31 00:01:16,530 --> 00:01:19,400 -Zoom În chiar aici, pe acest loc. 32 00:01:19,400 --> 00:01:22,846 -Cu Echipamentul potrivit, imaginea ar putea fi extinsă și ascuțit. 33 00:01:22,846 --> 00:01:24,065 -Ce-i asta? 34 00:01:24,065 --> 00:01:25,600 -E Un program de accesoriu. 35 00:01:25,600 --> 00:01:26,860 Poți să clar că la orice? 36 00:01:26,860 --> 00:01:27,890 -Eu nu stiu. 37 00:01:27,890 --> 00:01:29,050 Să-l spori. 38 00:01:29,050 --> 00:01:31,575 >> Sectiunea -Enhance A6. 39 00:01:31,575 --> 00:01:33,642 >> -Am Sporit detaliu, si-- Cred că e 40 00:01:33,642 --> 00:01:35,433 suficient pentru a spori, eliberați-l pentru a ecranul meu. 41 00:01:35,433 --> 00:01:37,080 -Am Consolidată reflectarea în ochi. 42 00:01:37,080 --> 00:01:38,830 >> -Sa Rula acest prin accesoriu video. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Puteți îmbunătăți acest lucru? 44 00:01:40,100 --> 00:01:41,875 >> -Asteapta. 45 00:01:41,875 --> 00:01:44,010 >> -Am Lucrat la această reflecție. 46 00:01:44,010 --> 00:01:44,995 >> Reflecție Cineva lui. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Nu E o reflectare a feței omului. 49 00:01:47,399 --> 00:01:48,065 Reflecție -cele. 50 00:01:48,065 --> 00:01:48,981 -Nu E un reflecție. 51 00:01:48,981 --> 00:01:50,600 -Zoom De pe oglindă. 52 00:01:50,600 --> 00:01:52,712 -Puteți Vedea o reflecție. 53 00:01:52,712 --> 00:01:54,350 Poți să îmbunătăți imaginea de aici? 54 00:01:54,350 --> 00:01:55,370 Poți să-l consolideze aici? 55 00:01:55,370 --> 00:01:56,210 Poți să-l consolideze? 56 00:01:56,210 --> 00:01:56,900 Poți să-l consolideze? 57 00:01:56,900 --> 00:01:57,870 >> -Putem Spori acest lucru? 58 00:01:57,870 --> 00:01:58,717 >> Poți să-l consolideze? 59 00:01:58,717 --> 00:02:00,050 -Stai O secundă, voi spori. 60 00:02:00,050 --> 00:02:00,924 -Zoom De pe ușă. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Zoom. 63 00:02:02,586 --> 00:02:03,490 -Move În. 64 00:02:03,490 --> 00:02:03,990 -Mai mult. 65 00:02:03,990 --> 00:02:04,690 Stai, nu mai. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -Pause Ea. 68 00:02:05,970 --> 00:02:09,460 Rotiți cilindrul ne 75 de grade în jurul valorii de verticală, vă rugăm. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Du-te înapoi la partea despre ușa, din nou. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un amplificator de imagine care poate bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Hei, poate putem folosi Pradeep Metoda Sen pentru a vedea în ferestre. 73 00:02:18,776 --> 00:02:20,372 Software-ul -Asta este de ultimă oră. 74 00:02:20,372 --> 00:02:21,845 >> -cele Eigenvalue este oprit. 75 00:02:21,845 --> 00:02:24,300 >> -Cu Dreapta combinație de algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Eliminarea luate -E algoritmi la nivelul următor, 77 00:02:26,755 --> 00:02:28,730 și le pot folosi pentru a spori această fotografie. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Pe mări și axa Z. 79 00:02:31,286 --> 00:02:32,560 >> -Enhance. 80 00:02:32,560 --> 00:02:33,100 >> -Enhance. 81 00:02:33,100 --> 00:02:33,600 >> -Enhance. 82 00:02:33,600 --> 00:02:34,960 -Freeze Și de a spori. 83 00:02:34,960 --> 00:02:37,180 >> [END PLAYBACK] 84 00:02:37,180 --> 00:02:41,160 >> David J. MALAN: Bine, așa toți cei sunt de fapt cuvinte. 85 00:02:41,160 --> 00:02:44,450 Sunt doar înșirate împreună într-un încât nu este de fapt sensibil. 86 00:02:44,450 --> 00:02:48,400 Și, de fapt, CS50 și cursuri place tinde să strice o mulțime de TV și filme 87 00:02:48,400 --> 00:02:48,900 Pentru dumneavoastră. 88 00:02:48,900 --> 00:02:52,330 Pentru că atunci când aceste experți în informatică sunt zăngănit off termeni și spune 89 00:02:52,330 --> 00:02:56,860 lucruri de lux, cum ar fi vectori proprii, și axa z, 90 00:02:56,860 --> 00:02:59,572 și orice număr de alte de fapt, ceea ce mai tehnice, 91 00:02:59,572 --> 00:03:02,030 ei cu adevărat doar înșirarea Cuvinte împreună de prea multe ori. 92 00:03:02,030 --> 00:03:05,020 Este că unul dintre speranțele noastre este că, ca un efect secundar de a lua cursuri 93 00:03:05,020 --> 00:03:08,245 ca aceasta, va mai multe persoane în lume de fapt, putea să cântărească în 94 00:03:08,245 --> 00:03:12,040 și doar vreodată atât de ușor influența calitatea și acuratețea acestor filme? 95 00:03:12,040 --> 00:03:14,350 >> De fapt, haideți să aruncăm o privire la realitate. 96 00:03:14,350 --> 00:03:18,070 Deci, aici este fotografia personalul Maria, unul dintre colegii noștri de predare. 97 00:03:18,070 --> 00:03:20,050 Și să presupunem că este suspectat de ceva. 98 00:03:20,050 --> 00:03:23,730 Și totuși, există o licărire de unele dovadă în ochi, 99 00:03:23,730 --> 00:03:25,480 sau în reflectarea ochelari ei. 100 00:03:25,480 --> 00:03:30,760 Ei bine, dacă facem exact ca filmele propune, în care ne-am zoom și "spori", 101 00:03:30,760 --> 00:03:34,080 acest lucru este cât de multe informații este în fața lui Mary 102 00:03:34,080 --> 00:03:36,795 atunci când capturați o imagine cu această rezoluție original. 103 00:03:36,795 --> 00:03:39,120 >> Și, de fapt, puteți vedea aceste puncte. 104 00:03:39,120 --> 00:03:41,900 Și acestea sunt ceea ce sunt denumite pixeli, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 care este doar un pătrat de obicei că este un punct care compune o imagine. 106 00:03:45,740 --> 00:03:49,200 Și înapoi în a doua zi, și de fapt chiar astăzi, cu unele de televizoare cu LED-uri de azi 107 00:03:49,200 --> 00:03:51,950 sau televizoare LCD, dacă ai unul în camera dvs. sau la domiciliu, 108 00:03:51,950 --> 00:03:55,100 dacă te duci până super-aproape de ea, și mai ales daca este un televizor ceva mai în vârstă, 109 00:03:55,100 --> 00:03:58,760 probabil puteți vedea chiar aceste puncte și asta e ceea ce compune o imagine. 110 00:03:58,760 --> 00:04:00,980 >> Și nu mai există informații decât acest lucru. 111 00:04:00,980 --> 00:04:05,400 Am putea "spori", în sensul de nivelare lucruri de peste si un fel de 112 00:04:05,400 --> 00:04:09,040 deduce fel de, un fel de ceea ce Culoarea ar trebui să fie alături de ochi Maria 113 00:04:09,040 --> 00:04:10,910 astfel încât nu este de fapt atât de pixelat. 114 00:04:10,910 --> 00:04:14,510 Dar dacă tot zoom in, acolo este tipul rău în ochi. 115 00:04:14,510 --> 00:04:16,600 Ca și faptul că este tot informațiile pe care le avem. 116 00:04:16,600 --> 00:04:18,920 Nu puteți crea Informatiile din nimic. 117 00:04:18,920 --> 00:04:20,790 Există doar un finit numărul de biți de acolo. 118 00:04:20,790 --> 00:04:22,873 >> Deci, în Problema Set 4, în cazul în care aveți posibilitatea de 119 00:04:22,873 --> 00:04:24,580 să se joace cu acest tip de lume. 120 00:04:24,580 --> 00:04:27,610 În Problema Set 4, vei explora lume de grafica, si criminalistica, 121 00:04:27,610 --> 00:04:30,870 și de fapt, scrie cod care recupereaza imagini pierdute. 122 00:04:30,870 --> 00:04:33,510 Vei scrie cod care manipulează imagini existente 123 00:04:33,510 --> 00:04:36,120 și în cele din urmă să înțeleagă ceea ce este întâmplă sub capota. 124 00:04:36,120 --> 00:04:38,540 >> Și, se pare, este de fapt Nu tot ceea ce complicat. 125 00:04:38,540 --> 00:04:41,320 De exemplu, dacă am vrut să reprezintă o fata zambitoare, unde 126 00:04:41,320 --> 00:04:44,160 cu aceste pixeli negri, sau aceste puncte negre, 127 00:04:44,160 --> 00:04:47,230 Ei bine, am putea pur și simplu reprezenta le ca într-adevăr un bitmap. 128 00:04:47,230 --> 00:04:50,040 Și dacă ar fi auzit vreodată că bitmap expresie, poate 129 00:04:50,040 --> 00:04:52,330 începe acum să facă un puțin mai mult sens astăzi. 130 00:04:52,330 --> 00:04:53,580 >> Știm deja ce este un pic. 131 00:04:53,580 --> 00:04:54,160 Este 0 sau 1. 132 00:04:54,160 --> 00:04:56,201 Și o hartă este doar ceva ca o bucată de hârtie 133 00:04:56,201 --> 00:04:59,180 care vă oferă direcții și are poate o grilă de X și Y-coordonate. 134 00:04:59,180 --> 00:05:00,540 Deci, aici este un bitmap. 135 00:05:00,540 --> 00:05:03,680 Este o hartă de biți prin care un 1 este aparent 136 00:05:03,680 --> 00:05:07,857 O să reprezinte un pixel alb, și o 0 va reprezenta un pixel negru. 137 00:05:07,857 --> 00:05:09,440 Dar ne-am putea răsturna cu siguranță în jurul valorii de. 138 00:05:09,440 --> 00:05:11,648 Ea nu contează atât de adevărat timp cât suntem consistent. 139 00:05:11,648 --> 00:05:15,570 Și iată cum, în interiorul binary-- de memorie unui computer, sau chiar în interiorul 140 00:05:15,570 --> 00:05:18,160 de un fișier de pe hard-ul drive-- ai putea stoca 141 00:05:18,160 --> 00:05:20,240 Cel mai simplu de imagini fața zâmbitoare. 142 00:05:20,240 --> 00:05:23,990 Dar ceea ce suntem noi, desigur, lipsit de această imagine? 143 00:05:23,990 --> 00:05:24,610 Culoare, nu? 144 00:05:24,610 --> 00:05:28,220 Este un evident pas următor sau accesoriu pentru a îmbunătăți acest lucru cu culoare. 145 00:05:28,220 --> 00:05:32,230 Deci, din păcate, cu doar un singur bit, 0 sau 1, am putea reprezenta culoare. 146 00:05:32,230 --> 00:05:36,100 Care ar putea fi de culoare roșie, sau albastru, sau negru, alb sau, sau verde, sau roz, 147 00:05:36,100 --> 00:05:37,420 sau orice perechi de culori. 148 00:05:37,420 --> 00:05:40,860 Dar de dragul simplitate, vom doar își asumă în alb și negru. 149 00:05:40,860 --> 00:05:45,930 >> Deci, ceea ce face logic avem nevoie, dacă ne-am doresc să pună în aplicare de culoare într-o imagine? 150 00:05:45,930 --> 00:05:49,080 Ce trebuie să facem? 151 00:05:49,080 --> 00:05:51,900 Ca în cazul în care factorul de limitare aici este că, cu un pic poți doar 152 00:05:51,900 --> 00:05:55,977 reprezintă două state, 0 sau 1, alb sau negru, ce vrei să faci? 153 00:05:55,977 --> 00:05:56,810 Audiența: mai multe date. 154 00:05:56,810 --> 00:05:58,813 David J. MALAN: Mai multe biți, Da mai multe date, mai multe biți. 155 00:05:58,813 --> 00:06:01,440 Și, într-adevăr, asta e exact cum imagini color sunt reprezentate. 156 00:06:01,440 --> 00:06:05,120 Mai degrabă decât a utiliza un singur bit, un 0 sau 1 pentru fiecare pixel, fiecare punct, 157 00:06:05,120 --> 00:06:06,170 utilizați doar multiple. 158 00:06:06,170 --> 00:06:09,660 Poate folosi 8, poate, mai frecvent folosesc 24, și într-adevăr, în Problemă Set 159 00:06:09,660 --> 00:06:13,300 4, va te joci cu un fișier format care foloseste 24 de biți în mod obișnuit. 160 00:06:13,300 --> 00:06:15,430 >> Dar cele mai multe dintre voi sunt, probabil, familiar cu JPEG. 161 00:06:15,430 --> 00:06:17,460 Dacă ați luat vreodată o fotografie de pe telefon, 162 00:06:17,460 --> 00:06:20,360 sau încărcate sau vazut ceva pe Facebook, Flickr sau, orice număr 163 00:06:20,360 --> 00:06:24,882 de site-uri web bazate pe fotografii, ai probabil văzut o imagine JPEG înainte. 164 00:06:24,882 --> 00:06:27,840 Și se pare că, acest lucru este fișierul format vom folosi în PSET 4, 165 00:06:27,840 --> 00:06:30,340 care ai de gând să trebuie să recupereze imagini 166 00:06:30,340 --> 00:06:35,160 care le-am șters din greșeală de la un card de memorie corupt în aparatul foto, 167 00:06:35,160 --> 00:06:35,800 dacă vrei. 168 00:06:35,800 --> 00:06:38,490 >> Și se pare că, deși JPEG este destul de sophisticated-- 169 00:06:38,490 --> 00:06:40,906 este mult mai sofisticat decât puncte albe și negre 170 00:06:40,906 --> 00:06:44,480 am văzut în urmă cu o clipă, pentru că există algoritmi de fapt de lux care 171 00:06:44,480 --> 00:06:47,410 sunt folosite pentru a comprima un JPEG, așa pe care le poate avea un foarte frumos, 172 00:06:47,410 --> 00:06:49,832 imagine de calitate dar folosind relativ puține biți. 173 00:06:49,832 --> 00:06:51,790 Și ne vom întoarce la compresie, înainte de mult timp. 174 00:06:51,790 --> 00:06:56,280 Se pare că primul trei octeți într-un image-- JPEG 175 00:06:56,280 --> 00:07:02,750 indiferent de ceea ce ai luat o fotografie de-- sunt valorile 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Cu alte cuvinte, dacă doar a se vedea că modelul de biți, 177 00:07:05,990 --> 00:07:09,180 reprezentat aici ca trei bytes, sau 24 de biți în total, 178 00:07:09,180 --> 00:07:13,810 cu mare probabilitate puteți deduce că sunteți în căutarea la ea acest primele trei 179 00:07:13,810 --> 00:07:15,230 bytes de JPEG. 180 00:07:15,230 --> 00:07:18,040 Și aceasta este ceea ce este cunoscut ca semnarea unui JPEG. 181 00:07:18,040 --> 00:07:20,540 O mulțime de formate de fișiere acolo au tendința de a începe 182 00:07:20,540 --> 00:07:23,735 cu anumite modele de 0s și 1s, astfel încât Windows și Mac OS, și iOS, 183 00:07:23,735 --> 00:07:28,272 și Android știu ce fel de fișier ei sunt, în plus față de așa-numitul dosar 184 00:07:28,272 --> 00:07:29,730 extensie care o mulțime de fișiere au. 185 00:07:29,730 --> 00:07:32,590 Dacă ați .jpg, asta e un alt indiciu la calculator. 186 00:07:32,590 --> 00:07:35,310 >> Așa că haideți să uita-te acum la acest un pic mai mult tehnic. 187 00:07:35,310 --> 00:07:37,390 Știm zecimal Sistemul este 0 la 9. 188 00:07:37,390 --> 00:07:38,740 Știm binar este 0 și 1. 189 00:07:38,740 --> 00:07:41,842 Și dacă credeți înapoi la PSET 0, am avut voi lupta cu, 190 00:07:41,842 --> 00:07:43,800 pentru un pic, ceva numit hexazecimal, 191 00:07:43,800 --> 00:07:47,320 în cazul în care aveți 16 cifre, în loc de 10 sau în loc de 2. 192 00:07:47,320 --> 00:07:50,405 Și aceste cifre, prin convenție, sunt 0 la 9 si apoi o 193 00:07:50,405 --> 00:07:55,040 prin f, unde f reprezintă ceea ce număr zecimal, la fel ca un bun-simț rapid 194 00:07:55,040 --> 00:07:56,640 verifica? 195 00:07:56,640 --> 00:07:57,610 Deci, 15. 196 00:07:57,610 --> 00:08:01,390 Și trebuie să reprezinte un 10, doar prin Natura ordonarea pe care l-am dat. 197 00:08:01,390 --> 00:08:04,350 E doar o convenție arbitrară, dar este destul de standard de. 198 00:08:04,350 --> 00:08:06,870 >> Deci, dacă ne uităm la acest model de trei bytes-- să 199 00:08:06,870 --> 00:08:09,620 doar începe să se uite la ea în un mod compatibil cu modul în care 200 00:08:09,620 --> 00:08:12,450 oamenii de stiinta de calculator în general uita-te la și cred că despre fișiere. 201 00:08:12,450 --> 00:08:15,580 Vă puteți gândi cu siguranță despre fișiere în 0s și 1s, și zecimal, 202 00:08:15,580 --> 00:08:19,340 dar, în realitate, avem tendința de a folosi binar sau mai tipic hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 înapoi la PSET 0. 204 00:08:20,760 --> 00:08:25,857 Așa că haideți să-mi propun ca 255, 216, 255 și sunt doar aceste modele de 0s și 1s. 205 00:08:25,857 --> 00:08:28,440 Și puteți verifica acest lucru, dacă vrei sa faci matematica de la Week 0. 206 00:08:28,440 --> 00:08:30,810 Dar, pentru moment, doar să își asume că acest lucru este într-adevăr corectă. 207 00:08:30,810 --> 00:08:33,850 Tocmai am rescris trei zecimal numere ca trei valori binare. 208 00:08:33,850 --> 00:08:36,100 Acum, ceea ce am de gând să faceți este să trebuie doar să adăugați un spațiu alb, 209 00:08:36,100 --> 00:08:37,266 doar de dragul lui lizibilitate. 210 00:08:37,266 --> 00:08:39,940 Și comunicare, Mă duc pentru a muta lucrurile în afară. 211 00:08:39,940 --> 00:08:43,090 Deci, înainte de, după, înainte, după. 212 00:08:43,090 --> 00:08:46,180 Fac nimic interesant alte decât de raspandire lucruri atât de 213 00:08:46,180 --> 00:08:50,380 că o notificare fiecare set de opt biți este acum două seturi de patru biți. 214 00:08:50,380 --> 00:08:54,920 Acest lucru este util deoarece hexazecimal este deosebit de modă 215 00:08:54,920 --> 00:09:00,930 pentru că fiecare cifră hexazecimală de la 0 la f, sau mai precis 0 prin 15, 216 00:09:00,930 --> 00:09:03,430 pot fi reprezentate cu exact patru biți. 217 00:09:03,430 --> 00:09:07,960 Cu alte cuvinte, în hexazecimal, dacă doresc să reprezinte un 0, e doar 0000, 218 00:09:07,960 --> 00:09:08,780 patru zerouri. 219 00:09:08,780 --> 00:09:13,997 Și dacă vrei să reprezinte 15, e 1111, care este de patru biți. 220 00:09:13,997 --> 00:09:16,080 Și dacă faci calculele, dacă acesta este locul celor, 221 00:09:16,080 --> 00:09:18,210 acesta este locul 16S, care va da Tu-- 222 00:09:18,210 --> 00:09:19,960 mai degrabă că se întâmplă sa-- pare rău, în binar, 223 00:09:19,960 --> 00:09:23,660 care va va da 15, cele loc, doi câte doi, loc patru labe și optari loc. 224 00:09:23,660 --> 00:09:26,821 Așa că haideți să-mi propună că set de patru biți din stânga 225 00:09:26,821 --> 00:09:28,070 este ceea ce vom apela f. 226 00:09:28,070 --> 00:09:30,110 Este cel mai mare număr tine poate reprezenta cu patru biți. 227 00:09:30,110 --> 00:09:33,300 Și știm deja de la hexazecimal, f este cel mai mare cifra din hexazecimal. 228 00:09:33,300 --> 00:09:36,020 Avem un alt f acolo, două mai mult acolo. 229 00:09:36,020 --> 00:09:38,980 Și de acum, să ia doar pe credință că am făcut dreapta matematica 230 00:09:38,980 --> 00:09:41,890 și că jumătatea stângă de cele de biți, 1101, 231 00:09:41,890 --> 00:09:43,980 este același lucru ca și d în hexazecimal. 232 00:09:43,980 --> 00:09:46,490 Și mâna dreaptă, 1000, este la doar 8. 233 00:09:46,490 --> 00:09:48,140 >> Și pentru a vedea că o simplu, nu? 234 00:09:48,140 --> 00:09:51,670 8 represents-- este corect sub acel loc optari. 235 00:09:51,670 --> 00:09:56,040 Deci avem o în coloana optari și nimic din Fours, doi cate doi sau cele. 236 00:09:56,040 --> 00:09:59,830 Deci, acum mai convențional, oamenii tind pentru a scrie cifre hexazecimale, cum ar fi acest lucru, 237 00:09:59,830 --> 00:10:03,000 tu doar le strivi împreună, și apoi le prefixul 0x cu. 238 00:10:03,000 --> 00:10:05,920 Aceasta înseamnă nimic altceva decât un indiciu vizual pentru o human-- 239 00:10:05,920 --> 00:10:10,350 aici vine o value-- hexazecimal deoarece aceasta altfel ar putea să nu fie evident. 240 00:10:10,350 --> 00:10:13,629 >> Care este de a spune, în cele din urmă, că modelul de zerouri și cele, 241 00:10:13,629 --> 00:10:16,170 sau modelul de hexazecimal cifre echivalent ca esti 242 00:10:16,170 --> 00:10:18,990 O să începi să cauți pentru în Problema Set 4 este astea-- 243 00:10:18,990 --> 00:10:22,120 și problema Set 4 spec va umbla te prin acest lucru în mai multe detail-- 244 00:10:22,120 --> 00:10:25,344 dar dau seama ca un fel de arcane ca acest lucru ar putea uita-te la prima vedere, 245 00:10:25,344 --> 00:10:27,010 ai de gând să începe să vedeți acest lot. 246 00:10:27,010 --> 00:10:30,320 Și, de fapt, chiar și în GDB, The debugger am introdus luni 247 00:10:30,320 --> 00:10:35,440 și Dan introduce în PSET 3, se va să-ți arăt de multe ori valori hexazecimale 248 00:10:35,440 --> 00:10:39,910 doar pentru că ele tind să fie mai convențional decât zecimal sau binar 249 00:10:39,910 --> 00:10:41,157 în lumea calculatoarelor. 250 00:10:41,157 --> 00:10:42,490 Acum să punem acest lucru în context. 251 00:10:42,490 --> 00:10:48,040 Multi dintre voi s-ar putea aminti acest imagine aici, care a venit de la ce? 252 00:10:48,040 --> 00:10:51,240 Vista, astfel încât, chiar mai devreme decât că, Windows XP a făcut acest debut. 253 00:10:51,240 --> 00:10:52,620 Deci, acest lucru este un peisaj frumos. 254 00:10:52,620 --> 00:10:55,940 Și, de fapt, dacă scormoni în jurul online-- Cred că e un articol Wikipedia, 255 00:10:55,940 --> 00:11:00,110 în care cineva foarte uimitor a ieșit găsit această locație din lume înființat 256 00:11:00,110 --> 00:11:02,240 lui sau camera ei în exact place-- dreapta 257 00:11:02,240 --> 00:11:06,510 și acest lucru astăzi pare like-- dar Este exact aceeași setare. 258 00:11:06,510 --> 00:11:10,060 Această imagine, însă, este într-un fișier format numit bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Și am de gând să ia un super privire rapidă la ceea ce înseamnă că. 260 00:11:12,910 --> 00:11:17,770 >> Dar bitmap este doar un alt mod de a imagini reprezentând încă utilizați pixeli 261 00:11:17,770 --> 00:11:19,580 în 0s și 1s, în cele din urmă. 262 00:11:19,580 --> 00:11:23,282 Dar, la scurt rapidă, are o semnătură mai interesant 263 00:11:23,282 --> 00:11:24,490 la începutul fișierului. 264 00:11:24,490 --> 00:11:26,670 Nu este vorba doar de trei bytes, mai degrabă există 265 00:11:26,670 --> 00:11:30,770 o grămadă de modele de bytes care s-au predeterminat sens. 266 00:11:30,770 --> 00:11:34,490 De exemplu, undeva în Primele bytes de o imagine bitmap 267 00:11:34,490 --> 00:11:37,440 va fi de mărimea imagine, lățimea imaginii, 268 00:11:37,440 --> 00:11:40,390 înălțimea imaginii, așa metadate utile, dacă vrei. 269 00:11:40,390 --> 00:11:43,940 Informații utile care Photoshop sau orice grafica programul pe care îl utilizați 270 00:11:43,940 --> 00:11:45,180 s-ar putea pasa de fapt, despre. 271 00:11:45,180 --> 00:11:47,170 >> Cu atât mai mult în acest sens în Problema Set 4, dar acest lucru 272 00:11:47,170 --> 00:11:49,220 este doar să spun că la sfarsitul zilei 273 00:11:49,220 --> 00:11:52,390 toate formatele de fișiere ați utilizat pentru fișiere Microsoft Word ani--, 274 00:11:52,390 --> 00:11:55,820 Fișiere Numere, fișiere Excel, orice număr de formate de fișiere 275 00:11:55,820 --> 00:11:57,770 care ar putea avea unele extensie de fișier cunoscut 276 00:11:57,770 --> 00:12:00,130 sunt doar 0s și 1s de sub capota. 277 00:12:00,130 --> 00:12:02,970 Și oamenii au decis care convențiile sunt, 278 00:12:02,970 --> 00:12:08,340 ce modele de 0s și 1s reprezintă depune o Word față de un fișier Excel, 279 00:12:08,340 --> 00:12:10,322 versus orice număr de alte formate de fișiere. 280 00:12:10,322 --> 00:12:12,780 Deci, în PSET 4, veți avea un oportunitate de a juca cu asta. 281 00:12:12,780 --> 00:12:14,405 >> Dar ce înseamnă a avea o struct. 282 00:12:14,405 --> 00:12:18,012 Aceasta este de fapt un Segue frumos acum în C, care are doar un cuplu 283 00:12:18,012 --> 00:12:20,220 caracteristici de suplimentare care nu ne-am uitat la încă. 284 00:12:20,220 --> 00:12:24,230 E o limbă destul de mici și unul dintre caracteristicile frumoase despre C este un struct. 285 00:12:24,230 --> 00:12:27,300 De exemplu, dacă a vrut să reprezenta: hai 286 00:12:27,300 --> 00:12:33,690 spune că a vrut să aibă o variabilă care reprezintă un student într-un program de. 287 00:12:33,690 --> 00:12:37,330 Poate ai fost scris un curs Programul de înregistrare, sau cumpărături de bază 288 00:12:37,330 --> 00:12:38,870 instrument, sau ceva de genul asta. 289 00:12:38,870 --> 00:12:42,922 Care sunt fragmente de date legate de pentru un student care vin în minte? 290 00:12:42,922 --> 00:12:44,880 Ca un student este reprezentată cu ce valori? 291 00:12:44,880 --> 00:12:45,732 Da? 292 00:12:45,732 --> 00:12:46,940 Ai un nume ca un student. 293 00:12:46,940 --> 00:12:48,900 Ce altceva student tipic au? 294 00:12:48,900 --> 00:12:49,320 >> Audiența: [inaudibil] 295 00:12:49,320 --> 00:12:50,200 >> David J. MALAN: Deci, îmi pare rău. 296 00:12:50,200 --> 00:12:50,660 >> Audiența: Age. 297 00:12:50,660 --> 00:12:52,980 >> David J. MALAN: o vârstă sau ziua de nastere echivalent, da. 298 00:12:52,980 --> 00:12:53,557 Ce altceva? 299 00:12:53,557 --> 00:12:54,390 Audiența: număr de identificare? 300 00:12:54,390 --> 00:12:57,460 David J. MALAN: Deci un număr de identificare, poate un număr de telefon, poate un cămin, sau casa, 301 00:12:57,460 --> 00:12:58,670 sau colegiu, sau ceva de genul asta. 302 00:12:58,670 --> 00:13:01,820 Orice număr de piese de date care s-ar putea avea în lista de contacte 303 00:13:01,820 --> 00:13:03,890 este ceea ce s-ar putea defini un student. 304 00:13:03,890 --> 00:13:08,490 Deci, dacă am vrut să facem acest lucru, în cod, am putea face ceva simplu de genul asta. 305 00:13:08,490 --> 00:13:15,670 Am putea avea un program astfel încât are să zicem, int main (void). 306 00:13:15,670 --> 00:13:18,920 Și dacă vreau să reprezinte o elev ar putea să am, de exemplu, 307 00:13:18,920 --> 00:13:24,330 un șir numit nume pentru că elevilor, un șir numit cămin pentru elev, 308 00:13:24,330 --> 00:13:26,900 poate un int numit ID pentru elev. 309 00:13:26,900 --> 00:13:30,840 Și pentru că eu sunt, folosind șir, am nevoie pentru a merge înapoi și a pus CS50.h. 310 00:13:30,840 --> 00:13:33,300 Poate voi avea nevoie de stdio.h. 311 00:13:33,300 --> 00:13:38,190 Deci lasă-mă să fac preventiv și sunt cele O să numesc acest student.c pentru acum 312 00:13:38,190 --> 00:13:40,080 și de a salva acest lucru. 313 00:13:40,080 --> 00:13:44,206 >> Și acum pot să fac ceva cu aceste variabile. 314 00:13:44,206 --> 00:13:46,830 Și noi suntem doar de gând să scrie ca pe un comentariu în codul pseudo, 315 00:13:46,830 --> 00:13:48,829 pentru ca nu este interesant ceea ce facem acum. 316 00:13:48,829 --> 00:13:51,242 OK, astfel încât acesta este un program care stochează într-un fel un student. 317 00:13:51,242 --> 00:13:53,450 Ce vreau să fac dacă doriți să stocați doi studenți? 318 00:13:53,450 --> 00:13:55,991 Deci primul meu instinct este de gând să fie bine, stai un minut, 319 00:13:55,991 --> 00:14:01,920 dacă am un alt elev ce nu nu doar nume string 2, șir cămin 2, 320 00:14:01,920 --> 00:14:04,190 Int ID2. 321 00:14:04,190 --> 00:14:06,540 Și am făcut plecat pe acest drum înainte 322 00:14:06,540 --> 00:14:10,890 și ceea ce a fost soluția noastră la ceea ce pare pentru a fi un fel de pastă copie hackish 323 00:14:10,890 --> 00:14:11,555 de locuri de muncă aici? 324 00:14:11,555 --> 00:14:12,346 Audiența: O matrice. 325 00:14:12,346 --> 00:14:13,830 David J. MALAN: Da, am putea folosi o matrice. 326 00:14:13,830 --> 00:14:15,620 Dreapta acest lucru foarte repede devine greoi. 327 00:14:15,620 --> 00:14:18,453 Trebuie să sortați de arbitrar începe numirea toate aceste variabile. 328 00:14:18,453 --> 00:14:22,190 Și tu, omul, trebuie să păstreze piesa care corespunde OK NAME2 329 00:14:22,190 --> 00:14:25,060 cu dorm2 corespunde cu ID2. 330 00:14:25,060 --> 00:14:26,200 Ea devine doar o mizerie. 331 00:14:26,200 --> 00:14:29,350 Deci, este mult mai ușor, amintesc de câteva săptămâni în urmă, 332 00:14:29,350 --> 00:14:34,300 pentru doar având la numit nume șir și poate să ne dea trei dintre acestea. 333 00:14:34,300 --> 00:14:36,940 Și atunci poate ne-am cămine șir și au 334 00:14:36,940 --> 00:14:41,900 trei dintre cei, sau cu o constantă, int ID-uri și au trei dintre acestea. 335 00:14:41,900 --> 00:14:45,250 Dar chiar și acum se simte acest un pic neglijent, chiar. 336 00:14:45,250 --> 00:14:49,440 Vorbim despre studenți și încă Sunt foarte locuință la nivelul scăzut 337 00:14:49,440 --> 00:14:50,470 detaliile de implementare. 338 00:14:50,470 --> 00:14:52,790 Studentul este un nume și un cămin și ID-ul. 339 00:14:52,790 --> 00:14:59,814 >> De ce nu pot declara doar o variabilă numit elev și de apel este. 340 00:14:59,814 --> 00:15:02,230 Și dacă vreau un alt student, de ce nu am doar o numesc T. 341 00:15:02,230 --> 00:15:05,260 Sau dacă vreau o grămadă de studenți, de ce nu am doar 342 00:15:05,260 --> 00:15:09,740 spune că am o intreaga clasa de studenți, și este trei. 343 00:15:09,740 --> 00:15:12,470 Cu alte cuvinte, de ce nu pot să vin cu genul meu de date proprie, numit 344 00:15:12,470 --> 00:15:15,641 Elevii, din care interior este un nume, este un ID, este un cămin, 345 00:15:15,641 --> 00:15:16,890 este orice număr de alte domenii. 346 00:15:16,890 --> 00:15:19,030 Și se pare că ai pot face exact acest lucru. 347 00:15:19,030 --> 00:15:21,850 >> Deci, C are această caracteristică numit struct. 348 00:15:21,850 --> 00:15:24,700 Aceasta este o caracteristică limbă pe care ne permite să facem exact acest lucru. 349 00:15:24,700 --> 00:15:28,370 Am de gând să merg mai departe și deschide structs.h 350 00:15:28,370 --> 00:15:32,299 în cazul în care vom vedea pe următoarea definiție a unui student. 351 00:15:32,299 --> 00:15:35,215 Se pare - și asta e chiar mai simplă decât cea care implică un ID 352 00:15:35,215 --> 00:15:36,080 un moment în urmă. 353 00:15:36,080 --> 00:15:39,120 Dacă doriți să vină cu tipul de date de casă, 354 00:15:39,120 --> 00:15:42,750 și în plus față de int, char și și float și toate aceste altele care există, 355 00:15:42,750 --> 00:15:45,810 puteți face acest lucru prin literalmente scris typedef struct, 356 00:15:45,810 --> 00:15:47,880 apoi unele acolade, în interiorul de care 357 00:15:47,880 --> 00:15:51,460 lista variabilelor pe care doriți să asocia cu acest nou date personalizate 358 00:15:51,460 --> 00:15:55,670 tastați ca un nume și un cămin, și apoi, după acolade 359 00:15:55,670 --> 00:15:57,860 vă dau un nume pentru noul tip de date. 360 00:15:57,860 --> 00:15:59,220 Deci, de exemplu, elev. 361 00:15:59,220 --> 00:16:03,247 >> Și ce e frumos despre acest lucru acum este că dacă ne uităm la codul corespunzător, 362 00:16:03,247 --> 00:16:05,080 Convenția, în primul rând de toate, este de a pune această 363 00:16:05,080 --> 00:16:08,230 într-un fișier numit ceva dot h, un fișier antet, pe care nu am 364 00:16:08,230 --> 00:16:09,780 a început să utilizeze noi prea mult. 365 00:16:09,780 --> 00:16:12,120 Dar vom începe să folosind destul de un pic acum. 366 00:16:12,120 --> 00:16:18,650 Și ce putem face cu acest lucru, în cele din urmă, în aceste câteva linii de cod 367 00:16:18,650 --> 00:16:22,130 este să declare exact ca tipul de date, un student. 368 00:16:22,130 --> 00:16:23,230 Și acum să-l folosească. 369 00:16:23,230 --> 00:16:27,274 >> Am de gând să merg acum în un fișier numit structs1.c. 370 00:16:27,274 --> 00:16:29,440 Și haideți să aruncăm o privire la o câteva caracteristici aici. 371 00:16:29,440 --> 00:16:32,250 Deci lucrurile aici este cea mai mare parte familiar, și vom 372 00:16:32,250 --> 00:16:35,040 reveni la ceea ce nu este familiar intr-o clipa. 373 00:16:35,040 --> 00:16:39,880 Aceasta, desigur, este, inclusiv propria mea fișier antet, care este nou, de asemenea, 374 00:16:39,880 --> 00:16:42,580 cu excepția PSET 3 în cazul în care, Reamintim, avem helpers.h. 375 00:16:42,580 --> 00:16:45,150 Deci s-ar putea aminti helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> De ce totuși mă, folosind citate în loc de paranteze unghiulare? 377 00:16:49,381 --> 00:16:50,630 Când pot alege între ei? 378 00:16:50,630 --> 00:16:52,310 Aproape întotdeauna mi se pare pentru a utiliza paranteze unghiulare. 379 00:16:52,310 --> 00:16:55,040 Și apoi, dintr-o dată pe line șase Sunt folosind ghilimele. 380 00:16:55,040 --> 00:16:55,860 De ce ar putea fi asta? 381 00:16:55,860 --> 00:16:56,700 Da? 382 00:16:56,700 --> 00:16:57,725 >> Audiența: [inaudibil] 383 00:16:57,725 --> 00:16:59,350 David J. MALAN: Asta-i o reală, ce? 384 00:16:59,350 --> 00:17:00,559 Audiența: Asta e in IDE-ul. 385 00:17:00,559 --> 00:17:02,475 David J. MALAN: Da, care este în IDE mea actuale. 386 00:17:02,475 --> 00:17:05,690 Și să nu locuiască pe IDE, deoarece asta e doar un instrument care eu sunt, folosind. 387 00:17:05,690 --> 00:17:08,119 Asta e în curent meu director, în special. 388 00:17:08,119 --> 00:17:11,647 Deci structs.h este propria mea fișier nu este instalat în IDE, 389 00:17:11,647 --> 00:17:14,480 în sistemul de operare în sine, mai degrabă e în directorul meu curent. 390 00:17:14,480 --> 00:17:16,910 Deci convenția este, dacă doriți pentru a include propriul fișier antet, 391 00:17:16,910 --> 00:17:18,200 utilizați doar ghilimele. 392 00:17:18,200 --> 00:17:23,290 >> Ce numim acest lucru în linia 8, în general? 393 00:17:23,290 --> 00:17:25,200 Acesta este ce? 394 00:17:25,200 --> 00:17:28,220 ceva #define. 395 00:17:28,220 --> 00:17:31,040 Aceasta reprezintă constante, nu? 396 00:17:31,040 --> 00:17:33,140 Dacă doriți să aveți o Valoarea în programul tău 397 00:17:33,140 --> 00:17:35,110 să utilizați un întreg grămadă de ori, e 398 00:17:35,110 --> 00:17:39,330 bine convenție să-l factor afară, declare, cu simbolul diez 399 00:17:39,330 --> 00:17:43,340 defini, apoi, prin convenție, în toate majuscule word-- deși nu este 400 00:17:43,340 --> 00:17:45,320 strict necesare, dar e convenție umană 401 00:17:45,320 --> 00:17:47,210 de a valorifica constante astfel încât acestea să sară 402 00:17:47,210 --> 00:17:50,380 la tine visually-- spațiu și atunci valoarea pe care doriți să fie 403 00:17:50,380 --> 00:17:52,250 echivalent cu nume care constanta lui. 404 00:17:52,250 --> 00:17:56,110 Nu virgulă, dar pur și simplu rezultă că modelul acolo. 405 00:17:56,110 --> 00:17:57,770 >> Deci, ce fac în acest cod actuale. 406 00:17:57,770 --> 00:18:00,660 Deci, haideți să aruncăm o privire la programul principal aici. 407 00:18:00,660 --> 00:18:04,080 În linia 12 pentru că am au inclus structs.h, 408 00:18:04,080 --> 00:18:06,492 Acum am magic la mea eliminarea unui nou tip de date. 409 00:18:06,492 --> 00:18:09,200 Nu am doar acces la Int, și char, float și, și de coarde, 410 00:18:09,200 --> 00:18:10,060 și albastru și altele. 411 00:18:10,060 --> 00:18:12,470 Am acum acces la un tip de date elev. 412 00:18:12,470 --> 00:18:17,740 Deci, în linia 12, am combinarea a două ideas-- un un tip de date personalizat și doi, 413 00:18:17,740 --> 00:18:18,940 folosind o matrice. 414 00:18:18,940 --> 00:18:21,700 Și astfel, în acest program, dacă Vreau să sprijine efectiv 415 00:18:21,700 --> 00:18:24,320 trei elevi diferite în programul meu, am 416 00:18:24,320 --> 00:18:30,480 poate spune pur și simplu da-mi o variabilă numite studenți, fiecare dintre care 417 00:18:30,480 --> 00:18:32,970 este de studenți de tip, care este genul meu de date personalizat. 418 00:18:32,970 --> 00:18:35,890 Și, în special, da-mi trei dintre cei din matrice mea. 419 00:18:35,890 --> 00:18:37,750 >> Deci, acum ce facem in acest program? 420 00:18:37,750 --> 00:18:40,670 Iată doar un pentru buclă iterarea 0-3, pentru că 421 00:18:40,670 --> 00:18:42,110 ce valoarea de studenți este. 422 00:18:42,110 --> 00:18:44,420 Eu doar determinând utilizatorul da-mi numele elevului. 423 00:18:44,420 --> 00:18:48,090 Și apoi în linia 17, ne-am au o linie de cea mai mare parte familiar. 424 00:18:48,090 --> 00:18:50,370 Avem vechiul nostru prieten GetString pe dreapta. 425 00:18:50,370 --> 00:18:52,345 Și ce bucată de sintaxă este aparent nou, 426 00:18:52,345 --> 00:18:55,130 dacă nu ați programat în C înainte, și nu au utilizat niciodată structs? 427 00:18:55,130 --> 00:18:55,510 Da? 428 00:18:55,510 --> 00:18:56,417 >> AUDIENTA: a .name. 429 00:18:56,417 --> 00:18:57,500 David J. MALAN: a .name. 430 00:18:57,500 --> 00:19:01,220 Dar acest lucru nu este prea mult de un salt, pentru că acum elevii bracketing i 431 00:19:01,220 --> 00:19:02,590 vă oferă elevului i-lea. 432 00:19:02,590 --> 00:19:04,730 Și, dacă doriți să se scufunde în interiorul acestei structuri, 433 00:19:04,730 --> 00:19:09,490 utilizați doar o singură perioadă și apoi numele variabilei interior, 434 00:19:09,490 --> 00:19:11,900 sau proprietatea în interiorul că doriți să obțineți acces la. 435 00:19:11,900 --> 00:19:14,816 În mod similar, atunci, dacă am apoi solicita utilizator, da-mi cămin elevului, 436 00:19:14,816 --> 00:19:18,390 puteți stoca în mod similar că șir în variabila camin interior 437 00:19:18,390 --> 00:19:19,940 din structura elev. 438 00:19:19,940 --> 00:19:21,410 >> Și acum lucrurile devin un pic de lux. 439 00:19:21,410 --> 00:19:24,420 Și acest lucru se întâmplă să te uiți la, probabil, o mulțime destul de repede. 440 00:19:24,420 --> 00:19:27,970 Dar veți vedea acest lucru mult mai mult în PSET 4, așa că hai să privire la el acum. 441 00:19:27,970 --> 00:19:33,364 Se pare că, în conformitate 23 prin 38, ce crezi că poate că fac? 442 00:19:33,364 --> 00:19:35,530 Am scos comentariile pentru ziua de azi, dar versiunea 443 00:19:35,530 --> 00:19:38,660 din Codul online de referință are toate comentariile. 444 00:19:38,660 --> 00:19:40,171 Ce mi se pare a fi faci? 445 00:19:40,171 --> 00:19:42,530 >> Audiența: salvarea fișierului cu toate informațiile pe care utilizatorul a intrat. 446 00:19:42,530 --> 00:19:44,530 >> David J. MALAN: Da, exact, aceasta este o modalitate nouă 447 00:19:44,530 --> 00:19:46,370 că vedem două, O altă caracteristică a C, 448 00:19:46,370 --> 00:19:48,700 prin care pot crea propriile fișiere. 449 00:19:48,700 --> 00:19:51,580 Până în prezent, aproape fiecare program de ai scris este apatrid. 450 00:19:51,580 --> 00:19:53,334 De îndată ce se face de funcționare, asta este. 451 00:19:53,334 --> 00:19:55,000 Nu e nici o memorie sau amintire de ea. 452 00:19:55,000 --> 00:19:56,110 Nu e nici un fisier salvat. 453 00:19:56,110 --> 00:19:58,120 Dar, dacă vrei să salva de intrare care are 454 00:19:58,120 --> 00:20:02,100 sa întâmplat, ca într-un joc sau un program de ca aceasta, se pare putem face acest lucru. 455 00:20:02,100 --> 00:20:04,360 Și veți vedea acest lucru mai mult în PSET 4 și în secțiunea. 456 00:20:04,360 --> 00:20:08,661 Dar această linie 23, în esență, creează un fișier numit students.csv. 457 00:20:08,661 --> 00:20:10,160 Și s-ar putea fi văzut acest lucru înainte. 458 00:20:10,160 --> 00:20:14,250 Chiar dacă nu ați studiat CS înainte, CSV este variabile separate prin virgulă. 459 00:20:14,250 --> 00:20:19,000 E ca și cum un om foarte sărac versiune a unui fișier Excel, 460 00:20:19,000 --> 00:20:22,270 ceea ce înseamnă că ar putea fi deschis în Excel și în număr Apple, 461 00:20:22,270 --> 00:20:23,830 si are rânduri și coloane. 462 00:20:23,830 --> 00:20:26,485 Dar nu este un drept de proprietate format ca Microsoft sau Apple. 463 00:20:26,485 --> 00:20:29,840 E doar virgula care separă valori pe care vom vedea într-o clipă. 464 00:20:29,840 --> 00:20:31,010 >> Și să ia doar o presupunere. 465 00:20:31,010 --> 00:20:33,480 În linia 23, la foarte scop, al doilea argument mea 466 00:20:33,480 --> 00:20:37,700 la această nouă funcție numită f deschis pentru fișierul deschis este w. 467 00:20:37,700 --> 00:20:39,430 Ce ar putea însemna w? 468 00:20:39,430 --> 00:20:40,022 Da? 469 00:20:40,022 --> 00:20:41,260 >> Audiența: Acesta vă permite să scrie la dosar? 470 00:20:41,260 --> 00:20:42,630 >> David J. MALAN: Acesta vă permite vă scrie la dosar. 471 00:20:42,630 --> 00:20:44,810 Deci, există o serie de variante pe care le putem conecta aici. 472 00:20:44,810 --> 00:20:47,184 Dar daca vrei doar să citiți fișierul, care este uita la ea 473 00:20:47,184 --> 00:20:50,010 și-l citesc în memorie, aveți folosi doar citat încheiat citatul "r". 474 00:20:50,010 --> 00:20:53,110 Dacă doriți să scrie la fișier, utilizați citat încheiat citatul "w". 475 00:20:53,110 --> 00:20:55,190 Există, de asemenea adăugați și o serie de alte lucruri 476 00:20:55,190 --> 00:20:57,356 dacă doriți să modificați fișierele existente. 477 00:20:57,356 --> 00:21:00,480 Acum vom vedea acest menține lucru, atunci ne vom întoarce la linia 24. 478 00:21:00,480 --> 00:21:02,640 NULL, se pare, este o valoare deosebită care 479 00:21:02,640 --> 00:21:06,070 pot fi returnate prin anumite funcții dacă ceva a mers wrong-- 480 00:21:06,070 --> 00:21:08,490 Dacă fișierul nu există, dacă ați alerga afară de memorie, 481 00:21:08,490 --> 00:21:09,620 sau o grămadă de alte erori. 482 00:21:09,620 --> 00:21:13,470 Dar pentru acum, hai să presupunem că acest este verificarea erorilor doar convențional. 483 00:21:13,470 --> 00:21:17,090 Aici, în linia 26, am iterarea 0-3 peste toate elevii mei. 484 00:21:17,090 --> 00:21:20,470 Și acest tip de fel este de o nouă funcție, fprintf, 485 00:21:20,470 --> 00:21:21,460 dar ia doar o presupunere. 486 00:21:21,460 --> 00:21:24,370 Dacă printf este doar de imprimare un șir formatat, 487 00:21:24,370 --> 00:21:26,507 ce fprintf probabil înseamnă? 488 00:21:26,507 --> 00:21:27,590 Audiența: Print într-un fișier. 489 00:21:27,590 --> 00:21:29,290 David J. MALAN: Imprimare string formatat într-un fișier. 490 00:21:29,290 --> 00:21:31,180 Asta e ceea ce adițional f mijloace este fișier. 491 00:21:31,180 --> 00:21:36,420 Și noul primul argument trebuie să fie variabila care reprezintă fișierul. 492 00:21:36,420 --> 00:21:38,866 Apoi, ne-am format un string la fel ca printf. 493 00:21:38,866 --> 00:21:40,740 Și chiar dacă acest lucru sintaxa este nou, acest lucru doar 494 00:21:40,740 --> 00:21:44,610 înseamnă conectați în numele studentului, plug-in-cămin studențesc, iar apoi 495 00:21:44,610 --> 00:21:47,160 cu fclose, închideți fișierul. 496 00:21:47,160 --> 00:21:49,730 Și apoi lastly-- aceasta este nou și vom reveni la acest 497 00:21:49,730 --> 00:21:53,240 înainte long-- Sunt eliberarea student pentru motive 498 00:21:53,240 --> 00:21:54,860 ce sa intamplat deasupra acolo. 499 00:21:54,860 --> 00:21:56,820 Dar vom reveni pentru că, înainte de long-- 500 00:21:56,820 --> 00:21:59,820 asta e din cauza modului getString este de fapt de lucru sub capota. 501 00:21:59,820 --> 00:22:01,280 >> Deci, haideți să aruncăm o privire rapidă aici. 502 00:22:01,280 --> 00:22:04,380 Dacă aș tip E în directorul meu, observați că eu nu 503 00:22:04,380 --> 00:22:09,360 au un fișier numit students.csv, pur și simplu nu există, nu există. 504 00:22:09,360 --> 00:22:14,965 Deci, dacă acum am compila acest program, face structs-1,. / struct-1, 505 00:22:14,965 --> 00:22:20,570 și am de gând să mergeți mai departe și tastați Andi, care locuiește în Berkeley la Yale. 506 00:22:20,570 --> 00:22:26,350 Vom avea Rob care locuiește în Thayer aceste zile. 507 00:22:26,350 --> 00:22:33,760 Și să vină cu unde este, cred eu, Maria este în Mather, 508 00:22:33,760 --> 00:22:35,100 dacă am adus aminte corect. 509 00:22:35,100 --> 00:22:36,460 >> Deci, nimic nu pare să se întâmple. 510 00:22:36,460 --> 00:22:40,680 Dar dacă de tip LS acum, există students.csv. 511 00:22:40,680 --> 00:22:43,080 Să mergem mai departe și students.csv deschis. 512 00:22:43,080 --> 00:22:46,050 Aceasta este din nou o foarte format de fișier ușor. 513 00:22:46,050 --> 00:22:49,570 Dar am adoptat pur și simplu o convenție că am două rânduri și coloane de aici. 514 00:22:49,570 --> 00:22:52,020 Prima coloană este prenumele oamenilor. 515 00:22:52,020 --> 00:22:55,740 A doua coloană este elev anii cămin, sau colegiu, sau casa, sau fleacuri. 516 00:22:55,740 --> 00:22:57,900 Și acum am salvat acest permanent într-un fișier. 517 00:22:57,900 --> 00:22:59,280 >> Deci nu e tot ce interesant. 518 00:22:59,280 --> 00:23:02,980 Dar aceasta este doar o piatra de hotar acum a fi capabil să persiste informații 519 00:23:02,980 --> 00:23:04,040 permanent. 520 00:23:04,040 --> 00:23:08,340 Deci, haideți să vedem acum ce mai putem a face cu aceste și alte caracteristici. 521 00:23:08,340 --> 00:23:10,729 Dar, mai întâi, întrebări? 522 00:23:10,729 --> 00:23:12,145 Asta a fost o foarte mult, și asta a fost rapid. 523 00:23:12,145 --> 00:23:16,131 Dar veți vedea o mulțime mai mult în PSET 4, precum și. 524 00:23:16,131 --> 00:23:16,630 Da? 525 00:23:16,630 --> 00:23:19,360 >> Audiența: Există o modalitate de a continuă adăugând nume în acest dosar? 526 00:23:19,360 --> 00:23:19,880 >> David J. MALAN: Bună întrebare. 527 00:23:19,880 --> 00:23:21,800 Există o modalitate de a continua adăugând nume în acest dosar? 528 00:23:21,800 --> 00:23:22,340 Da. 529 00:23:22,340 --> 00:23:24,630 Și, de fapt, în cazul în care ajungi up re-deschiderea fișierului, 530 00:23:24,630 --> 00:23:26,780 v-ar folosi citat încheiat citatul "A" pentru append, 531 00:23:26,780 --> 00:23:31,090 care ar adăuga doar o nouă linie, o noua linie nou și din nou, exact. 532 00:23:31,090 --> 00:23:32,010 Buna intrebare. 533 00:23:32,010 --> 00:23:32,950 Alte întrebări? 534 00:23:32,950 --> 00:23:33,450 Da? 535 00:23:33,450 --> 00:23:35,580 Audiența: Dacă rulat Programul din nou chiar acum, 536 00:23:35,580 --> 00:23:38,000 ar păstra adăugarea nume în fișier sau ar deschide un fișier nou? 537 00:23:38,000 --> 00:23:38,740 >> David J. MALAN: Ah, bună întrebare. 538 00:23:38,740 --> 00:23:41,448 Dacă ați rulat din nou dreptul de programul acum, poate introduce noi denumiri, 539 00:23:41,448 --> 00:23:44,820 ar adauga la dosar sau suprascrie fișierul? 540 00:23:44,820 --> 00:23:47,420 Acesta din urmă, pentru că eu sunt Nu utilizați modul atașare. 541 00:23:47,420 --> 00:23:49,930 Și pentru că eu sunt doar orbește deschiderea fișierului pentru scriere, 542 00:23:49,930 --> 00:23:51,310 este doar de gând să suprascrie fișierul. 543 00:23:51,310 --> 00:23:54,570 Așa că am nevoie într-adevăr, ar fi să faceți este să adăugați, dacă vreau să am de fapt, pe termen lung 544 00:23:54,570 --> 00:23:55,350 de baze de date. 545 00:23:55,350 --> 00:23:58,220 >> Acum CSV este util, sincer, chiar pentru ca daca esti writing-- 546 00:23:58,220 --> 00:24:00,100 și vom vedea în cele din urmă acest mai târziu în semestrul când 547 00:24:00,100 --> 00:24:01,455 vom folosi CSVs în alte scopuri. 548 00:24:01,455 --> 00:24:04,920 Dacă doriți să stocați toți oamenii care s-au înregistrat pentru un eveniment, 549 00:24:04,920 --> 00:24:07,420 sau înscris pentru elev dvs. grup, sau ceva de genul asta, 550 00:24:07,420 --> 00:24:10,330 stocarea datelor în acest tip de format este super convenabil. 551 00:24:10,330 --> 00:24:12,580 Pentru că literalmente, dacă aș au fost pentru a descărca acest fișier. 552 00:24:12,580 --> 00:24:14,540 Aș putea double-- și să încercăm de fapt acest lucru 553 00:24:14,540 --> 00:24:16,720 dacă am Excel sau numerele de pe aici. 554 00:24:16,720 --> 00:24:19,130 >> Am de gând să faceți clic dreapta sau Control-clic dosarul meu. 555 00:24:19,130 --> 00:24:20,020 Hopa. 556 00:24:20,020 --> 00:24:21,830 Faceți clic dreapta sau Control-clic dosarul meu. 557 00:24:21,830 --> 00:24:24,960 Haide, mouse-ul meu nu este cooperant. 558 00:24:24,960 --> 00:24:32,694 Download-- am de gând să descărca toate fișierele aici, așa încât 559 00:24:32,694 --> 00:24:33,860 doar ca să pot apuca asta. 560 00:24:33,860 --> 00:24:37,850 Și să vedem dacă funcționează Prima dată students.csv-- 561 00:24:37,850 --> 00:24:39,310 Am activat. 562 00:24:39,310 --> 00:24:41,360 Acum ei vor să vadă contactele mele. 563 00:24:41,360 --> 00:24:44,310 Acum, trebuie să mă înregistrez. 564 00:24:44,310 --> 00:24:47,620 Vedea cât de ușor este de a folosi CSVs? 565 00:24:47,620 --> 00:24:50,840 Da, păstrați-l la zi. 566 00:24:50,840 --> 00:24:52,375 OK, acum suntem pregătiți pentru clasa. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, ce mai e nou? 569 00:25:00,370 --> 00:25:02,920 OK, aproape. 570 00:25:02,920 --> 00:25:04,750 Asta a fost magic. 571 00:25:04,750 --> 00:25:07,280 OK, acum avem de a actualiza. 572 00:25:07,280 --> 00:25:10,890 Și acum, uitat ce fișier Am deschis inițial, 573 00:25:10,890 --> 00:25:13,090 dar ceea ce un-- acolo vom merge. 574 00:25:13,090 --> 00:25:16,341 OK, asa ca acum avem un fișier Excel. 575 00:25:16,341 --> 00:25:18,290 Multumesc. 576 00:25:18,290 --> 00:25:20,764 >> OK, deci ceea ce am făcut a fost partea ușoară. 577 00:25:20,764 --> 00:25:23,930 Desigur, aș fi putut pre-instalat Excel, sau numere, sau indiferent de programul. 578 00:25:23,930 --> 00:25:25,846 Dar acest lucru este frumos, pentru că acum pot manipula 579 00:25:25,846 --> 00:25:28,090 datele dintr-un format standard. 580 00:25:28,090 --> 00:25:30,294 >> Deci, acum să context comuta la unde am rămas 581 00:25:30,294 --> 00:25:32,710 ultima dată, care a fost de a începe să-și scoată roti ajutatoare. 582 00:25:32,710 --> 00:25:34,543 Dar în primul rând, nu ai făcut- aceasta masa de prânz mai devreme 583 00:25:34,543 --> 00:25:38,150 se întâmplă din nou aici, la foc și Gheață în Cambridge, Sitar în New Haven. 584 00:25:38,150 --> 00:25:43,150 Înregistrează-te pe site-ul CS50s ASAP să se alăture studenților și a personalului CS50. 585 00:25:43,150 --> 00:25:46,090 >> Așa că am luat roți de formare off luni ca follows-- 586 00:25:46,090 --> 00:25:49,120 string a fost declarată în Biblioteca CS50s de ceva timp. 587 00:25:49,120 --> 00:25:52,650 Și e frumos, deoarece permite să vorbim despre variabile ca fiind 588 00:25:52,650 --> 00:25:54,660 cuvinte și fraze complete, și mai mult. 589 00:25:54,660 --> 00:25:56,710 Dar se pare că nu există șir. 590 00:25:56,710 --> 00:26:00,200 Acesta este doar un sinonim, sau un alias, care le-am creat pentru ceva care 591 00:26:00,200 --> 00:26:03,780 de fapt, este un pic mai mult tehnică numit char *. 592 00:26:03,780 --> 00:26:07,900 >> Și într-adevăr, am văzut un exemplu a unui program de luni 593 00:26:07,900 --> 00:26:11,200 că nu sa comportat la fel de ne-am așteptat. 594 00:26:11,200 --> 00:26:13,630 Acest lucru a fost fișierul, compara-0. 595 00:26:13,630 --> 00:26:17,910 Și reamintească faptul că compara-0, în cazul în care Am recompilați programul de luni 596 00:26:17,910 --> 00:26:22,670 și a alerga compara-0 și de tip în mama în litere mici, și mama cu litere mici din nou. 597 00:26:22,670 --> 00:26:25,320 Programul am insistat tip lucruri diferite, 598 00:26:25,320 --> 00:26:29,210 chiar dacă mama, toate în litere mici, este identic vizual. 599 00:26:29,210 --> 00:26:31,990 Deci, ce a fost răspunsul scurt de ce computerul crede 600 00:26:31,990 --> 00:26:34,500 aceste două șiruri sunt diferite? 601 00:26:34,500 --> 00:26:35,250 Da? 602 00:26:35,250 --> 00:26:36,534 >> Audiența: [inaudibil] 603 00:26:36,534 --> 00:26:37,450 David J. MALAN: dreapta. 604 00:26:37,450 --> 00:26:39,600 Deci, mama, prima data Am l scrieți în, este în curs de 605 00:26:39,600 --> 00:26:42,710 stocate undeva în My Computer lui memorie, dar într-o locație diferită 606 00:26:42,710 --> 00:26:44,690 decât a doua oara am tip în mama. 607 00:26:44,690 --> 00:26:46,580 Acum cu siguranță ar putea fi optimizat. 608 00:26:46,580 --> 00:26:49,205 Computerul ar putea fi inteligent și realiza aceste două șiruri, hei, 609 00:26:49,205 --> 00:26:49,954 Sunt identice. 610 00:26:49,954 --> 00:26:51,520 Lasă-mă să nu redundant stoca. 611 00:26:51,520 --> 00:26:54,229 Dar computerele nu fac asta optimizare dacă nu le spun să. 612 00:26:54,229 --> 00:26:56,061 Deci, în mod implicit, sunt doar de gând să ajung 613 00:26:56,061 --> 00:26:57,670 în două locuri diferite în memorie. 614 00:26:57,670 --> 00:27:01,570 Și astfel să fie mai clar, atunci când am comparat cele două șiruri, 615 00:27:01,570 --> 00:27:03,950 Primul a fost numit S, al doilea a fost numit 616 00:27:03,950 --> 00:27:08,530 t, ceea ce a fost în mod special am compararea aici pe linia 13? 617 00:27:08,530 --> 00:27:09,494 Da. 618 00:27:09,494 --> 00:27:12,390 >> Audiența: Este locul în memorie că variabila va indica. 619 00:27:12,390 --> 00:27:14,900 >> David J. MALAN: Exact, am fost compararea locul în memorie 620 00:27:14,900 --> 00:27:16,300 că aceste variabile indicat. 621 00:27:16,300 --> 00:27:20,560 Deci specific, dacă mama a fost la numar de bit 1, și 2, și 3, 622 00:27:20,560 --> 00:27:24,020 și amintiți-vă că 4-- backslash 0 trebuie să fie tot drumul la sfârșitul. 623 00:27:24,020 --> 00:27:29,420 Și cealaltă instanță de mama, m-o-m, a fost la adresa 10, 11, 12, și 13. 624 00:27:29,420 --> 00:27:33,100 Am fost comparat 1, acea adresă, locația în memorie, 625 00:27:33,100 --> 00:27:35,160 împotriva 10, care este evident, nu la fel. 626 00:27:35,160 --> 00:27:36,260 1 nu este 10. 627 00:27:36,260 --> 00:27:39,620 >> Deci acest lucru este frumos în care e destul de simplu. 628 00:27:39,620 --> 00:27:42,870 Dar e problematic în măsura în care nu pot par pentru a compara siruri de caractere. 629 00:27:42,870 --> 00:27:44,930 Deci fundamentally-- și la acest nivel scăzut, 630 00:27:44,930 --> 00:27:47,300 dacă ai vrut să pună în aplicare un program pentru a compara 631 00:27:47,300 --> 00:27:50,270 două cuvinte separate, că utilizator a introdus în calitate de, 632 00:27:50,270 --> 00:27:53,944 face ei linia de sus char pentru char, doar în termeni generali, 633 00:27:53,944 --> 00:27:55,360 ce trebuie să facem, aparent? 634 00:27:55,360 --> 00:27:57,940 Nu este suficient doar pentru a uita-te la aceste două adrese. 635 00:27:57,940 --> 00:27:58,860 Ce trebuie să facem? 636 00:27:58,860 --> 00:27:59,360 Da? 637 00:27:59,360 --> 00:28:01,120 >> Audiența: itera șirul [neauzit]. 638 00:28:01,120 --> 00:28:02,600 >> David J. MALAN: Da, hai să repeta prin șirul. 639 00:28:02,600 --> 00:28:05,808 Să folosim un pentru buclă, o buclă în timp ce, sau indiferent de ce ești cel mai confortabil cu. 640 00:28:05,808 --> 00:28:08,840 Iar dacă avem două șiruri undeva în memorie, să ne uităm la fiecare a 641 00:28:08,840 --> 00:28:11,770 primul caracter, apoi fiecare a doua caracter, apoi al treilea, al patrulea și, 642 00:28:11,770 --> 00:28:15,206 și al cincilea, până când a lovit ce valoare deosebită Sentinel? 643 00:28:15,206 --> 00:28:16,080 Audiența: [inaudibil] 644 00:28:16,080 --> 00:28:18,800 David J. MALAN: Da, backslash la zero, moment în care, fie în șir 645 00:28:18,800 --> 00:28:20,100 putem decide asta este. 646 00:28:20,100 --> 00:28:21,970 Ne-am potrivit fiecare personaj? 647 00:28:21,970 --> 00:28:22,990 Dacă nu, return false. 648 00:28:22,990 --> 00:28:24,770 Dacă este așa, return true. 649 00:28:24,770 --> 00:28:28,800 Și astfel că este exact ceea ce această versiune a programului compara-1.C face. 650 00:28:28,800 --> 00:28:31,677 Este identic cu ceea ce am sa uitat la luni cu excepția faptului că l-am 651 00:28:31,677 --> 00:28:34,760 scapat de string-- cuvânt, deși care nu are nici impact-- funcțională toate 652 00:28:34,760 --> 00:28:37,450 Fac acum este eliminarea niște roți de formare vizuale, 653 00:28:37,450 --> 00:28:40,880 dar pentru a vedea în mod clar că S și ​​T sunt adrese. 654 00:28:40,880 --> 00:28:43,020 Și asta e ceea ce steaua, asterisc, reprezintă 655 00:28:43,020 --> 00:28:46,690 este o adresă, altfel cunoscut mai mult punct de vedere tehnic ca un pointer. 656 00:28:46,690 --> 00:28:49,880 >> Așa că, atunci când declar pe s linia 9 și spune char * s, 657 00:28:49,880 --> 00:28:52,160 asta nu înseamnă că-mi dea un șir. 658 00:28:52,160 --> 00:28:56,360 Asta înseamnă da-mi o variabilă a cărei scop în viață este de a stoca o adresă. 659 00:28:56,360 --> 00:29:00,400 Pentru că eu sunt pe cale de a pune în adresa un șir în ea. 660 00:29:00,400 --> 00:29:03,500 Și într-adevăr, getString, să fie clar, nu se întoarce un șir. 661 00:29:03,500 --> 00:29:06,110 Ea nu se întoarce mama backslash la zero, în sine. 662 00:29:06,110 --> 00:29:10,005 Ce getString special și precis a reveni? 663 00:29:10,005 --> 00:29:10,880 Audiența: [inaudibil] 664 00:29:10,880 --> 00:29:14,080 David J. MALAN: unui domiciliu, adresa primului caracter 665 00:29:14,080 --> 00:29:16,070 în unele șir ea a ajuns. 666 00:29:16,070 --> 00:29:19,250 Și așa că acum vedem un cuvânt cheie special din nou. 667 00:29:19,250 --> 00:29:20,640 Și, eu aluzie la acest lucru mai devreme. 668 00:29:20,640 --> 00:29:23,620 Acest lucru se întâmplă să fie convenție bun că vom vedea nou și din nou acum. 669 00:29:23,620 --> 00:29:27,540 Am de verificare să vă asigurați că s nu este nul și T nu este nulă. 670 00:29:27,540 --> 00:29:30,100 Pentru că pe baza mea într-adevăr mențiune rapid mai devreme, 671 00:29:30,100 --> 00:29:35,510 ceea ce ar putea însemna dacă nu se întoarce getString o adresă dar N-U-L-L, care este din nou, 672 00:29:35,510 --> 00:29:36,990 o valoare specială? 673 00:29:36,990 --> 00:29:37,890 >> Audiența: Eroare. 674 00:29:37,890 --> 00:29:38,600 >> David J. MALAN: Este o eroare. 675 00:29:38,600 --> 00:29:39,550 Ceva n-a mers bine. 676 00:29:39,550 --> 00:29:41,341 Și ce de obicei s-ar putea întâmpla, în special 677 00:29:41,341 --> 00:29:45,162 cu strings-- care ar putea fi de lungime necunoscută în advance-- 678 00:29:45,162 --> 00:29:46,870 poate că de calculatoare din memorie, poate 679 00:29:46,870 --> 00:29:49,280 ați tastat într-o astfel cuvânt lung sau propoziție 680 00:29:49,280 --> 00:29:51,880 sau lipite astfel de eseu imens există nu doar suficientă memorie. 681 00:29:51,880 --> 00:29:55,340 Și astfel nu se pot întoarce getString adresa totul, 682 00:29:55,340 --> 00:29:56,620 așa că doar returneaza nimic. 683 00:29:56,620 --> 00:30:00,580 Și se spune o eroare sa întâmplat prin returnarea valorii special NULL. 684 00:30:00,580 --> 00:30:02,890 Este adresa la zero, ca să spunem așa. 685 00:30:02,890 --> 00:30:06,157 >> Acum se pare că C vine cu un funcție care face asta repetare. 686 00:30:06,157 --> 00:30:09,240 Noi nu trebuie să pună în aplicare acest lucru cu o pentru buclă sau o buclă în timp ce noi înșine. 687 00:30:09,240 --> 00:30:11,150 Putem folosi o functie, numit succint, 688 00:30:11,150 --> 00:30:15,400 se amestecă comp, sau șir compara, a cărui scop în viață este de a face exact acest lucru. 689 00:30:15,400 --> 00:30:19,990 Vă dau două indicii, două adrese, și va merge la acele adrese 690 00:30:19,990 --> 00:30:23,130 și apoi comparați scrisoare scrisoare scrisoare calitate, 691 00:30:23,130 --> 00:30:26,610 oprindu-se doar atunci când ceea ce este adevărat? 692 00:30:26,610 --> 00:30:31,540 Când ar trebui să se amestecă în mod intuitiv comp opri iterarea, doar pentru a fi clar? 693 00:30:31,540 --> 00:30:35,400 Când va atinge un backslash 0 în oricare șir, moment în care se poate decide 694 00:30:35,400 --> 00:30:38,910 a tot ceea ce potrivire, sau a existat o discrepanță? 695 00:30:38,910 --> 00:30:42,740 >> Deci, dacă vom rula acest lucru acum și să încerce jocul nostru capitalizare mica, 696 00:30:42,740 --> 00:30:49,260 asa ca compara-1, ./compare-1, și tip mama cu litere mici, atât de ori. 697 00:30:49,260 --> 00:30:50,560 Acum e același lucru. 698 00:30:50,560 --> 00:30:54,080 Și dacă o fac din nou cu litere mici și atunci poate majuscule. 699 00:30:54,080 --> 00:30:56,720 Acum, într-adevăr distinge între superior și minuscule. 700 00:30:56,720 --> 00:31:00,440 Deci, nu tot așa de greu sau magic, dar nu acum explica 701 00:31:00,440 --> 00:31:03,140 ce se întâmplă sub capota. 702 00:31:03,140 --> 00:31:07,640 >> Deci, ce mai putem extrage din acest tip de lecție? 703 00:31:07,640 --> 00:31:08,980 Deci, haideți să aruncăm o privire la acest lucru. 704 00:31:08,980 --> 00:31:15,380 Am de gând să merg mai departe și scrie Programul rapid aici numit-copie 0. 705 00:31:15,380 --> 00:31:21,594 Și acum să mergem mai departe și de fapt, hai sa facem asta: cu-copie 0, 706 00:31:21,594 --> 00:31:23,010 aruncăm o privire la ceea ce am ajuns aici. 707 00:31:23,010 --> 00:31:24,712 Eu spun în primul rând utilizatorul, spune ceva. 708 00:31:24,712 --> 00:31:26,420 Apoi am obține un șir și l-am stocat în s. 709 00:31:26,420 --> 00:31:29,810 Apoi am verifica dacă s este egal este egal cu NULL, doar întoarce 1. 710 00:31:29,810 --> 00:31:31,590 Deci, aceasta este doar standard, verificarea erorilor. 711 00:31:31,590 --> 00:31:33,112 Nimic interesant sa întâmplat. 712 00:31:33,112 --> 00:31:36,320 Și, de fapt, dacă ne scăpa de eroare verificarea, acest lucru arata ca saptamana 1 Cod 713 00:31:36,320 --> 00:31:36,985 Momentan. 714 00:31:36,985 --> 00:31:39,110 Dar am început pentru a obține o mai bine despre asta. 715 00:31:39,110 --> 00:31:43,340 >> Acum în linia 16, în urmă cu o săptămână, poate zile, chiar un cuplu sau minute în urmă, 716 00:31:43,340 --> 00:31:46,720 s-ar putea spune linia 16 este crearea unei variabile numit T 717 00:31:46,720 --> 00:31:48,219 și copiere s în ea. 718 00:31:48,219 --> 00:31:50,010 Și că este un perfect Takeaway rezonabil. 719 00:31:50,010 --> 00:31:51,560 Dar mai precis acum. 720 00:31:51,560 --> 00:31:54,190 Ce se întâmplă în linia 16? 721 00:31:54,190 --> 00:31:56,170 Ce este obtinerea copiat de la dreapta la stânga? 722 00:31:56,170 --> 00:31:56,669 Da? 723 00:31:56,669 --> 00:31:58,490 Audiența: este t obține o adresă de e? 724 00:31:58,490 --> 00:32:01,220 >> David J. MALAN: Exact, t devine adresa de e. 725 00:32:01,220 --> 00:32:05,170 Deci, să fie clar acum, dacă mă duc înapoi la faptul că exemplul anterior 726 00:32:05,170 --> 00:32:08,520 și am scoate lucru pe care l-am scris în. 727 00:32:08,520 --> 00:32:11,640 Și ce-am scris eu in-- aici S, și aici 728 00:32:11,640 --> 00:32:15,830 este ceea ce am scris undeva în memorie, mama și apoi un backslash 729 00:32:15,830 --> 00:32:17,840 0 care este adăugat pentru mine. 730 00:32:17,840 --> 00:32:23,060 Ceea ce am stocat aici, amintesc, acest lucru este în locația 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 acest lucru este ceea ce este în prezent în s. 732 00:32:24,655 --> 00:32:29,220 Deci, dacă pe linia 16, eu zic să-mi dai o altă variabilă numit T și magazin 733 00:32:29,220 --> 00:32:33,590 în puțin valoarea s, ceea ce este stocat aici nu vor mama 734 00:32:33,590 --> 00:32:35,480 ci mai degrabă doar numărul 1. 735 00:32:35,480 --> 00:32:38,520 >> Deci, dacă privim înainte în acest program acum, ce se va întâmpla? 736 00:32:38,520 --> 00:32:40,690 Deci observați că există Această funcție s-ar putea 737 00:32:40,690 --> 00:32:44,410 au folosit acest ceva timp în urmă pentru Caesar, sau Vigenere, sau poate deloc. 738 00:32:44,410 --> 00:32:48,170 Am susțin cu printf mea, eu sunt O să valorifice copie t. 739 00:32:48,170 --> 00:32:51,616 În primul rând, în linia 19, bun-simț rapid verifica, verificări strlen durata T. 740 00:32:51,616 --> 00:32:53,740 Pentru ca nu vreau încercați să valorifica ceva 741 00:32:53,740 --> 00:32:55,104 dacă nu există nici o string acolo. 742 00:32:55,104 --> 00:32:57,520 În cazul în care utilizatorul a lovit doar Enter, nu e nimic de a valorifica. 743 00:32:57,520 --> 00:33:01,100 Deci, eu nu vreau să fac linia 21. 744 00:33:01,100 --> 00:33:05,758 Deci, linia 21 este valorificarea care scrisoare, aparent, în t? 745 00:33:05,758 --> 00:33:06,514 >> Audiența: m? 746 00:33:06,514 --> 00:33:08,722 David J. MALAN: Se pare ca e copierea care unul? 747 00:33:08,722 --> 00:33:09,486 Audiența: m. 748 00:33:09,486 --> 00:33:10,450 David J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, astfel încât primul m, pentru că o notificare că sunt 750 00:33:12,685 --> 00:33:14,935 trecerea la toupper, care dacă ați mai văzut e 751 00:33:14,935 --> 00:33:16,980 doar o funcție de valorifica ca intrare sa. 752 00:33:16,980 --> 00:33:20,240 T suport de zero înseamnă da mi caracterul zero T. 753 00:33:20,240 --> 00:33:22,550 Și așa cum face acest lucru Schimbare imagine, să fie clar? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Ce trebuie să se rescrise sau modificate în ceea ce privește s și t și mama 756 00:33:29,160 --> 00:33:30,097 zero, backslash. 757 00:33:30,097 --> 00:33:31,470 >> Audiența: [inaudibil] 758 00:33:31,470 --> 00:33:34,030 >> David J. MALAN: Da, astfel încât aceasta de aici, pur și simplu 759 00:33:34,030 --> 00:33:40,860 nevoie pentru a obține schimbat sa-- repara astea-- nevoie pentru a obține schimbat la un m de capital. 760 00:33:40,860 --> 00:33:44,330 Dar acum, uita-te mai târziu, în de program, în cazul în care am imprima 761 00:33:44,330 --> 00:33:49,800 S și ​​T ca eu curat aici, ai grija ce-i va întâmpla imprimarea S și T. 762 00:33:49,800 --> 00:33:54,310 Deci, make-copie 0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Lasă-mă să mergeți mai departe și de tip în mama în toate litere mici. 764 00:33:57,140 --> 00:34:00,140 Observați cât originalul și copia au fost capitalizate. 765 00:34:00,140 --> 00:34:00,850 Ce? 766 00:34:00,850 --> 00:34:04,431 Ei bine, s și t sunt ambele indică spre, dacă vreți, aceeași bucată de memorie. 767 00:34:04,431 --> 00:34:06,930 Și sincer, acest lucru este obtinerea uninteresting-- într-adevăr faptul 768 00:34:06,930 --> 00:34:09,150 că suntem folosind adresa de zero aici. 769 00:34:09,150 --> 00:34:11,719 Adică, nu-mi pasă cu adevărat în cazul în care lucrurile se află în memorie. 770 00:34:11,719 --> 00:34:13,550 Îmi pare rău că am ștergerea un pic prea mult. 771 00:34:13,550 --> 00:34:15,674 Dar nu-mi pasă cu adevărat în cazul în care lucrurile sunt în memorie. 772 00:34:15,674 --> 00:34:18,510 Și astfel, într-adevăr, ceea ce programatori tind să cred despre 773 00:34:18,510 --> 00:34:21,080 este că atunci când vorbim despre o adresă, sau un pointer, 774 00:34:21,080 --> 00:34:22,679 cui îi pasă în cazul în care este în memorie. 775 00:34:22,679 --> 00:34:24,989 Nu-mi pasă dacă e la octet unul sau de un miliard. 776 00:34:24,989 --> 00:34:27,920 Am grijă ca această variabilă este efectiv 777 00:34:27,920 --> 00:34:29,620 arătând că la bucată de memorie. 778 00:34:29,620 --> 00:34:33,350 Și astfel, de acum înainte, mai degrabă decât echivoc peste adrese de memorie arbitrare, să 779 00:34:33,350 --> 00:34:36,710 doar începe să elaboreze indicii ca indicatori, ca săgețile. 780 00:34:36,710 --> 00:34:39,340 Deci, ce e și t într-adevăr sunt, în conformitate cu acest program, 781 00:34:39,340 --> 00:34:42,130 din cauza cum am creat t, e doar două variabile distincte 782 00:34:42,130 --> 00:34:43,840 arătând în același bucată de memorie. 783 00:34:43,840 --> 00:34:45,215 Și nu-mi pasă unde sunt. 784 00:34:45,215 --> 00:34:47,130 Deci, putem abstract departe acest detaliu. 785 00:34:47,130 --> 00:34:48,780 >> Deci, cum pot remedia acest lucru? 786 00:34:48,780 --> 00:34:54,120 Dacă vreau să scrie o versiune a exemplarului Program care de fapt copii șirul 787 00:34:54,120 --> 00:34:56,840 și valorifică numai copie, doar intuitiv, 788 00:34:56,840 --> 00:34:59,766 ce trebuie să fie o ingredient soluția noastră? 789 00:34:59,766 --> 00:35:00,640 Audiența: [inaudibil] 790 00:35:00,640 --> 00:35:01,420 David J. MALAN: Avem nevoie de un ce? 791 00:35:01,420 --> 00:35:01,820 Audiența: bucată de memorie. 792 00:35:01,820 --> 00:35:03,280 David J. MALAN: Avem nevoie de un alt bucată de memorie, nu? 793 00:35:03,280 --> 00:35:05,360 Nu știm cum să fac încă, în mod necesar. 794 00:35:05,360 --> 00:35:11,330 Dar am un fel de nevoie să se întâmple atât de acest lucru că mama original minuscule 795 00:35:11,330 --> 00:35:14,170 sfârșește în bucată suplimentar de memorie. 796 00:35:14,170 --> 00:35:19,770 Și apoi, când am schimba copia, am nu doriți să modificați această copie aici. 797 00:35:19,770 --> 00:35:26,020 Vreau în schimb să se schimbe doar acest copie astfel că originalul este neschimbat. 798 00:35:26,020 --> 00:35:27,980 >> Deci, hai sa vedem cum am putea face acest lucru. 799 00:35:27,980 --> 00:35:31,800 In copie-1, care are deja fost deposedat de comentariu, 800 00:35:31,800 --> 00:35:33,250 dar este comentat on-line. 801 00:35:33,250 --> 00:35:36,710 Noi în schimb facem following-- aceste Liniile sunt identice, adu-mi un șir 802 00:35:36,710 --> 00:35:38,340 și de apel este. 803 00:35:38,340 --> 00:35:43,500 Dar acum să ne uităm la unul dintre cele mai noastre complex, dar ultimul a complexității 804 00:35:43,500 --> 00:35:47,340 pentru o vreme, linia 16 face exact acest lucru. 805 00:35:47,340 --> 00:35:49,400 Deci, dacă dumneavoastră confortabil cu Imaginea ne-am drew-- 806 00:35:49,400 --> 00:35:51,790 da-mi o nouă bucată de memorie, copiați totul în el, 807 00:35:51,790 --> 00:35:53,730 hai sa vedem cum putem traduce ca la cod. 808 00:35:53,730 --> 00:35:59,400 >> Deci linia 16, pe partea stângă, char * T îmi dă această casetă de aici. 809 00:35:59,400 --> 00:36:00,230 Asta e tot ce face. 810 00:36:00,230 --> 00:36:03,240 Pe partea dreapta, m alloc, sau malloc, 811 00:36:03,240 --> 00:36:06,480 este alocare de memorie, super lux, un mod criptic de a spune doar 812 00:36:06,480 --> 00:36:07,640 da-mi o bucată de memorie. 813 00:36:07,640 --> 00:36:09,290 Cât de mult de memorie avem nevoie? 814 00:36:09,290 --> 00:36:10,910 Ei bine, este un fel de o expresie de mare. 815 00:36:10,910 --> 00:36:12,570 Dar să vedem ce se spune aici. 816 00:36:12,570 --> 00:36:15,940 Deci acest lucru, desigur, este da mi lungimea șir de s. 817 00:36:15,940 --> 00:36:19,094 Deci, mama ar trebui să fie ce? 818 00:36:19,094 --> 00:36:21,010 Deci doar trei, nu? Mama este de trei caractere. 819 00:36:21,010 --> 00:36:22,830 Tu nu conta backslash zero, atunci când 820 00:36:22,830 --> 00:36:25,960 vorbesc despre lungimea unui șir este De fapt, literele vizibile umane. 821 00:36:25,960 --> 00:36:28,020 Deci mama, astfel încât aceasta îmi dă 3. 822 00:36:28,020 --> 00:36:31,170 Dar stai un minut, eu sunt adăugarea de acum 1. 823 00:36:31,170 --> 00:36:34,861 De ce vreau de fapt să aloca 4 octeți și nu doar 3? 824 00:36:34,861 --> 00:36:35,360 Da? 825 00:36:35,360 --> 00:36:36,910 >> Audiența: Pentru valoarea Sentinel? 826 00:36:36,910 --> 00:36:38,951 >> David J. MALAN: Exact, pentru ca valoarea Sentinel. 827 00:36:38,951 --> 00:36:40,840 Pentru backslash de zero, Am nevoie de 4 octeți totală. 828 00:36:40,840 --> 00:36:42,870 Așa că am nevoie de lungimea din șir plus 1. 829 00:36:42,870 --> 00:36:45,400 Și apoi doar pentru measure-- bun chiar dacă pe acest sistem, 830 00:36:45,400 --> 00:36:49,390 este întotdeauna o să fie 1-- ce spun multiplica acest lucru prin dimensiunea unei char. 831 00:36:49,390 --> 00:36:51,552 Se pare că este sizeof un operator în C, care 832 00:36:51,552 --> 00:36:53,260 doar vă spune Numărul de bytes care este 833 00:36:53,260 --> 00:36:54,700 necesară pentru un anumit tip de date. 834 00:36:54,700 --> 00:36:57,740 Ea nu funcționează pentru tablouri, de obicei, uneori nu. 835 00:36:57,740 --> 00:36:59,210 Dar, în cazul general, nu. 836 00:36:59,210 --> 00:37:02,330 Dar mi va spune cât de multe bytes o char este, care se dovedește este întotdeauna 1. 837 00:37:02,330 --> 00:37:04,080 Deci acest lucru este ca înmulțirea cu 1. 838 00:37:04,080 --> 00:37:05,900 >> Line Deci super-criptic în căutarea de cod. 839 00:37:05,900 --> 00:37:09,320 Dar tot ce face este dă mi o bucată de memorie. 840 00:37:09,320 --> 00:37:13,590 Dar nu pare a fi copierea tot în această memorie? 841 00:37:13,590 --> 00:37:14,560 Inca nu. 842 00:37:14,560 --> 00:37:22,040 Și ce fac eu pe linia 22, și 23, 24, 25, ei bine, eu pur și simplu fac asta. 843 00:37:22,040 --> 00:37:23,760 Și acest lucru este un fel de lucruri vechi școală acum. 844 00:37:23,760 --> 00:37:26,010 Acest lucru este ca PSET 2, în cazul în care sunteți doar în mișcare lucrurile 845 00:37:26,010 --> 00:37:28,620 în jurul valorii de memorie, sau mai degrabă în siruri de caractere. 846 00:37:28,620 --> 00:37:31,920 >> Deci, eu sunt iterarea la 0 la lungimea șir s. 847 00:37:31,920 --> 00:37:37,820 Și mă copierea caracterul i-lea în s în caracterul i-lea în t. 848 00:37:37,820 --> 00:37:41,820 Și pentru că, programator, a făcut sigur de a aloca exact cât mai multe bytes 849 00:37:41,820 --> 00:37:44,600 ca am nevoie, e perfect -unu la unu relație. 850 00:37:44,600 --> 00:37:47,060 Și am copia mama în litere mici pentru unul nou. 851 00:37:47,060 --> 00:37:50,170 Și apoi în cele din urmă, fac această linie. 852 00:37:50,170 --> 00:37:54,637 Și astfel efectul este singurul pentru a valorifica acest T aici. 853 00:37:54,637 --> 00:37:56,470 Astfel încât o mulțime de a absorbi, dar dacă tocmai ați lua în considerare 854 00:37:56,470 --> 00:37:58,220 ce se întâmplă cu adevărat pe sub capota 855 00:37:58,220 --> 00:38:00,880 este doar în mișcare acestea bytes jur, tot ce 856 00:38:00,880 --> 00:38:06,617 este necesară pentru a rezolva această problemă este doar pentru a ne da acest bucată de memorie. 857 00:38:06,617 --> 00:38:08,450 Acum, cu riscul de a copleșitoare, lasă-mă să arăt 858 00:38:08,450 --> 00:38:13,200 un alt exemplu care este aproape identice, exceptând această singură 859 00:38:13,200 --> 00:38:14,350 linie de cod. 860 00:38:14,350 --> 00:38:18,870 Deci aceasta este versiunea hacker acestui program, dacă vreți. 861 00:38:18,870 --> 00:38:21,050 Dar hai să distileze in ceea ce se întâmplă. 862 00:38:21,050 --> 00:38:28,920 Linie 24 folosit pentru a fi acest T Suport i devine s suport i. 863 00:38:28,920 --> 00:38:33,370 Acum, eu sunt schimbarea asta Star T mult mai criptic 864 00:38:33,370 --> 00:38:36,280 plus 1 este egal cu stea s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Deci, ce se întâmplă și de ce avem un caracter stea? 866 00:38:38,702 --> 00:38:41,410 Am văzut steaua înainte, și este folosit în mod diferit aici. 867 00:38:41,410 --> 00:38:45,490 Am văzut anterior char *, acum văd O stea de la început, și asta e în regulă. 868 00:38:45,490 --> 00:38:48,190 Pentru că se pare că ne-am un fel de poate deduce doar 869 00:38:48,190 --> 00:38:50,280 de la cele mai întâi principii ce se întâmplă. 870 00:38:50,280 --> 00:38:53,860 Deci, doar pentru a fi clar, ceea ce este s? 871 00:38:53,860 --> 00:38:55,052 Săptămâna trecută, a fost un șir. 872 00:38:55,052 --> 00:38:56,260 Asta nu mai este suficientă. 873 00:38:56,260 --> 00:38:57,690 Ce este e, mai exact? 874 00:38:57,690 --> 00:38:58,590 >> Audiența: [inaudibil] 875 00:38:58,590 --> 00:38:59,881 >> David J. MALAN: Este un pointer. 876 00:38:59,881 --> 00:39:02,610 E adresa primul caracter tastat noi în. 877 00:39:02,610 --> 00:39:04,780 OK, ceea ce este T? 878 00:39:04,780 --> 00:39:05,660 >> Audiența: [inaudibil] 879 00:39:05,660 --> 00:39:07,950 >> David J. MALAN: a adresa primului octet 880 00:39:07,950 --> 00:39:10,490 în T, care bucată de memorie realocate. 881 00:39:10,490 --> 00:39:14,720 Deci, se dovedește că, atunci când ne-am repeta de la 0 la până la șirul 882 00:39:14,720 --> 00:39:17,424 length-- în primul rând, m-am începe de la 0, deoarece 883 00:39:17,424 --> 00:39:18,840 de această școală veche de lucru bucla. 884 00:39:18,840 --> 00:39:22,400 Deci, doar pentru simplitate, să presupune că prima linie de cod 885 00:39:22,400 --> 00:39:23,760 este de fapt doar asta, nu. 886 00:39:23,760 --> 00:39:26,080 Dacă i este zero, adăugând la zero la ceva probabil 887 00:39:26,080 --> 00:39:27,540 nu va avea un efect. 888 00:39:27,540 --> 00:39:28,560 >> Deci, ce este acest proverb? 889 00:39:28,560 --> 00:39:31,600 Se pare că vedeta În acest context, operatorul 890 00:39:31,600 --> 00:39:33,700 este dereference Operatorul, care este doar 891 00:39:33,700 --> 00:39:37,530 un mod fantezist de a spune merge la următoarea adresă. 892 00:39:37,530 --> 00:39:42,080 Deci, dacă s este adresa primului caracter în această bucată de memorie, 893 00:39:42,080 --> 00:39:43,630 * s mijloc acolo. 894 00:39:43,630 --> 00:39:45,630 Și pentru că ne-am desenat imaginea în acest fel, 895 00:39:45,630 --> 00:39:47,430 puteți adopta în urma model mental. 896 00:39:47,430 --> 00:39:51,030 Dacă acest lucru este s, și spuneți * s * s, un fel de jgheaburi și scări, 897 00:39:51,030 --> 00:39:54,540 dacă vă aduceți aminte de joc din copilărie, este ca urmați că săgeata și du-te 898 00:39:54,540 --> 00:39:55,570 la adresa. 899 00:39:55,570 --> 00:39:57,080 >> * t este același lucru. 900 00:39:57,080 --> 00:39:59,855 Deci, începe aici, du-te la bucată său. 901 00:39:59,855 --> 00:40:03,350 Nu pot doar trage pe acest ecran în acest fel. 902 00:40:03,350 --> 00:40:05,560 * T înseamnă a merge aici. 903 00:40:05,560 --> 00:40:08,830 Si apoi, pentru bucla este doar spunând muta acest personaj aici, 904 00:40:08,830 --> 00:40:11,330 muta acest personaj aici, muta acest personaj aici. 905 00:40:11,330 --> 00:40:12,890 Dar cum fac asta incrementare? 906 00:40:12,890 --> 00:40:15,430 Trebuie să anulați ceea ce tocmai am șters. 907 00:40:15,430 --> 00:40:18,140 Aceasta este ceea ce se numește, în general, aritmetică pointer, care 908 00:40:18,140 --> 00:40:20,040 înseamnă matematica adrese. 909 00:40:20,040 --> 00:40:22,460 >> Dacă, în acest timp de buclă, Mă tot incrementare I, 910 00:40:22,460 --> 00:40:26,880 și s este o adresă și t este un adresa, dacă am păstra adăugarea de 1, 911 00:40:26,880 --> 00:40:31,406 Asta înseamnă că păstreze în mișcare înainte, și înainte, și transmite în memorie. 912 00:40:31,406 --> 00:40:34,030 E ca și cum Oxford Street, stradă că clădirea CS este pe. 913 00:40:34,030 --> 00:40:36,490 Clădirile CS este de 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Deci, dacă ar fi să faci 33 Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 pe care le aduce la 34 Oxford Stradă, apoi 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 apoi 36 Oxford Street, indiferent de cei clădiri de fapt sunt - în cazul în care acestea există. 917 00:40:46,380 --> 00:40:50,540 Și așa, asta e tot ce facem aici cu pointer aritmetică. 918 00:40:50,540 --> 00:40:53,820 >> Deci, este un mod foarte arcane de a ne exprima. 919 00:40:53,820 --> 00:40:56,160 Dar toate acestea se întâmplă sub capota 920 00:40:56,160 --> 00:40:59,330 este doar ca urmare a acestor adrese, ca urmare a unei hartă, dacă vreți, 921 00:40:59,330 --> 00:41:02,692 sau ca urmare a săgețile ca am desenat pe ecran. 922 00:41:02,692 --> 00:41:04,910 OK, o mulțime de digerat. 923 00:41:04,910 --> 00:41:10,410 Orice întrebare pe sintaxa, concepte, indicii, malloc, sau altele asemenea. 924 00:41:10,410 --> 00:41:11,480 Da, aici în primul rând. 925 00:41:11,480 --> 00:41:13,755 >> Audiența: Deci, unde care spune * T este egal cu toupper * t, 926 00:41:13,755 --> 00:41:15,575 este că va valorifica toate literele sau doar-- 927 00:41:15,575 --> 00:41:17,283 >> David J. MALAN: Ah, foarte bun întrebare. 928 00:41:17,283 --> 00:41:19,805 Deci, în această linie de aici, 31, se întâmplă acest lucru pentru a valorifica 929 00:41:19,805 --> 00:41:21,430 prima literă sau toate literele. 930 00:41:21,430 --> 00:41:23,460 Deci, haideți să răspundă că, mergând înapoi la principiile de baza. 931 00:41:23,460 --> 00:41:26,168 Și primele principii de aici mă refer du-te la definițiile de bază 932 00:41:26,168 --> 00:41:27,000 de ce este implicat. 933 00:41:27,000 --> 00:41:29,770 Deci toupper o funcție care valorifică un char. 934 00:41:29,770 --> 00:41:30,530 Asta e tot. 935 00:41:30,530 --> 00:41:36,740 * T înseamnă a merge la first-- du-te la adresa din or. 936 00:41:36,740 --> 00:41:40,350 Deci, în imagine, în cazul în care acest lucru este bucată de memorie am alocat cu malloc, 937 00:41:40,350 --> 00:41:43,310 iar acest lucru este t, * t înseamnă du-te aici. 938 00:41:43,310 --> 00:41:46,710 >> Între timp, te trece această valoare, litere mici m 939 00:41:46,710 --> 00:41:50,040 la toupper, vei primi înapoi de capital M, în cazul în care sunt ai pune? 940 00:41:50,040 --> 00:41:52,410 Te-l pune în aceeași locație. 941 00:41:52,410 --> 00:41:55,540 Și astfel de logică a celor care definiții de bază este doar 942 00:41:55,540 --> 00:41:58,792 valorificarea prima literă dacă nu repeta cu I sau o 943 00:41:58,792 --> 00:42:02,000 pentru buclă sau o buclă în timp ce, nu va de a face ceva mai mult decât o cere. 944 00:42:02,000 --> 00:42:02,583 Buna intrebare. 945 00:42:02,583 --> 00:42:03,237 Da? 946 00:42:03,237 --> 00:42:05,369 >> Audiența: De ce ai folosi dereference metodă, mai degrabă decât 947 00:42:05,369 --> 00:42:05,979 matrice? 948 00:42:05,979 --> 00:42:07,395 >> David J. MALAN: Ah, bună întrebare. 949 00:42:07,395 --> 00:42:10,672 De ce ai folosi dereference Metoda locul metodei matrice? 950 00:42:10,672 --> 00:42:12,130 Nici un motiv special, să fiu sincer. 951 00:42:12,130 --> 00:42:15,290 Și, de fapt, pentru acest fel de exemplu, drept, 952 00:42:15,290 --> 00:42:17,556 Eu doar argumentând a face program mai complicat, 953 00:42:17,556 --> 00:42:19,680 mai multe ochii sunt geamuri peste, oamenii sunt verificarea 954 00:42:19,680 --> 00:42:22,830 pentru că acest lucru pare super-Arcane, dar chiar dacă face același lucru. 955 00:42:22,830 --> 00:42:26,695 Și astfel, sincer, acest lucru este un soluție inutil vizual complex 956 00:42:26,695 --> 00:42:27,320 la această problemă. 957 00:42:27,320 --> 00:42:29,580 >> E încă un design bun, cinci din cinci pentru proiectare, 958 00:42:29,580 --> 00:42:33,140 fie că este vorba în suportul notație sau notația pointer. 959 00:42:33,140 --> 00:42:36,299 Dar-- mai ales când ajungem mai târziu, în cursul în PSET 5 960 00:42:36,299 --> 00:42:39,340 când ne-am pune în aplicare acea dicționar care Am menționat câteva times-- 961 00:42:39,340 --> 00:42:42,300 vom pasa de fapt, despre adresele de memorie de nivel scăzut 962 00:42:42,300 --> 00:42:44,140 că ne înțelegem cu adevărat ce se intampla. 963 00:42:44,140 --> 00:42:48,300 >> Dar, pentru moment, se pare că această linie de cod paranteze pătrate aici 964 00:42:48,300 --> 00:42:49,900 nu există cu adevărat. 965 00:42:49,900 --> 00:42:52,230 Acestea sunt ceea ce se numește zahăr sintactic, care 966 00:42:52,230 --> 00:42:58,390 este doar un mod ciudat de a spune rece compilator convertește paranteze pătrate pentru a fi 967 00:42:58,390 --> 00:43:00,420 această expresie matematică. 968 00:43:00,420 --> 00:43:02,660 Deci, este o convenție umană pentru a putea scrie doar 969 00:43:02,660 --> 00:43:04,220 aceste paranteze foarte user-friendly. 970 00:43:04,220 --> 00:43:06,850 Dar ceea ce compilator, zăngănit, este de a face într-adevăr orice moment 971 00:43:06,850 --> 00:43:10,970 scrii ce evidențiate în linie 24, sub capota este într-adevăr 972 00:43:10,970 --> 00:43:12,330 conversia la acest lucru. 973 00:43:12,330 --> 00:43:16,200 E mai plăcut ca un om să citească și să scrie cod ca linia 24. 974 00:43:16,200 --> 00:43:18,530 Dar în cele din urmă cei roți de formare prea se desprinde 975 00:43:18,530 --> 00:43:21,780 când confortul propriu devine mai puternic. 976 00:43:21,780 --> 00:43:27,240 >> În regulă, deci amintesc atunci că acest era genul de cea mai mare problema 977 00:43:27,240 --> 00:43:27,807 am fugit în. 978 00:43:27,807 --> 00:43:30,640 Și asta e ceea ce a declanșat acest întreg al naibii de conversație despre indicii, 979 00:43:30,640 --> 00:43:32,340 și adrese, și lucruri de copiere. 980 00:43:32,340 --> 00:43:35,410 A fost pentru că am împiedicat peste această problemă prost, prost, care 981 00:43:35,410 --> 00:43:38,830 Am implementat logically-- cu Lauren aici pe demo si suc de portocale 982 00:43:38,830 --> 00:43:43,770 în milk-- o perfect Funcția algoritmic corectă 983 00:43:43,770 --> 00:43:47,010 pompare două variabile " valori, dar la naiba lucru 984 00:43:47,010 --> 00:43:50,550 nu au avut nici persistente, sau permanent, un efect asupra codul meu. 985 00:43:50,550 --> 00:43:51,820 >> Și de ce a fost asta? 986 00:43:51,820 --> 00:43:54,650 Într-un cuvânt, de ce este acest punerea în aplicare a de swap 987 00:43:54,650 --> 00:43:58,740 logic corect, dar nu are niciun impact pe variabilele care sunt transmise la acesta, 988 00:43:58,740 --> 00:44:01,119 ca X și Y pentru principal? 989 00:44:01,119 --> 00:44:02,410 Care a fost esența problemei? 990 00:44:02,410 --> 00:44:02,909 Da? 991 00:44:02,909 --> 00:44:05,532 Audiența: Deoarece variabila făcut copii ale variabilă în trecere 992 00:44:05,532 --> 00:44:06,240 prin funcția. 993 00:44:06,240 --> 00:44:09,060 >> David J. MALAN: Exact, când treci variabile într-o funcție, sau argumente 994 00:44:09,060 --> 00:44:11,030 într-o funcție, sunt a trecut prin copiere, care 995 00:44:11,030 --> 00:44:14,770 inseamna ca veti obtine un identic în căutarea model de biți pentru ambele x și y, 996 00:44:14,770 --> 00:44:15,955 chemat aici a și b. 997 00:44:15,955 --> 00:44:18,080 Și puteți face nimic vrei cu aceste exemplare, 998 00:44:18,080 --> 00:44:20,657 dar ei vor avea nici o efect asupra funcției de asteptare. 999 00:44:20,657 --> 00:44:22,990 Și, de fapt, ne-am tras ca imagine pe ecran, retragerea 1000 00:44:22,990 --> 00:44:25,520 ultima dată, prin care, dacă chiar cred ca despre ceea ce este 1001 00:44:25,520 --> 00:44:28,570 întâmplă sub hood-- dacă aceasta este memoria computerului, 1002 00:44:28,570 --> 00:44:31,650 și aici este bucata de memorie utilizat pentru principal, 1003 00:44:31,650 --> 00:44:34,020 aceasta este bucata de memorie utilizat pentru swap, 1004 00:44:34,020 --> 00:44:37,090 și are astfel încât, chiar dacă principalul două variabile, x și y, 1005 00:44:37,090 --> 00:44:41,840 schimb ar putea avea în căutarea identice Valorile, ambele fiind 1 și 2, 1006 00:44:41,840 --> 00:44:44,520 dar sunt complet diferite bucăți de memorie. 1007 00:44:44,520 --> 00:44:46,130 >> Deci, avem nevoie de o soluție pentru acest lucru. 1008 00:44:46,130 --> 00:44:51,580 Și sincer, s-ar părea că ne acum au o soluție la această problemă, drept. 1009 00:44:51,580 --> 00:44:55,760 Dacă avem acum posibilitatea de a manipula lucrurile prin intermediul adreselor 1010 00:44:55,760 --> 00:44:59,310 și, un fel de jgheaburi și scări stil, urmați aceste săgeți 1011 00:44:59,310 --> 00:45:02,820 și du-te oriunde vrem în memorie, nu am putea 1012 00:45:02,820 --> 00:45:06,220 rezolva această problemă prin trecerea de la principal pentru a schimba 1013 00:45:06,220 --> 00:45:09,650 nu valorile pe care le doriți să swap, dar doar intuitiv 1014 00:45:09,650 --> 00:45:11,630 ceea ce am putea trece de a schimba în schimb? 1015 00:45:11,630 --> 00:45:12,620 >> [Interpunerea VOCI] 1016 00:45:12,620 --> 00:45:15,244 >> David J. MALAN: De ce nu ne-am să-l dați adresele, nu? 1017 00:45:15,244 --> 00:45:17,470 De ce nu ne-am da de swap o hartă a comorii, dacă vreți, 1018 00:45:17,470 --> 00:45:20,950 că ea duce la valori x și y reale. 1019 00:45:20,950 --> 00:45:24,340 Să schimb, schimba de fapt aceste biți originale, mai degrabă decât 1020 00:45:24,340 --> 00:45:26,797 doar in trecere copii ale biți. 1021 00:45:26,797 --> 00:45:29,130 Și astfel, de fapt, asta e ceea ce-i va fi soluția. 1022 00:45:29,130 --> 00:45:31,899 Această versiune este aici clar rău și defecte. 1023 00:45:31,899 --> 00:45:35,190 Și acum, la prima vedere, pare doar ca am adaugat o grămadă de stele aleatoriu 1024 00:45:35,190 --> 00:45:37,106 și a trecut degetele noastre că ar compila. 1025 00:45:37,106 --> 00:45:38,460 Dar, s-ar compila acum. 1026 00:45:38,460 --> 00:45:40,090 >> Dar să vedem ce înseamnă aceste lucruri. 1027 00:45:40,090 --> 00:45:43,990 Și, din păcate, autorii C-ar fi putut alege un alt simbol 1028 00:45:43,990 --> 00:45:46,380 pentru a face acest lucru un pic clară, dar operatorul stea 1029 00:45:46,380 --> 00:45:48,610 are sens diferit în contexte diferite. două 1030 00:45:48,610 --> 00:45:50,890 Și am văzut amândoi, dar să se facă distincția. 1031 00:45:50,890 --> 00:45:55,310 >> Deci până la partea de sus acolo, când m-am schimbat o și b 1032 00:45:55,310 --> 00:46:00,470 de a fi int în rău Versiunea de int stele, a și b, 1033 00:46:00,470 --> 00:46:01,740 anterior, au fost numere întregi. 1034 00:46:01,740 --> 00:46:05,752 Ce sunt a și b acum în bun, versiunea verde? 1035 00:46:05,752 --> 00:46:06,900 Sunt adrese. 1036 00:46:06,900 --> 00:46:09,610 Adresele de ceea ce, să fie clar? 1037 00:46:09,610 --> 00:46:10,770 Adresele numere întregi. 1038 00:46:10,770 --> 00:46:12,520 Deci faptul că eu sunt spunând mijloace stele Int 1039 00:46:12,520 --> 00:46:15,440 aceasta este adresa de un număr întreg, în special. 1040 00:46:15,440 --> 00:46:19,120 >> Deci, acum a observa in linii de cod, ceva sa schimbat prea. 1041 00:46:19,120 --> 00:46:22,770 tmp rămâne la fel, pentru că e doar un număr întreg temporar, 1042 00:46:22,770 --> 00:46:24,110 nu magie memorie acolo. 1043 00:46:24,110 --> 00:46:26,370 Dar un are nevoie de acum o stea. 1044 00:46:26,370 --> 00:46:28,560 Și, de fapt, fiecare alte menționarea a și b, 1045 00:46:28,560 --> 00:46:31,780 observa că tot ce e schimbarea de la roșu la verde 1046 00:46:31,780 --> 00:46:34,209 este că eu sunt prefixarea acele variabile cu stele. 1047 00:46:34,209 --> 00:46:35,750 Pentru că nu vreau să copiați a și b. 1048 00:46:35,750 --> 00:46:40,350 Pentru că dacă am copia A și B și de swap a și b, ceea ce eu, de fapt schimbarea? 1049 00:46:40,350 --> 00:46:43,760 Doar adrese, vreau să schimb ceea ce este la acele adrese. 1050 00:46:43,760 --> 00:46:44,860 Vreau acolo. 1051 00:46:44,860 --> 00:46:48,000 Și astfel operatorul stea în interiorul funcției mele, 1052 00:46:48,000 --> 00:46:51,700 nu în interiorul listei de parametri, înseamnă a merge la acele adrese 1053 00:46:51,700 --> 00:46:54,490 și schimba de fapt aceste valori. 1054 00:46:54,490 --> 00:46:56,500 >> Deci, ceea ce face imagine acum arata ca in loc. 1055 00:46:56,500 --> 00:47:03,250 Ei bine, dacă în loc am trece in pentru A și B nu 1 și 2-- 1056 00:47:03,250 --> 00:47:05,790 De fapt, am nevoie pentru a adăuga un alt Definiția aici. 1057 00:47:05,790 --> 00:47:09,030 Deci să presupunem că această bucată de memorie este la locație 10. 1058 00:47:09,030 --> 00:47:12,960 >> Acest lucru este în locația 11, dar acest lucru este un pic de o simplificare, 1059 00:47:12,960 --> 00:47:18,900 Acum am două opțiuni îmi trec X și Y sau pot trece adresele lor? 1060 00:47:18,900 --> 00:47:22,500 Dacă trec adresele lor ca aceasta, eu doar 1061 00:47:22,500 --> 00:47:25,390 acum trebuie să pună în aplicare de swap pe codul verde 1062 00:47:25,390 --> 00:47:29,080 astfel încât atunci când acesta vede o și atunci când vede b, aceasta nu copiază doar a și b 1063 00:47:29,080 --> 00:47:30,540 și pentru a muta lapte și suc de portocale. 1064 00:47:30,540 --> 00:47:32,664 Lapte și suc de portocale metaforă sparge acum în jos, 1065 00:47:32,664 --> 00:47:35,060 pentru că acestea sunt cupe de hărți lichide și nu. 1066 00:47:35,060 --> 00:47:37,750 Noi în schimb nevoie pentru a merge pentru a aborda 10 si ne-am 1067 00:47:37,750 --> 00:47:42,420 nevoie pentru a merge pentru a aborda 11, și apoi efectuați această logică swapping. 1068 00:47:42,420 --> 00:47:45,580 >> Deci logica este aceeași, dar avem nevoie de o modalitate ușor diferită 1069 00:47:45,580 --> 00:47:47,160 de a accesa aceste variabile. 1070 00:47:47,160 --> 00:47:52,400 Și astfel în cele din urmă, ceea ce Programul trebuie să arate ca este aceasta. 1071 00:47:52,400 --> 00:47:56,610 În swap.c literalmente copiate și lipite versiunea verde. 1072 00:47:56,610 --> 00:47:58,450 Dar am nevoie pentru a face o schimbare. 1073 00:47:58,450 --> 00:48:00,180 Nu este suficient doar să se schimbe de swap. 1074 00:48:00,180 --> 00:48:03,830 Ce alte linie de cod am nevoie pentru a schimba? 1075 00:48:03,830 --> 00:48:04,330 Da? 1076 00:48:04,330 --> 00:48:05,770 >> Audiența: În cazul în care este nevoie de argumentele. 1077 00:48:05,770 --> 00:48:07,603 >> David J. MALAN: În cazul în care este nevoie de argument. 1078 00:48:07,603 --> 00:48:09,985 Deci, dacă am derulați până la principal, am Nu poți să treci în x și y, 1079 00:48:09,985 --> 00:48:12,820 și, promit, ultimul bucată de noi sintaxă astăzi. 1080 00:48:12,820 --> 00:48:17,200 Am nevoie pentru a trece în X și nu y ci adresa lui x și y. 1081 00:48:17,200 --> 00:48:20,400 Și se pare că, simbolul că autorii au ales C 1082 00:48:20,400 --> 00:48:23,860 este dacă utilizați un ampersand aici, nu sa se confunda cu ampersand biți, 1083 00:48:23,860 --> 00:48:27,130 dacă utilizați un ampersand aici și un ampersand aici, 1084 00:48:27,130 --> 00:48:29,570 acest cifrele pentru tine, Care este adresa lui x, 1085 00:48:29,570 --> 00:48:31,740 poate e de 10, ceea ce este adresa y, poate e 1086 00:48:31,740 --> 00:48:35,400 11, și trece cele din loc. 1087 00:48:35,400 --> 00:48:37,210 >> Astfel încât o mulțime de a absorbi toate odată. 1088 00:48:37,210 --> 00:48:40,190 Dar să vedem acum rapid în noastre de patru minute rămase 1089 00:48:40,190 --> 00:48:42,150 în cazul în care lucrurile pot merge gresit. 1090 00:48:42,150 --> 00:48:45,120 Și, ca o paranteza, de fapt, Am luat această imagine, 1091 00:48:45,120 --> 00:48:46,920 TF a luat această imagine cu un an sau doi în urmă. 1092 00:48:46,920 --> 00:48:49,190 Astfel încât acesta este în colțul din spate de Eliot sala de mese. 1093 00:48:49,190 --> 00:48:52,310 Indicii sunt, probabil, cel mai greu subiect care ne acoperă în CS50. 1094 00:48:52,310 --> 00:48:54,810 Deci, dacă vă faceți griji genul de panta este ca poate e 1095 00:48:54,810 --> 00:48:56,770 mai mult de un stick de hochei ca aceasta, realiza 1096 00:48:56,770 --> 00:49:00,160 suntem un fel de aproape un vârf în punct de vedere al complexității conceptual. 1097 00:49:00,160 --> 00:49:02,300 >> Și aduc această foto, pentru că îți jur 1098 00:49:02,300 --> 00:49:05,920 la Dumnezeu, în toamna 1996, când am luat CS50 cu colegii mei de predare, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, el mi-a așezat jos în colț al D. Hall Eliot peste masa de prânz, 1100 00:49:09,620 --> 00:49:12,330 sau cina, sau ceva pentru a încerca să mă ajute să înțeleagă indicii. 1101 00:49:12,330 --> 00:49:16,520 Și acest lucru este în cazul în care am fost săptămâni după a fost introdus în curs, atunci când 1102 00:49:16,520 --> 00:49:18,170 Am înțeles în cele din urmă indicii. 1103 00:49:18,170 --> 00:49:20,590 Și sunt plini de speranta ca acest va faceți clic pe departe mai repede pentru tine. 1104 00:49:20,590 --> 00:49:23,540 Dar realiza acest absolut printre subiecte mai sofisticate 1105 00:49:23,540 --> 00:49:24,420 ne-am uitat la. 1106 00:49:24,420 --> 00:49:25,819 Dar e printre cele mai puternice. 1107 00:49:25,819 --> 00:49:28,860 Și când l, e într-adevăr tot doar de gând să vină în cele din urmă împreună. 1108 00:49:28,860 --> 00:49:31,460 Deci, fiți siguri că nu Trebuie să toate chiuveta astăzi. 1109 00:49:31,460 --> 00:49:32,980 >> Deci, aici e ultimul program ne vom uita la. 1110 00:49:32,980 --> 00:49:35,605 Și vom termina cu un rapide trei minute de claymation 1111 00:49:35,605 --> 00:49:37,030 realizat de prietenul nostru, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Iata un program, care în primele două Liniile declară un X variabilă și y. 1113 00:49:41,440 --> 00:49:44,780 Ambele din care sunt adrese de numere întregi, indicii AKA. 1114 00:49:44,780 --> 00:49:48,125 Apoi am aloca suficient memorie pentru a stoca un int 1115 00:49:48,125 --> 00:49:51,344 și stoca adresa de care memoria X. 1116 00:49:51,344 --> 00:49:53,260 Deci, e mai simplu decât exemplul înainte. 1117 00:49:53,260 --> 00:49:56,100 Dă-mi patru bytes de memorie, care este dimensiunea de un int, 1118 00:49:56,100 --> 00:49:58,000 și a pus că adresa în X. 1119 00:49:58,000 --> 00:50:01,070 Această linie înseamnă aici du-te la adresa din X 1120 00:50:01,070 --> 00:50:05,270 și a pus sensul viață, numărul 42 acolo. 1121 00:50:05,270 --> 00:50:07,710 Dar această linie mă îngrijorează. 1122 00:50:07,710 --> 00:50:12,620 Stele y înseamnă a merge la adresa din y, și a pus numărul ghinionist 13 acolo. 1123 00:50:12,620 --> 00:50:15,780 De ce este periculos, în acest moment în story-- deși a spus rapid 1124 00:50:15,780 --> 00:50:17,980 în câteva minute noastre de declin here-- ce este rău 1125 00:50:17,980 --> 00:50:19,660 pentru mine să spun, du-te la adresa din y? 1126 00:50:19,660 --> 00:50:21,077 >> Audiența: Nu aveți [neauzit]. 1127 00:50:21,077 --> 00:50:22,910 David J. MALAN: nu am pune nimic în y. 1128 00:50:22,910 --> 00:50:25,520 Deci, ce este valoarea y, în acest moment în povestea? 1129 00:50:25,520 --> 00:50:26,570 Nu avem nici o idee. 1130 00:50:26,570 --> 00:50:29,190 Este o valoare de gunoi și nici nu știe Binky. 1131 00:50:29,190 --> 00:50:32,532 Dacă am putea încheia pe această notă. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> Hei, Binky, trezește-te. 1134 00:50:36,500 --> 00:50:39,140 E timpul pentru distracție pointer. 1135 00:50:39,140 --> 00:50:40,210 >> -Ce-i asta? 1136 00:50:40,210 --> 00:50:41,690 Aflați mai multe despre indicii? 1137 00:50:41,690 --> 00:50:43,570 Oh, Goody. 1138 00:50:43,570 --> 00:50:46,600 >> Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii. 1139 00:50:46,600 --> 00:50:47,380 >> -BINE. 1140 00:50:47,380 --> 00:50:51,120 Acest cod alocă două indicii care pot indica întregi. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Bine am vedea doi pointeri, dar ele 1142 00:50:53,557 --> 00:50:55,140 nu par să fie îndreptată la nimic. 1143 00:50:55,140 --> 00:50:55,970 >> -Asa este. 1144 00:50:55,970 --> 00:50:58,100 Inițial indicative nu indică nimic. 1145 00:50:58,100 --> 00:51:00,950 Lucrurile pe care le indica sunt numit pointees și setarea le 1146 00:51:00,950 --> 00:51:02,330 este o etapă separată. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, dreapta, dreapta. 1148 00:51:03,210 --> 00:51:03,940 Am știut că. 1149 00:51:03,940 --> 00:51:05,730 Cele pointees sunt separate. 1150 00:51:05,730 --> 00:51:08,310 Deci, cum a face tu aloce un pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Ei bine, acest cod Alocă un nou pointee întreg, 1152 00:51:11,960 --> 00:51:15,050 și Acesta stabilește partea X pentru a indica o. 1153 00:51:15,050 --> 00:51:16,240 >> Hei, care arată mai bine. 1154 00:51:16,240 --> 00:51:17,743 Deci, face face ceva. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Voi dereference indicatorul x la stoca numărul 42 în pointee său. 1156 00:51:23,580 --> 00:51:27,130 Pentru acest truc, voi avea nevoie de meu baghetă magică de dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> Baghetă magică tău de dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh, asta, asta e minunat. 1159 00:51:32,310 --> 00:51:34,270 >> -Asta Este ceea ce codul pare. 1160 00:51:34,270 --> 00:51:35,970 Voi doar înființat numărul si-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Hei, uita-te acolo merge. 1163 00:51:39,140 --> 00:51:43,980 Deci, a face un dereference pe X urmează săgeata pentru a accesa pointee sale. 1164 00:51:43,980 --> 00:51:46,150 În acest caz, pentru a stoca 42 acolo. 1165 00:51:46,150 --> 00:51:50,700 Hei, încercați să utilizați o pentru a stoca numărul 13 prin cealaltă indicatorul, y. 1166 00:51:50,700 --> 00:51:51,840 >> -BINE. 1167 00:51:51,840 --> 00:51:56,270 Mă duc doar aici la Y, și pentru a obține numărul de 13 infiintarea. 1168 00:51:56,270 --> 00:52:00,380 Și apoi să ia bagheta de dereferencing și doar-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hei, care nu au de lucru. 1171 00:52:04,080 --> 00:52:06,470 Spune, uh, Binky, eu nu cred dereferencing 1172 00:52:06,470 --> 00:52:10,850 Y este o idee bună, pentru că stabilirea până pointee este o etapă separată. 1173 00:52:10,850 --> 00:52:12,480 Și nu cred că am făcut-o vreodată. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Bun punct. 1175 00:52:14,620 --> 00:52:19,810 >> Da, am alocat pointer, y, dar nu am setat pentru a indica o pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Foarte atent. 1177 00:52:21,590 --> 00:52:23,215 Hei, arăți bine acolo, Binky. 1178 00:52:23,215 --> 00:52:26,390 Poți să-l repara, astfel încât punctele de Y la aceeași pointee ca x. 1179 00:52:26,390 --> 00:52:29,290 >> -Sigur, Am folosi bagheta magică meu de cesiune pointer. 1180 00:52:29,290 --> 00:52:31,970 >> -este Că va fi o problemă, ca înainte? 1181 00:52:31,970 --> 00:52:33,790 >> Nu, acest lucru nu atinge pointees. 1182 00:52:33,790 --> 00:52:35,840 Se schimbă doar un pointer pentru a indica aceeași thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Popping SOUND] 1184 00:52:36,465 --> 00:52:37,450 --as altul. 1185 00:52:37,450 --> 00:52:38,440 >> Oh, văd. 1186 00:52:38,440 --> 00:52:41,200 Acum puncte Y la același loc ca și x. 1187 00:52:41,200 --> 00:52:42,950 Deci, așteptați, acum y este fix. 1188 00:52:42,950 --> 00:52:44,110 Ea are o pointee. 1189 00:52:44,110 --> 00:52:47,779 Astfel, puteți încerca bagheta de dereferencing din nou pentru a trimite 13 supra. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, aici merge. 1191 00:52:51,110 --> 00:52:52,330 >> Hei, uita-te la asta. 1192 00:52:52,330 --> 00:52:53,570 Acum dereferencing lucrări pe y. 1193 00:52:53,570 --> 00:52:57,900 Și pentru că indicii sunt de partajare că unul pointee, amândoi văd 13. 1194 00:52:57,900 --> 00:52:59,952 >> Da, de partajare, uh, orice. 1195 00:52:59,952 --> 00:53:01,535 Deci, vom schimba locurile acum? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, uita-te nu mai avem timp. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Doar Amintesc cele trei reguli indicatorul. 1199 00:53:06,520 --> 00:53:09,550 Numărul 1, structura de bază este că aveți un pointer, 1200 00:53:09,550 --> 00:53:11,630 și-l arată pe la un pointee. 1201 00:53:11,630 --> 00:53:13,740 Dar indicatorul și pointee sunt separate. 1202 00:53:13,740 --> 00:53:15,620 Și comună eroare este de a crea un pointer 1203 00:53:15,620 --> 00:53:18,000 dar a uita să-i dea un pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Numărul 2, indicatorul dereferencing începe la indicatorul 1205 00:53:21,170 --> 00:53:24,020 si urmeaza sa asupra săgeata pentru a avea acces pointee acesteia. 1206 00:53:24,020 --> 00:53:27,815 După cum știm cu toții, aceasta funcționează numai în cazul în care nu există este un pointee, ce fel de se întoarce 1207 00:53:27,815 --> 00:53:29,260 să se pronunțe numărul 1. 1208 00:53:29,260 --> 00:53:31,990 >> Numărul 3, indicatorul cesiune ia o pointer 1209 00:53:31,990 --> 00:53:35,330 și se schimbă pentru a indica același pointee ca un alt indicator. 1210 00:53:35,330 --> 00:53:37,150 Deci, după atribuirea, cele două indicii 1211 00:53:37,150 --> 00:53:40,927 va indica la același pointee, uneori, că se numește partajare. 1212 00:53:40,927 --> 00:53:42,510 Și asta e tot acolo este să-l, într-adevăr. 1213 00:53:42,510 --> 00:53:43,130 La revedere acum. 1214 00:53:43,130 --> 00:53:43,475 >> [END PLAYBACK] 1215 00:53:43,475 --> 00:53:44,830 >> David J. MALAN: Asta e pentru CS50. 1216 00:53:44,830 --> 00:53:46,246 Vă mulțumim pentru profesorul Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Ne vedem săptămâna viitoare. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Electronic Music JOC] 1220 00:53:56,435 --> 00:57:22,775