1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Săptămâna 4, Continuare] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Universitatea Harvard] 3 00:00:04,240 --> 00:00:07,290 [Acest lucru este CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Acest lucru este CS50, iar acest lucru este sfârșitul a 4 săptămâni. 5 00:00:11,290 --> 00:00:14,030 Deci, niște vești bune și niște vești proaste. 6 00:00:14,030 --> 00:00:26,240 Nr prelegere luni, nici o problema stabilit săptămâna viitoare. [Elevi aplauze] 7 00:00:26,240 --> 00:00:28,680 Nu te duci să-i placă în cazul în care acest lucru se va. 8 00:00:28,680 --> 00:00:31,590 Dar noi nu avem acest loc miercurea viitoare, 9 00:00:31,590 --> 00:00:37,740 și există, de asemenea, pe programa de curs 1 Vineri vinerea viitoare, astfel încât să putem rămâne pe pistă. 10 00:00:37,740 --> 00:00:40,580 Dar totul va fi filmat, ca de obicei, astfel încât să nu vă faceți griji. 11 00:00:40,580 --> 00:00:44,100 >> Iar cu privire la quiz 0 Ce vom face spre sfarsitul saptamanii 12 00:00:44,100 --> 00:00:47,140 se publica pe pagina de start cs50.net cursului o explicație 13 00:00:47,140 --> 00:00:50,160 de ce fel de așteptări ar trebui să aveți atunci când vine vorba de testul primul. 14 00:00:50,160 --> 00:00:55,100 În general, aceasta va fi alegerea multiplă, adevărat-fals, răspuns scurt, probleme scurte de codare. 15 00:00:55,100 --> 00:00:57,360 Nu te duci să fie de așteptat să pună în aplicare echivalente 16 00:00:57,360 --> 00:01:00,030 de o problemă care le-ar vedea pe o PSET, pentru care aveți un calculator 17 00:01:00,030 --> 00:01:03,240 și un depanator și cum ar fi, dar nu va fi mici probleme de codificare. 18 00:01:03,240 --> 00:01:06,900 >> Și într-adevăr, cel mai bun ghid pentru a obține un sentiment de ceea ce CS50 teste sunt ca 19 00:01:06,900 --> 00:01:09,180 este mergi la cs50.net, du-te la link-ul Quiz, 20 00:01:09,180 --> 00:01:11,920 și puteți vedea în ultimii câțiva ani în valoare de chestionare. 21 00:01:11,920 --> 00:01:16,600 Doar dau seama că curriculum-ul nu a fost întotdeauna aceeași de-a lungul anilor. 22 00:01:16,600 --> 00:01:18,510 Uneori se adaugă, uneori scade, 23 00:01:18,510 --> 00:01:20,670 așa că, dacă vedeți un subiect pe unul dintre cei vechi concursuri 24 00:01:20,670 --> 00:01:25,380 că nu aveți nici o idee despre ce e vorba, e fie că am făcut-o acopere 25 00:01:25,380 --> 00:01:27,210 sau că nu am o acopere. 26 00:01:27,210 --> 00:01:31,110 Dar, în formă de comentarii, în această duminică, luni și marți 27 00:01:31,110 --> 00:01:34,770 precum și un curs de nivel sesiune de reexaminare cu privire la noaptea de duminică - 28 00:01:34,770 --> 00:01:37,500 timp și locație pentru a fi anunțate pe pagina cursului - 29 00:01:37,500 --> 00:01:40,120 ai toate o oportunitate de a revizui cu semenii didactice de curs de 30 00:01:40,120 --> 00:01:44,830 materiale pentru acest an, atât în ​​secțiune și ca o clasă complet, 31 00:01:44,830 --> 00:01:48,400 și a celor va fi filmat, ca de obicei la fel de bine. 32 00:01:48,400 --> 00:01:53,380 >> Bine. Deci, fără alte formalități, o comentariu la pass / fail și adăugați / drop. 33 00:01:53,380 --> 00:01:57,980 Este posibil să fi văzut notițele mele noaptea trecută, și acest lucru este într-adevăr doar o asigurare suplimentară 34 00:01:57,980 --> 00:02:01,250 că, dacă ești printre cei mai confortabil mod special sau undeva în între 35 00:02:01,250 --> 00:02:04,870 și te simți un pic în peste cap, 36 00:02:04,870 --> 00:02:08,430 dau seama că este într-adevăr destul de normal, și nu există o structură de sprijin amplu în loc, 37 00:02:08,430 --> 00:02:13,530 dintre care unul orelor de serviciu au fost intenție privind îmbunătățirea tot mai mult pe e-mail meu noaptea trecută, 38 00:02:13,530 --> 00:02:16,520 și dau seama de asemenea, că o opțiune ca pass / fail pentru o clasa ca aceasta 39 00:02:16,520 --> 00:02:21,540 într-adevăr este menit ca un mecanism de a lua de pe marginea unui curs de acest fel, 40 00:02:21,540 --> 00:02:24,200 astfel că din nou, dacă îți petreci cele 10, 15, 20 de ore 41 00:02:24,200 --> 00:02:28,160 doar încercarea de a obține niște PSET să lucreze și să știi că ești 90-95% din drum acolo 42 00:02:28,160 --> 00:02:32,100 dar nu puteți găsi unele bug naibii, într-un pass / fail model care e un fel de bine. 43 00:02:32,100 --> 00:02:36,230 >> Ideea este că, cu acest mecanism poti sa te duci apoi să se concentreze pe alte psets dvs. 44 00:02:36,230 --> 00:02:39,530 sau dormi sau ce este pe care doriți să se concentreze asupra. 45 00:02:39,530 --> 00:02:43,390 Deci dau seama că aveți până la această marți vine - punct de vedere tehnic cincea luni, 46 00:02:43,390 --> 00:02:50,840 dar e de o vacanță, așa că de marți vin - pentru a comuta de la pass / fail la versa gradate sau vice. 47 00:02:50,840 --> 00:02:54,450 Și dacă ești într-adevăr pe marginea prăpastiei și se gândesc să abandoneze cu totul, 48 00:02:54,450 --> 00:02:56,440 vă rugăm să-mi prinde după prelegere sau drop-mi un bilet. 49 00:02:56,440 --> 00:02:59,990 Ne-ar plăcea să chat-ul, cel puțin înainte de a licita adio. 50 00:02:59,990 --> 00:03:03,470 Bine. Așa că am început să iau roțile de formare de pe ultima oară. 51 00:03:03,470 --> 00:03:06,030 În special, ne-am concentrat pe șir. 52 00:03:06,030 --> 00:03:09,740 Șir este ceva care este declarat în bibliotecă CS50, 53 00:03:09,740 --> 00:03:14,340 în special în acel fișier numit cs50.h pe care vom începe să se uite la această săptămână și viitoare. 54 00:03:14,340 --> 00:03:17,250 Dar șirul este de fapt doar o simplificare a ceva 55 00:03:17,250 --> 00:03:20,980 asta e un pic mai arcanely descris ca char *. 56 00:03:20,980 --> 00:03:24,090 CHAR suntem familiarizați cu. E doar un singur caracter. 57 00:03:24,090 --> 00:03:28,010 Dar, ca de luni * notat ce? >> [Elev] Un pointer. 58 00:03:28,010 --> 00:03:31,290 Un pointer. Și ce e un pointer? >> [Elev] O adresă. 59 00:03:31,290 --> 00:03:33,420 >> E ca o adresă, o locație în memorie. 60 00:03:33,420 --> 00:03:35,910 Ce este o adresă sau o locație de memorie sau? 61 00:03:35,910 --> 00:03:40,290 Din nou, toți dintre noi au laptop-uri cu un concert sau 2 GB de RAM, cel mai probabil în aceste zile, 62 00:03:40,290 --> 00:03:44,160 și asta înseamnă că aveți un miliard de miliard de bytes sau 2 în valoare de memorie. 63 00:03:44,160 --> 00:03:46,240 Și nu contează cu adevărat ceea ce se pare ca fizic, 64 00:03:46,240 --> 00:03:51,220 dar ia pe credința că puteți numerota toate bytes individuale care laptop-ul propriu are - 65 00:03:51,220 --> 00:03:54,580 acest lucru este octet 0, acest lucru este octet 1, acest lucru este octetul 2 miliarde de euro - 66 00:03:54,580 --> 00:03:56,100 și că este exact ceea ce un calculator nu. 67 00:03:56,100 --> 00:04:00,030 Când aloca spațiu pentru un singur caracter, de exemplu, 68 00:04:00,030 --> 00:04:02,480 în mod evident trebuie să trăiască undeva în memoria computerului, 69 00:04:02,480 --> 00:04:05,860 și poate că e de la numărul de octet 12345, 70 00:04:05,860 --> 00:04:08,470 și că e undeva aici, în memoria computerului. 71 00:04:08,470 --> 00:04:12,630 Și apoi adresa de caracterul este 12345. 72 00:04:12,630 --> 00:04:16,140 >> Acum, în săptămâna 0, prin acum până în prezent, nu am cu adevărat păsat 73 00:04:16,140 --> 00:04:19,170 în cazul în care lucrurile în memorie sunt stocate pentru că, de obicei, vom folosi simboluri, 74 00:04:19,170 --> 00:04:22,540 variabile, și matrice pentru a obține de fapt, la datele noastre. 75 00:04:22,540 --> 00:04:24,950 Dar, ca de luni și tot mai mult astăzi, acum ai de gând să aibă 76 00:04:24,950 --> 00:04:27,710 toate capacitățile expresive mai cu programe de scris 77 00:04:27,710 --> 00:04:31,330 pentru a manipula cu adevărat memoria unui computer cu toate acestea tu de cuviință, 78 00:04:31,330 --> 00:04:33,720 pentru ambele scopuri bune și rele, 79 00:04:33,720 --> 00:04:39,620 bug-uri fiind un rezultat foarte comun in acest moment in procesul de invatare chestia asta. 80 00:04:39,620 --> 00:04:42,460 Dar ce înseamnă cu adevărat să fie un char *? 81 00:04:42,460 --> 00:04:46,140 Să mergem mai departe înapoi la - și ne vom întoarce la Binky cum a promis astăzi. 82 00:04:46,140 --> 00:04:48,670 Să mergem la un exemplu simplu aici. 83 00:04:48,670 --> 00:04:53,060 Lasă-mă să salvați acest fișier ca compare.c, și lasă-mă să obține doar un cod șablon aici 84 00:04:53,060 --> 00:05:00,490 includ așa stdio.h, permiteți-mi să dau, de asemenea, mă includ cs50.h. Voi mări acolo. 85 00:05:00,490 --> 00:05:05,850 Permiteți-mi să încep scriu int principal, main (void), si acum vreau sa fac ceva de genul asta: 86 00:05:05,850 --> 00:05:13,520 printf ("Dă-mi un șir:"), și apoi voi folosi e string se getString 87 00:05:13,520 --> 00:05:16,750 pentru a obține un șir de utilizator, apoi am de gând să solicite utilizatorului pentru o alta. 88 00:05:16,750 --> 00:05:21,870 ("Dă-mi un alt șir:") și am de gând să-i ceară prin getString pentru a obține că. 89 00:05:21,870 --> 00:05:27,020 Voi numi t t, deoarece vine dupa S și S este un nume frumos pentru un șir dacă e destul de generic. 90 00:05:27,020 --> 00:05:30,030 Deci getString, iar acum vreau doar să fac o verificare bun-simț și am de gând să spun 91 00:05:30,030 --> 00:05:39,770 în cazul în care (i == t), atunci mă duc să-i spun de utilizator printf ("Ai tastat același lucru \ n!"); 92 00:05:39,770 --> 00:05:45,520 mai am de gând să imprime ceva de genul ("Ai tastat ceva diferit \ n!") 93 00:05:45,520 --> 00:05:48,460 sau orice propoziție va fi. Deci ceva de genul asta. 94 00:05:48,460 --> 00:05:52,200 Apoi, ca de obicei, voi întoarce 0 ceea ce însemna doar ca nimic rau nu sa intamplat, 95 00:05:52,200 --> 00:05:54,400 și am de gând să merg mai departe și compila si rula acest program. 96 00:05:54,400 --> 00:05:56,540 >> Dar pe luni ne-am întâlnit acest program, 97 00:05:56,540 --> 00:06:00,420 si de fapt s-au spus că nu este HELLO salutati nu este la revedere. 98 00:06:00,420 --> 00:06:03,140 Comportamentul am vazut a fost un pic mai mult ca asta. 99 00:06:03,140 --> 00:06:11,450 Lasă-mă să intru în directorul sursa mea, zoom in aici, și hai să facem comparație. 100 00:06:11,450 --> 00:06:14,570 Compilat bine. Lasă-mă să fugi comparare. Dă-mi un șir: HELLO. 101 00:06:14,570 --> 00:06:16,300 Dă-mi un alt șir: HELLO. 102 00:06:16,300 --> 00:06:18,000 Ai tastat ceva diferit! 103 00:06:18,000 --> 00:06:22,650 Ei bine, lasă-mă să încerc ceva mai simplu cum ar fi 50, 50. Ai tastat ceva diferit! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Deci în mod clar, ceva se întâmplă aici. 105 00:06:25,740 --> 00:06:28,440 Dar ceea ce a fost explicația pentru ce? 106 00:06:28,440 --> 00:06:33,850 Aparent, linia 12 este complet disfuncțional. 107 00:06:34,300 --> 00:06:39,430 Care e problema fundamentală aici? Da. >> [Elev] Se compară adresele. 108 00:06:39,430 --> 00:06:41,850 Da, exact. Este de fapt compararea adresele 109 00:06:41,850 --> 00:06:44,580 în care HELLO HELLO și sunt stocate. 110 00:06:44,580 --> 00:06:48,290 Nu e comparat scrisorile Bună, din nou și din nou, 111 00:06:48,290 --> 00:06:52,370 pentru că ceea ce sa întâmplat cu adevărat, în tot acest timp am fost folosind getString - 112 00:06:52,370 --> 00:06:56,130 Această tablă este din nou memoria calculatorului nostru, 113 00:06:56,130 --> 00:07:00,100 și să spunem că eu numesc getString după ce a declarat o variabila. 114 00:07:00,100 --> 00:07:01,930 Ce înseamnă memoria mea arata? 115 00:07:01,930 --> 00:07:07,070 Să spunem că e arbitrar arata ca acest lucru. E un pătrat. 116 00:07:07,070 --> 00:07:09,040 Și destul de mult orice moment, am atras o bucată de memorie pe ecran 117 00:07:09,040 --> 00:07:12,860 daca e pe 32 de biți am fost desenând pătrate, cum ar fi acest lucru, deoarece, într-adevăr, în aparat, 118 00:07:12,860 --> 00:07:17,380 un pointer, o adresă, este 32 de biți. E la fel ca un întreg. 119 00:07:17,380 --> 00:07:19,420 Asta poate varia în funcție de sistemul informatic. 120 00:07:19,420 --> 00:07:24,630 Aceia dintre voi care sunt vag familiarizat cu faptul că Mac-ul sau pe PC-ul este de 64 de biți, 121 00:07:24,630 --> 00:07:28,120 că de fapt denotă că computerul este folosind 64-bit pointeri, 122 00:07:28,120 --> 00:07:33,730 64-bit adrese, și printre upsides de care este computere 123 00:07:33,730 --> 00:07:35,560 poate avea memorie RAM mult mai mult decât odinioară. 124 00:07:35,560 --> 00:07:39,240 Pe scurt, înapoi în ziua când computerele utilizate numai 32 de biti 125 00:07:39,240 --> 00:07:42,740 pentru a reprezenta adrese, cel mai mare număr de octeți ai putea reprezenta 126 00:07:42,740 --> 00:07:46,280 în acest caz, a fost ceea ce în cazul în care aveți 32 de biți? 127 00:07:46,280 --> 00:07:49,590 SO 4 miliarde de euro, drept, deoarece la 2 la 32 este de 4 miliarde de euro. 128 00:07:49,590 --> 00:07:51,370 Acest număr a fost recurente în cursul. 129 00:07:51,370 --> 00:07:55,240 >> Deci, dacă aveți doar 32 de biți, cel mai mare număr pe care puteți conta la este de aproximativ 4 miliarde de euro. 130 00:07:55,240 --> 00:07:58,750 Dar asta a fost o limitare fundamentală de calculatoare până acum câțiva ani 131 00:07:58,750 --> 00:08:01,180 pentru că dacă poate conta doar la fel de mare ca 4 miliarde de euro, 132 00:08:01,180 --> 00:08:05,270 nu conteaza daca vei cumpara 8 GB de RAM sau chiar de 5 GB de RAM; 133 00:08:05,270 --> 00:08:07,780 nu poți conta asa de mare, asa ca a fost inutil. 134 00:08:07,780 --> 00:08:11,430 Ai putea accesa doar primele 3 sau 4 GB de memorie ale computerului dumneavoastră. 135 00:08:11,430 --> 00:08:14,410 Asta e mai puțin de o problemă acum, și puteți cumpăra MacBook Pro și Dells 136 00:08:14,410 --> 00:08:17,680 cu 8 GB de RAM sau chiar mai mult in aceste zile. 137 00:08:17,680 --> 00:08:24,100 Dar dacă am aloca destul de simplu în acest program un pointer, un pointer numit s, 138 00:08:24,100 --> 00:08:28,370 s-ar putea arata ca acest lucru pe ecran, deoarece într-adevăr, trebuie să ne coaja înapoi acest strat. 139 00:08:28,370 --> 00:08:33,520 I a păstra șir spun, dar ca de luni, string este într-adevăr char *, 140 00:08:33,520 --> 00:08:35,590 adresa unele caractere. 141 00:08:35,590 --> 00:08:39,280 Așa că haideți să roata de formare, care întrerupe, deși vom continua utilizarea getString pentru acum. 142 00:08:39,280 --> 00:08:42,600 Așa că m-am declarat lui, iar aceasta este o bucată de memorie, 32 biți. 143 00:08:42,600 --> 00:08:47,370 Ce e aici, în memorie în mod implicit? >> [Elevului răspunsul neauzit] 144 00:08:47,370 --> 00:08:50,040 Ce-i asta? >> [Elev] autogunoiere. >> Gunoi. Exact. 145 00:08:50,040 --> 00:08:54,610 Dacă ați programator nu pun o valoare într-o variabilă, care știe ce este? 146 00:08:54,610 --> 00:08:57,990 Uneori ai noroc si 0 al, care este un fel de o valoare frumos, curat default, 147 00:08:57,990 --> 00:09:00,310 dar așa cum am văzut luni, uneori e un nonsens total, 148 00:09:00,310 --> 00:09:04,130 un numar foarte mare pozitiv sau negativ, care a venit de unde? 149 00:09:05,350 --> 00:09:07,010 Da. >> [Elev] Funcția înainte. Da >>. 150 00:09:07,010 --> 00:09:10,170 >> De multe ori funcția pe care a fost numit înainte, deoarece aduc aminte, 151 00:09:10,170 --> 00:09:13,920 cum suna funcții în memorie, acestea ocupă mai mult spațiu și mai de jos în sus, 152 00:09:13,920 --> 00:09:17,040 și de îndată ce revine funcției, că memoria devine refolosite 153 00:09:17,040 --> 00:09:20,890 de tipul următor, care este chemat, care utilizează aceeași felie dvs. de memorie. 154 00:09:20,890 --> 00:09:23,450 Și dacă ați gunoi stânga există, valorile anterioare, 155 00:09:23,450 --> 00:09:28,190 am putea confunda e ca având o anumită valoare atunci când într-adevăr nu am pus nimic acolo. 156 00:09:28,190 --> 00:09:30,960 Deci, RAM nostru la acest moment arata ca acest lucru. 157 00:09:30,960 --> 00:09:36,030 Acum, pe partea dreaptă a liniei 7 suntem de asteptare getString, 158 00:09:36,030 --> 00:09:40,150 care am fost acum câteva săptămâni, dar ceea ce este cu adevărat getString face? 159 00:09:40,150 --> 00:09:43,350 GetString scrise de personalul CS50 este un pic inteligent 160 00:09:43,350 --> 00:09:46,500 în faptul că de îndată ce utilizatorul începe tastele tastare și hit-uri Enter, 161 00:09:46,500 --> 00:09:50,010 GetString seama cum de multe taste au făcut lovitura de utilizare, 162 00:09:50,010 --> 00:09:53,360 câte caractere am nevoie pentru a aloca memorie RAM pentru. 163 00:09:53,360 --> 00:09:55,660 Și în cazul în care vine de la RAM, cine știe? 164 00:09:55,660 --> 00:09:58,930 E undeva în calculatorul dvs. 2 GB sau fleacuri de memorie. 165 00:09:58,930 --> 00:10:05,200 Dar să presupunem că calculatorul găsit spațiu pentru cuvantul HELLO chiar aici. 166 00:10:05,200 --> 00:10:08,710 Cuvântul Am tastat fost H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Și dacă am trage acest lucru ca pe o secvență de caractere, putem să o tragă ca asta. 168 00:10:13,510 --> 00:10:17,860 Dar am nevoie să fac un lucru suplimentar. Ceea ce aparține la sfârșitul fiecărui șir în C? 169 00:10:17,860 --> 00:10:20,710 Caracterul nul, pe care vom scrie ca \ 0. 170 00:10:20,710 --> 00:10:23,980 E punct de vedere tehnic 0 număr, dar backslash face tot mai clar 171 00:10:23,980 --> 00:10:28,150 că aceasta este literalmente numărul 0, întreg 0; 172 00:10:28,150 --> 00:10:32,440 nu e, de exemplu, oferta-citatul 0 care v-ar tastați la tastatura. 173 00:10:32,440 --> 00:10:33,940 Deci, acest lucru este HELLO. 174 00:10:33,940 --> 00:10:36,350 >> Și ce-am spus, luni, că o funcție ca getString 175 00:10:36,350 --> 00:10:39,580 este, de fapt întoarce toate aceste saptamani? 176 00:10:39,580 --> 00:10:43,960 Nu e întoarce un șir pe sine pentru că nu au cu adevărat ceea ce înseamnă 177 00:10:43,960 --> 00:10:47,710 deoarece siruri de caractere nu există. Sunt un fel de fabricatie în bibliotecă CS50. 178 00:10:47,710 --> 00:10:51,300 Ce este de fapt un șir de caractere, mai tehnic? >> [Elev] E primul caracter. 179 00:10:51,300 --> 00:10:55,950 Exact. E pur și simplu adresa primului caracter pe care utilizatorul tastat inch 180 00:10:55,950 --> 00:11:02,810 Deci, dacă cuvântul meu HELLO sfârșește la 123 numărul de octet și apoi la numărul de octet 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, și așa mai departe, dacă aș numărul de octeți de doar mei de la 0 in sus, 182 00:11:08,320 --> 00:11:12,650 ceea ce într-adevăr se întoarce getString este literalmente 123 numărul. 183 00:11:12,650 --> 00:11:19,270 Deci, ceea ce se pune în 123 s este numărul nu, litera H, nu cuvântul HELLO, 184 00:11:19,270 --> 00:11:23,130 pur și simplu adresa la care pot gasi prima scrisoare de HELLO. 185 00:11:23,130 --> 00:11:26,500 Dar asta nu pare a fi suficient. Te-am rugat pentru un șir de caractere, nu un personaj. 186 00:11:26,500 --> 00:11:32,970 Deci, cum putem sau computerul știu că ELLO tip de vin, împreună cu H? 187 00:11:35,760 --> 00:11:37,460 Ce e un fel de acord avem? Da. 188 00:11:37,460 --> 00:11:40,100 [Elev] Se tot spune sine pentru a găsi unele mai multe caractere. Exact >>. 189 00:11:40,100 --> 00:11:44,570 >> E această convenție om-calculator, prin care, atunci când sunt de-a face cu siruri de caractere, 190 00:11:44,570 --> 00:11:49,410 altfel cunoscut acum ca stelele char, pur și simplu trebuie să dau seama 191 00:11:49,410 --> 00:11:54,350 în cazul în care sfârșitul fiecărui șir în viață este de fapt doar iterarea peste el, cu o buclă pentru, 192 00:11:54,350 --> 00:11:57,820 o buclă în timp ce, indiferent, astfel încât atunci când veți găsi sfârșitul șirului 193 00:11:57,820 --> 00:12:02,160 acum se poate deduce din faptul că, oh, tot cuvântul a fost HELLO. 194 00:12:02,160 --> 00:12:04,820 Aceia dintre voi cu experienta in programare prealabilă ar putea cunoaște în Java 195 00:12:04,820 --> 00:12:09,880 puteți apela doar lungimea și. în alte limbi puteți apela lungimea sau similar. 196 00:12:09,880 --> 00:12:14,060 Asta pentru că într-o mulțime de limbi, mai ales lucrurile numit orientate-obiect de limbi, 197 00:12:14,060 --> 00:12:18,580 lungimea de lucru este un fel de încapsulate în interiorul piesei de date în sine, 198 00:12:18,580 --> 00:12:24,000 de mult cum am ID-uri încapsulate și numele și case în interiorul unui student de luni. 199 00:12:24,000 --> 00:12:28,700 Dar C este mult mai mic nivel. Momentan nu sunt obiecte sau clase, în cazul în care ați auzit acești termeni înainte. 200 00:12:28,700 --> 00:12:31,490 Tot ce trebuie este într-adevăr adrese de memorie. 201 00:12:31,490 --> 00:12:35,540 Deci, aceasta este un fel de modul de modă veche de reprezentare a structurilor de date interesante. 202 00:12:35,540 --> 00:12:38,760 Aveți o valoare de pornire ca adresa primului caracter 203 00:12:38,760 --> 00:12:42,340 si apoi doar cateva convenție arbitrară că toată lumea este de acord să urmeze. 204 00:12:42,340 --> 00:12:46,420 Deci, cum este lungimea șirului pusă în aplicare, ne-am propus? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, pe care unii dintre voi au folosit acum de câteva ori. E destul de simplu, nu? 206 00:12:51,360 --> 00:12:53,060 E ca și cum 2 linii de cod. 207 00:12:53,060 --> 00:12:56,140 E destul de mult pentru o buclă de un anumit fel, poate cu o variabilă locală suplimentară. 208 00:12:56,140 --> 00:13:00,540 Dar strlen doar să ia un pointer și apoi începe căutarea pentru \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Și, de îndată ce se constată, aceasta poate returna numărul total de măsurile pe care le-a luat în șir. 210 00:13:05,190 --> 00:13:07,150 Deci, putem deduce din ceea ce se întâmplă pe această viitoare. 211 00:13:07,150 --> 00:13:11,850 Să presupunem că atunci Declar ca nu am făcut în linia 10. 212 00:13:11,850 --> 00:13:14,280 Aceasta este o valoare gunoi. Cine știe la început? 213 00:13:14,280 --> 00:13:18,490 Dar pe partea dreaptă a liniei de 10 am sunat din nou getString. 214 00:13:18,490 --> 00:13:20,050 Cine știe dacă acest lucru se termină? 215 00:13:20,050 --> 00:13:23,830 Să spunem că arbitrar sistemul de operare găsit spațiu pentru aceasta modalitate de aici. 216 00:13:23,830 --> 00:13:28,610 I se întâmplă să tastați o coincidență H-E-L-L-O din nou, 217 00:13:28,610 --> 00:13:31,260 și astfel încât să putem trage același tip de imagine. 218 00:13:31,260 --> 00:13:34,290 Dar faptul că am redesenat această imagine este deliberată 219 00:13:34,290 --> 00:13:37,720 pentru că este un. diferit HELLO decât acesta 220 00:13:37,720 --> 00:13:43,920 Deci, aici, în această locație ar putea fi 456, aceasta este 457, și așa mai departe. 221 00:13:43,920 --> 00:13:47,170 Deci, ceea ce se pune în cazul în care semnul de întrebare a fost odată? 222 00:13:47,170 --> 00:13:50,190 În acest caz, 456. 223 00:13:50,190 --> 00:13:53,540 Ne iau aceste numere arbitrar, pentru că într-adevăr, după ziua de azi 224 00:13:53,540 --> 00:13:57,110 noi nu vom pasa atat de mult de ceea ce este adresa nimic. 225 00:13:57,110 --> 00:14:02,690 Totul ne pasa este ca ne putem da seama adresa unele bucată de date cum ar fi HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Deci, într-adevăr ceea ce majoritatea oamenilor fac în informatică atunci când vorbim despre adresele de memorie 227 00:14:07,100 --> 00:14:10,210 și vorbesc despre pointeri în mod specific, 228 00:14:10,210 --> 00:14:14,220 mai degrabă decât deranjez imaginind 123 - cui îi pasă în cazul în care aceste lucruri este de fapt, 229 00:14:14,220 --> 00:14:17,440 Știm doar că este la o adresa numerica - 230 00:14:17,440 --> 00:14:22,180 am simplifica lumea și să spun doar că e indică faptul că la caracterul 231 00:14:22,180 --> 00:14:25,080 și t indică spre acel caracter. 232 00:14:25,080 --> 00:14:27,430 Și faptul că este o săgeată este destul de intenție 233 00:14:27,430 --> 00:14:31,610 pentru că pur și simplu e acum este îndreptat la H și T este îndreptat la celălalt H 234 00:14:31,610 --> 00:14:34,720 pentru că la sfârșitul zilei, nu contează ceea ce este adresa, 235 00:14:34,720 --> 00:14:40,240 dar contează că avem capacitatea de a exprima acea adresa cu unele bucata de cod. 236 00:14:40,240 --> 00:14:42,730 Noi nu am manipulat într-adevăr aceste adrese doar încă 237 00:14:42,730 --> 00:14:47,770 așa că vom vedea unde putem intervin și sorta de face lucruri cu pointeri, 238 00:14:47,770 --> 00:14:52,030 dar de acum, în linia 12 literalmente ceea ce valori ne compararea 239 00:14:52,030 --> 00:14:55,500 în conformitate cu această poveste, în linia 12? 240 00:14:56,570 --> 00:15:01,290 Ne spun este 123 egal egal cu 456? Și asta nu e cu siguranță cazul. 241 00:15:01,290 --> 00:15:05,320 Și chiar conceptual, acest indicator este cu siguranta nu la fel ca aceasta 242 00:15:05,320 --> 00:15:09,500 pentru ca te-a sunat de două ori getString, și getString nu încearcă să fie super-inteligent, 243 00:15:09,500 --> 00:15:12,470 ea nu încearcă să realizeze, oh, ați tastat HELLO 5 minute în urmă; 244 00:15:12,470 --> 00:15:15,090 permiteți-mi să vă dau indicatorul fel ca ți-am dat înainte, 245 00:15:15,090 --> 00:15:18,450 se alocă doar o bucată nouă de memorie de fiecare dată când îl sun. 246 00:15:18,450 --> 00:15:20,350 >> Deci, cum putem rezolva această problemă? 247 00:15:20,350 --> 00:15:24,270 Dacă nivelul superior vreau să compare siruri de caractere Salut si Hello - 248 00:15:24,270 --> 00:15:28,680 Nu-mi pasă de indicii - cum pot să mă duc despre a răspunde la întrebarea, 249 00:15:28,680 --> 00:15:31,980 a utilizatorului tastați același lucru? Ce e necesar aici? Da. 250 00:15:31,980 --> 00:15:35,200 [Elev] Utilizați o funcție. Am >> poate utiliza o funcție din cutie. 251 00:15:35,200 --> 00:15:38,170 Pot utiliza o funcție numită strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 doar versiunea prescurtată a spune șir comparare. 253 00:15:41,190 --> 00:15:45,070 Și dacă vom merge în, de exemplu, comparati 2, care se numără printre fișe de azi, 254 00:15:45,070 --> 00:15:46,690 Eu fac exact asta. 255 00:15:46,690 --> 00:15:51,750 Am păstrat totul altceva același lucru de la linia 1 pe jos la 26 sau cam asa ceva, 256 00:15:51,750 --> 00:15:54,360 și observați acum această parte a schimbat un pic. 257 00:15:54,360 --> 00:15:57,690 Să ignorăm linia 28 pentru un moment și să se concentreze doar pe asta. 258 00:15:57,690 --> 00:16:00,410 Ce am spus, luni, că str. comparare nu? 259 00:16:00,410 --> 00:16:05,200 Se ocupa procesul de luare a 2 pointeri, S și T, în acest caz, 260 00:16:05,200 --> 00:16:08,480 un fel de a pune practic degetul pe aceste 2 litere, 261 00:16:08,480 --> 00:16:11,530 și ceea ce trebuie să facă este ceva ca o buclă în timp ce pentru o buclă sau, 262 00:16:11,530 --> 00:16:16,050 și se spune sunt acestea la fel? Dacă este așa, se misca degetele sau indicii forward. 263 00:16:16,050 --> 00:16:17,970 Sunt acestea același, aceeași acestea, acestea, aceeași 264 00:16:17,970 --> 00:16:22,710 acestea același, acestea același? Și ooh, eu sunt la sfârșitul șir atât la S și T. 265 00:16:22,710 --> 00:16:26,780 Nu am găsit nici contradicții. Da, aceste siruri de caractere sunt aceleași. 266 00:16:26,780 --> 00:16:31,940 Și ce se compara str. retur, dacă 2 siruri de caractere sunt aceleași, aparent? Zero. 267 00:16:31,940 --> 00:16:35,900 Deci 0 este bună, în acest caz, deoarece în cazul în care returnează -1 sau +1, 268 00:16:35,900 --> 00:16:40,560 ceea ce înseamnă că e doar se întâmplă să vină înainte de t în ordine alfabetică sau după t. 269 00:16:40,560 --> 00:16:43,760 Și de ce ar fi util să existe o funcție care vă spune ce șir vine înainte de 270 00:16:43,760 --> 00:16:46,720 sau după într-un dicționar? 271 00:16:46,720 --> 00:16:48,740 [Elev] Cauta. Cauta >> și sortare. 272 00:16:48,740 --> 00:16:51,730 >> Astfel încât să puteți face lucruri cum ar fi binar de căutare sau de sortare cu bule sau fuziona sortare 273 00:16:51,730 --> 00:16:53,230 în cazul în care aveți pentru a compara lucruri. 274 00:16:53,230 --> 00:16:56,420 Astfel, acum am un fel de tăiat unele colțuri și doar a vorbit despre sortare 275 00:16:56,420 --> 00:16:59,430 în contextul de numere, pentru că e frumos și ușor pentru a vorbi despre, 276 00:16:59,430 --> 00:17:02,430 dar puteți compara cu siguranță siruri de caractere, mere si banane, 277 00:17:02,430 --> 00:17:05,349 pentru că, dacă mere este cunoscut să vină înainte de banane, în mod similar, 278 00:17:05,349 --> 00:17:09,319 vă puteți muta în jurul valorii de siruri de caractere in memorie la fel ca Rob a facut cu un fel de îmbinare în filme 279 00:17:09,319 --> 00:17:15,880 și am făcut aici, pe scena, cu un fel de selecție, sortare inserarea, si sortare cu bule. 280 00:17:15,880 --> 00:17:18,710 Deci, unde mai putem lua asta? Să încercăm asta. 281 00:17:18,710 --> 00:17:23,980 Să fel de uitam ca lecție pentru un moment și încercați acum și copiați 1.c să facă următoarele. 282 00:17:23,980 --> 00:17:26,800 În linia 21 Spun ceva de imprimare, 283 00:17:26,800 --> 00:17:28,520 atunci eu sunt obtinerea unui șir de utilizator, 284 00:17:28,520 --> 00:17:30,690 atunci eu sunt de verificare asta. 285 00:17:30,690 --> 00:17:33,620 Noi nu am ajuns într-adevăr în acest obicei încă, dar hai sa facem acest lucru acum. 286 00:17:33,620 --> 00:17:40,990 Să fapt, coaja de spate acest strat. Acest lucru este într-adevăr char *. Tipul ăsta este într-adevăr char *. 287 00:17:40,990 --> 00:17:45,690 Deci, ce înseamnă să fi verificarea dacă e == NULL? 288 00:17:45,690 --> 00:17:48,380 Se pare că, atunci când apelați o funcție cum ar fi getString 289 00:17:48,380 --> 00:17:51,540 sau mai mult, în general, cere doar un calculator pentru a vă oferi unele de memorie, 290 00:17:51,540 --> 00:17:53,030 ceva ar putea merge prost. 291 00:17:53,030 --> 00:17:56,630 Ai putea fi nebun și să ceară de calculator pentru un terabyte de memorie 292 00:17:56,630 --> 00:18:01,780 prin solicitarea de trilioane de bytes de memorie, care pur și simplu nu există în calculator, 293 00:18:01,780 --> 00:18:05,130 dar funcțiile getString și alte nevoie de un mod de a striga la tine 294 00:18:05,130 --> 00:18:06,820 dacă ați cerut prea mult. 295 00:18:06,820 --> 00:18:10,450 Și modul getString face acest lucru este în cazul în care ați cerut mai multă memorie 296 00:18:10,450 --> 00:18:14,250 decât este disponibil în calculator, chiar în cazul în care e probabilitatea super, super-redus 297 00:18:14,250 --> 00:18:17,730 deoarece nici unul dintre noi nu sunt de gând să tastați un trilion de caractere și apoi apăsați Enter, 298 00:18:17,730 --> 00:18:21,980 dar probabilitate redusă, deși ea poate fi, eu încă vreau să verificați pentru el doar în cazul în care, 299 00:18:21,980 --> 00:18:26,120 și valoarea specială, care se întoarce getString, răspunsul, și alte funcții 300 00:18:26,120 --> 00:18:30,630 în cazul în care ceva nu a mers bine este NULL în toate capacele. 301 00:18:30,630 --> 00:18:36,520 >> Și ce este NULL? NULL doar așa se întâmplă să reprezinte un pointer. E adresa 0 de memorie. 302 00:18:36,520 --> 00:18:40,800 Lumea a decis că arbitrar, în cazul în care acest lucru este memoria calculatorului meu - stii ce? - 303 00:18:40,800 --> 00:18:46,260 am de gând să fure doar 1 octet de memorie de fiecare calculator, iar acest lucru este locația 0. 304 00:18:46,260 --> 00:18:49,560 Mergem să-i dea o porecla de NULL, si vom promit 305 00:18:49,560 --> 00:18:52,660 că nu vom pune de fapt, nu există date reale 306 00:18:52,660 --> 00:18:56,770 pentru că avem nevoie de doar arbitrar o valoare deosebită, 0, alias NULL, 307 00:18:56,770 --> 00:19:00,230 astfel încât să putem striga la utilizatori, dacă ceva nu merge bine. 308 00:19:00,230 --> 00:19:03,590 În caz contrar, ar putea să nu știi nu înseamnă 0 pune ceva aici 309 00:19:03,590 --> 00:19:05,490 sau înseamnă ceva nu a mers bine? 310 00:19:05,490 --> 00:19:09,190 Trebuie să toții de acord că nu înseamnă nimic NULL a fost returnat, 311 00:19:09,190 --> 00:19:11,700 nici o adresă reală a fost returnat. 312 00:19:11,700 --> 00:19:15,210 Acum, aici, eu doar adoptarea convenției mea umană a mă voi întoarce de la 1 principală 313 00:19:15,210 --> 00:19:17,040 în cazul în care ceva nu merge bine. 314 00:19:17,040 --> 00:19:20,650 Asta pentru că convenției principal pentru retur este să returnați valoarea 0 în cazul în care buna, 315 00:19:20,650 --> 00:19:22,990 1 sau o alta valoare, dacă rău. 316 00:19:22,990 --> 00:19:28,200 Dar getString și orice funcție care se ocupă în declarațiile de memorie null daca ceva merge prost. 317 00:19:28,200 --> 00:19:33,480 >> Bine. Deci, din păcate, linia 27, super-simplu deși este, nu pentru a copia complet șir. 318 00:19:33,480 --> 00:19:35,740 De ce? Putem vedea asta după cum urmează. 319 00:19:35,740 --> 00:19:40,120 Sunt susținând în linia 27 a fi a face o copie a lui și numindu-l T. 320 00:19:40,120 --> 00:19:45,790 Deci, eu nu cer utilizatorului pentru 2 siruri de data asta, eu spun doar valoarea din s. 321 00:19:45,790 --> 00:19:47,870 ar trebui să fie pus în t, de asemenea. 322 00:19:47,870 --> 00:19:52,890 Deci, acum, doar pentru a demonstra cat de rupt acest lucru este, în linia 29 incoace ce fac? 323 00:19:52,890 --> 00:19:56,980 În primul rând mă verifica dacă lungimea t este mai mare decât 0. 324 00:19:56,980 --> 00:19:59,330 E un șir acolo. Utilizatorul tastat ceva inch 325 00:19:59,330 --> 00:20:03,410 Ce este linia 32 face, aparent? 326 00:20:03,410 --> 00:20:08,910 [Răspuns studentul nu pot fi auzite] Corect >>. Puteți să-l fel de deducă din ceea ce am spus se face. 327 00:20:08,910 --> 00:20:13,200 Dar punct de vedere tehnic, ceea ce este aceasta face? t [0] reprezintă ceea ce? 328 00:20:13,200 --> 00:20:15,140 [Elev] Caracterul zero. >> [Malan] Caracterul zero. 329 00:20:15,140 --> 00:20:19,620 Sau, mai uman-cum ar fi, primul caracter în t, indiferent de faptul că este, H poate în acest caz. 330 00:20:19,620 --> 00:20:24,990 Și toupper face ceea ce spune. Acesta valorifică caracterul zero din T și îl schimbă. 331 00:20:24,990 --> 00:20:28,430 Deci, acest lucru înseamnă să ia caracterul zero din T, face majuscule, 332 00:20:28,430 --> 00:20:30,320 și pune-l înapoi în același loc. 333 00:20:30,320 --> 00:20:35,540 Deci, dacă am introduce salut cu litere mici, aceasta trebuie să se schimbe h litere mici la un H. de capital 334 00:20:35,540 --> 00:20:41,400 Dar problema este că, în linii 35 și 36 ceea ce sunt pe cale să faceți este să imprime pentru noi e și t. 335 00:20:41,400 --> 00:20:43,120 Și ce e banuiala ta? 336 00:20:43,120 --> 00:20:47,250 Ce am de fapt de gând să văd dacă am scris în salut în toate litere mici? 337 00:20:47,250 --> 00:20:52,280 Ce se va fi imprimat? >> [Elevului răspunsul neauzit] >> Ce e asta? 338 00:20:52,280 --> 00:20:58,360 [Elev] Big H și restul mici. H >> mare si restul mici, pentru care, s sau t? 339 00:20:58,360 --> 00:21:03,170 [Elev] Atât. Ambele >>. Exact. Deci, haideți să vedem ce se întâmplă pe aici. 340 00:21:03,170 --> 00:21:08,380 >> Lasă-mă să mergeți mai departe și compila acest lucru. Acest lucru este Copy1, asa ca Copy1. Bine. 341 00:21:08,380 --> 00:21:14,840 Zoom inch Lasă-mă să mergeți mai departe și a alerga Copy1, Enter, Spune ceva: salut cu litere mici. 342 00:21:14,840 --> 00:21:19,570 Acesta capitalizate copia, dar capitalizată aparent originale, precum și, 343 00:21:19,570 --> 00:21:22,070 pentru că ceea ce se întâmplă acum în această poveste? 344 00:21:22,070 --> 00:21:27,030 În linia 27 nu pare a fi de fapt, copierea șir, 345 00:21:27,030 --> 00:21:30,450 dar chiar dacă s-ar fi sperat că intuitiv pentru a fi cazul, 346 00:21:30,450 --> 00:21:33,680 dacă te gândești la această imagine, ceea ce într-adevăr am făcut? 347 00:21:33,680 --> 00:21:35,410 Jumătate din imagine este aceeași. 348 00:21:35,410 --> 00:21:39,390 Așa că haideți să se rostogolească înapoi în timp, astfel încât t nu există încă în poveste. 349 00:21:39,390 --> 00:21:43,160 S poate exista în poveste, dar hai să litere mici salut de data asta. 350 00:21:43,160 --> 00:21:46,710 Așa că lasă-mă să stabilească ceea ce de fapt am tastat inch 351 00:21:46,710 --> 00:21:51,280 În acest caz, aici avem h-e-L-L-o. 352 00:21:51,280 --> 00:21:58,050 Ne vom trage ca o secvență de caractere, a pus linii de separare mele aici și-mi \ 0. 353 00:21:58,050 --> 00:22:05,980 Deci, acest lucru este în cazul în care suntem, cât mai curând linia 1 prin 24-ish, da sau de a lua, s-au executat. 354 00:22:05,980 --> 00:22:07,800 Aceasta este imaginea de memoria mea. 355 00:22:07,800 --> 00:22:10,800 Când m-am ajunge la linia 27, ce se întâmplă? 356 00:22:10,800 --> 00:22:14,730 La fel ca înainte, am obține un pointer, pe care voi trage ca acest pătrat. 357 00:22:14,730 --> 00:22:19,740 Se numește T. Și ce e valoare în mod implicit? Cine știe? Unii gunoi valoare. 358 00:22:19,740 --> 00:22:22,060 >> Deci, voi abstractă că la distanță ca un semn de întrebare. 359 00:22:22,060 --> 00:22:27,670 Și, de îndată ce partea dreapta a liniei 27 execută, ceea ce mă pune în interiorul lui t? 360 00:22:27,670 --> 00:22:30,770 Același lucru care e în s.. 361 00:22:30,770 --> 00:22:34,120 Deci, dacă am pentru un moment eliminarea acestei abstracție de săgeată și spunem, 362 00:22:34,120 --> 00:22:40,330 oh, asta este sarcina adresa de memorie 123, când spui T devine e, punct și virgulă, 363 00:22:40,330 --> 00:22:42,700 te pune literalmente 123 aici. 364 00:22:42,700 --> 00:22:45,200 Acum, dacă am un fel de a simplifica lumea noastră din nou cu poze, 365 00:22:45,200 --> 00:22:48,750 ce-ai făcut cu adevărat, se adaugă doar un alt săgeata în lumea ta 366 00:22:48,750 --> 00:22:52,910 care este îndreptat de la t la șirul exact același. 367 00:22:52,910 --> 00:22:59,730 Deci, atunci când, în linia 31 și 32 merg de fapt, despre schimbarea t [0], 368 00:22:59,730 --> 00:23:05,580 ceea ce este t [0] aparent sinonim cu acum? s [0] 369 00:23:05,580 --> 00:23:07,030 Deci, asta e tot ce se întâmplă. 370 00:23:07,030 --> 00:23:09,900 Și chiar dacă acest tip de se simte un pic de nivel scăzut și secret 371 00:23:09,900 --> 00:23:12,760 și acest fel de intuitiv, probabil, se simte ca acest lucru ar fi doar a lucrat - 372 00:23:12,760 --> 00:23:15,410 Am făcut copii de lucruri înainte și doar a lucrat - 373 00:23:15,410 --> 00:23:18,590 daca chiar crezi despre ceea ce este într-adevăr un șir de caractere, e un char *. 374 00:23:18,590 --> 00:23:21,700 Ei bine, ce e asta? E adresa unele caractere. 375 00:23:21,700 --> 00:23:24,930 Atunci poate că ar fi mai logic că, atunci când încercați să faceți ceva 376 00:23:24,930 --> 00:23:29,220 super-aparent simplu ca asta, tot ce faci este copierea o adresă de memorie. 377 00:23:29,220 --> 00:23:32,530 Tu nu faci de fapt nimic cu șirul în sine. 378 00:23:32,530 --> 00:23:37,500 Deci, chiar dacă nu aveți nici o idee cum v-ar rezolva această problemă în cod, 379 00:23:37,500 --> 00:23:45,080 la nivel înalt, conceptual, ce trebuie să facem, în scopul de a face TA copie a lui, aparent? 380 00:23:46,670 --> 00:23:48,820 Da. >> [Elev] Dă-o locație nouă? Exact >>. 381 00:23:48,820 --> 00:23:50,800 >> Avem nevoie de a da t-o locație de brand nou. 382 00:23:50,800 --> 00:23:55,230 Avem nevoie de a crea cumva o lume în care vom obține o bucată nouă de memorie, 383 00:23:55,230 --> 00:24:00,090 care doar de dragul claritate despre voi trage chiar mai jos de aceasta, dar nu este nevoie să fie acolo. 384 00:24:00,090 --> 00:24:04,880 Dar aceasta trebuie să fie de aceeași dimensiune, asa ca voi trage aceste linii verticale în același loc. 385 00:24:04,880 --> 00:24:09,720 E în regulă dacă asta e tot gunoiul inițial. Cine stie ce a fost acolo? 386 00:24:09,720 --> 00:24:13,850 Dar pasul 1 se va trebui să fie-mi dea la fel de memorie de mult ca am nevoie de 387 00:24:13,850 --> 00:24:18,630 pentru a se potrivi o copie a salut, apoi dau seama cum de a copia h aici, e aici, 388 00:24:18,630 --> 00:24:20,390 L aici, și așa mai departe. 389 00:24:20,390 --> 00:24:24,880 Dar acest lucru ar trebui să se simtă deja un pic evident, chiar dacă unele dintre detaliile sunt încă abstracte. 390 00:24:24,880 --> 00:24:28,690 Pentru a copia acest șir în acest, e doar o buclă pentru sau o buclă în timp 391 00:24:28,690 --> 00:24:31,580 sau ceva cu care ați devenit tot mai familiar. 392 00:24:31,580 --> 00:24:35,970 Deci, haideți să încercăm asta. Lasă-mă să intru în copy2.c. 393 00:24:35,970 --> 00:24:43,270 În copy2.c avem aproape același program, cu excepția pentru linia 27. 394 00:24:43,270 --> 00:24:47,260 Se pare un complex pic, dar dacă l-am rupe în jos bucată cu bucată, 395 00:24:47,260 --> 00:24:48,950 partea stângă este aceeași. 396 00:24:48,950 --> 00:24:52,790 Char * t creează acest lucru în memorie, deși cu un semn de întrebare 397 00:24:52,790 --> 00:24:54,680 pentru că nu avem nici o idee despre ceea ce este acolo în mod implicit. 398 00:24:54,680 --> 00:24:57,920 Pe partea dreaptă vom introduce acum un nou funcția, malloc, 399 00:24:57,920 --> 00:25:00,640 pentru memorie aloca, dă-mi de memorie, 400 00:25:00,640 --> 00:25:06,900 și se pare că ia cât de multe argumente, cât de multe lucruri din interiorul paranteze? 401 00:25:09,660 --> 00:25:12,130 Am auzit cârtirile de 1 și 2, dar este doar 1. 402 00:25:12,130 --> 00:25:15,320 Nu e nici o virgulă, ceea ce înseamnă că e doar un lucru în interiorul paranteze. 403 00:25:15,320 --> 00:25:17,720 Chiar dacă nu e paranteze alte, permiteți-mi să subliniez 404 00:25:17,720 --> 00:25:21,460 ce e in interiorul paranteze ultraperiferice, și este această expresie: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Deci, dacă am de fapt, cred că la asta, acest lucru se spune-mi dea lungimea lui. 407 00:25:29,190 --> 00:25:34,440 De ce sunt eu, deși, adăugând 1 pe lungimea? >> [Elevului răspunsul neauzit] 408 00:25:34,440 --> 00:25:40,200 Exact. Avem nevoie de spațiu pentru acest tip la coada, personajul sasea că nu are nici o semnificație în engleză 409 00:25:40,200 --> 00:25:42,250 dar are semnificație specială programatic. 410 00:25:42,250 --> 00:25:46,800 >> Deci, avem nevoie de un + 1 pentru că, din cauza strlen revine așteptările oamenilor de lungime, 411 00:25:46,800 --> 00:25:50,890 salut sau 5, nu da caracterul nul suplimentar. 412 00:25:50,890 --> 00:25:52,980 Asa ca am adăuga manual acest lucru cu + 1. 413 00:25:52,980 --> 00:25:56,060 Și apoi asta, dimensiune * de (char), nu am văzut asta înainte. 414 00:25:56,060 --> 00:25:57,480 Acest lucru nu este punct de vedere tehnic o funcție. 415 00:25:57,480 --> 00:26:04,150 E un cuvânt cheie specială, care doar iti spune ce dimensiunea este de un anumit tip de date pe un calculator 416 00:26:04,150 --> 00:26:06,980 deoarece, în realitate, unii dintre noi au 32-biți calculatoare. 417 00:26:06,980 --> 00:26:10,900 Am un calculator destul de vechi la domiciliu, și-l folosește numai 32 de biți pentru a reprezenta indicii. 418 00:26:10,900 --> 00:26:13,900 Și așa, dacă am făcut marimea unui tip de date, ar putea fi 32 de biți. 419 00:26:13,900 --> 00:26:18,300 Dar dacă eu sunt, folosind computerul meu nou de lux, s-ar putea întoarce o valoare de 64 de biți 420 00:26:18,300 --> 00:26:20,510 pentru ceva de genul o adresă. 421 00:26:20,510 --> 00:26:25,400 Deci, în acest caz, doar pentru a fi în siguranță super, nu vom la ceva cod greu ca - 422 00:26:25,400 --> 00:26:28,740 Ei bine, ceea ce este dimensiunea unui caracter în conformitate cu ceea ce am spus până acum? 423 00:26:28,740 --> 00:26:34,450 Am destul de mult spus verbal că e 1 octet, și asta e destul de mult adevărat peste bord. 424 00:26:34,450 --> 00:26:37,000 Dar, din nou, ipotezele tind să fie rău. 425 00:26:37,000 --> 00:26:40,850 Acestea conduc la software-ul buggy dacă oamenii folosesc software-ul dvs. în moduri pe care nu intenționa. 426 00:26:40,850 --> 00:26:44,750 Deci, haideți să abstract această distanță și doar mai generic spus 427 00:26:44,750 --> 00:26:46,830 Am nevoie de asta bucăți de multe de memorie 428 00:26:46,830 --> 00:26:50,210 și fiecare bucată de memorie ar trebui să fie echivalentă cu dimensiunea de un caracter, 429 00:26:50,210 --> 00:26:54,870 care este, de fapt, egală cu 1, în acest caz, dar e un mod mai generic de scris-o. 430 00:26:54,870 --> 00:27:00,460 Deci, dacă cuvântul este salut, cum de multe bytes se malloc alocă aparent pentru Alo? 431 00:27:00,460 --> 00:27:04,980 [Elev] Șase. Șase >>. Exact cât mai multe semne de întrebare avem pe ecran. 432 00:27:04,980 --> 00:27:07,800 Și apoi să ia o că acum bazată pe înțelegerea dumneavoastră de getString 433 00:27:07,800 --> 00:27:12,790 ceea ce nu malloc intoarce probabil? >> [Elev] O adresă. 434 00:27:12,790 --> 00:27:17,020 O adresă de ce? Din prima bucată de memorie. 435 00:27:17,020 --> 00:27:20,670 >> Nu avem nici o idee despre ceea ce este acolo, deoarece un alt funcția 436 00:27:20,670 --> 00:27:23,010 ar fi putut fi utilizați această memorie anterior. 437 00:27:23,010 --> 00:27:28,380 Dar malloc, cum ar fi getString, returnează adresa primul octet de memorie 438 00:27:28,380 --> 00:27:30,540 care le-a pus deoparte pentru tine. 439 00:27:30,540 --> 00:27:38,380 Cu toate acestea, ceea ce nu face este sa completezi acest gol, cu un caracter nul backslash 440 00:27:38,380 --> 00:27:43,030 deoarece se pare că aveți posibilitatea să utilizați malloc pentru a aloca nimic: Ints, siruri de caractere, tablouri, 441 00:27:43,030 --> 00:27:45,700 flotoare, structuri studențești. 442 00:27:45,700 --> 00:27:47,750 Aveți posibilitatea să utilizați malloc complet generic. 443 00:27:47,750 --> 00:27:51,470 Ea nu-i pasă sau trebuie să știi ce te alocarea de memorie pentru. 444 00:27:51,470 --> 00:27:55,810 Asa ca ar fi îndrăzneț pentru malloc pentru a pune un 0 \ 445 00:27:55,810 --> 00:27:58,340 la sfârșitul fiecărui segment de memorie este oferindu-vă 446 00:27:58,340 --> 00:28:02,620 deoarece acest lucru \ 0 lucru este doar o convenție pentru șiruri. 447 00:28:02,620 --> 00:28:06,310 Acesta nu este folosit pentru Ints, acesta nu este folosit pentru flotoare, nu este utilizat pentru studenți. 448 00:28:06,310 --> 00:28:11,730 Și astfel am prins cu malloc este faptul că sarcina este în întregime pe tine programator 449 00:28:11,730 --> 00:28:16,790 să ne amintim cât de multe bytes te alocate și să nu utilizeze niciodată o buclă de 450 00:28:16,790 --> 00:28:21,570 sau o buclă în timp ce și du-te trecut granița de segment de memorie care le-ați primit. 451 00:28:21,570 --> 00:28:23,540 Pune-un alt mod, de îndată ce aloca memorie, 452 00:28:23,540 --> 00:28:28,510 nu poți cere sistemului de operare, oh, apropo, cât de mare a unui segment de memorie a fost asta? 453 00:28:28,510 --> 00:28:32,080 Este în întregime până la tine să vă amintiți dacă aveți nevoie de acea valoare. 454 00:28:32,080 --> 00:28:34,330 >> Deci, hai sa vedem cum am proceda pentru a utiliza această memorie. 455 00:28:34,330 --> 00:28:38,430 În linia 28 și 29 de ce fac asta? 456 00:28:39,850 --> 00:28:42,260 Doar totală bun-simț verificare. 457 00:28:42,260 --> 00:28:45,110 Doar în cazul în care ceva nu a mers bine, am cerut o suma nebun de memorie 458 00:28:45,110 --> 00:28:48,690 sau am atât de multe lucruri care rulează pe computerul care nu există pur și simplu nu este suficientă memorie, 459 00:28:48,690 --> 00:28:51,780 ceva de genul asta, eu, cel puțin vreau pentru a verifica null. 460 00:28:51,780 --> 00:28:55,260 În realitate, cele mai multe calculatoare va da iluzia că fiecare program 461 00:28:55,260 --> 00:28:57,080 poate utiliza toate elementele de RAM-ul, 462 00:28:57,080 --> 00:29:00,740 dar chiar și așa, dacă utilizatorul tipurile din unele lung șir nebun poate pentru că ești un tip rău 463 00:29:00,740 --> 00:29:03,440 si ei de fapt, încearcă să se prăbușească de program sau de hack în ea, 464 00:29:03,440 --> 00:29:07,300 doriți să cel puțin a verifica valoarea returnată de malloc și dacă acesta este egal cu zero. 465 00:29:07,300 --> 00:29:11,630 Și dacă o face, hai să renunț tocmai acum pentru că nu știu ce să fac în acest caz. 466 00:29:11,630 --> 00:29:13,950 Cum pot copia șir? Există câteva modalități de a face acest lucru. 467 00:29:13,950 --> 00:29:18,850 Momentan nu sunt copia str. funcții în C, dar e super-simplu pentru noi să facem acest mod de modă veche. 468 00:29:18,850 --> 00:29:23,110 >> În primul rând să-mi dau seama ce lungimea lui este. 469 00:29:23,110 --> 00:29:26,930 Am fi putut pune acest lucru în buclă, ci am pus doar aici pentru claritate. 470 00:29:26,930 --> 00:29:30,610 Deci, n stochează acum lungimea șirului original, care este aparent 5. 471 00:29:30,610 --> 00:29:35,290 Apoi, în buclă meu pentru voi iterarea de la 0 la pana la N, 472 00:29:35,290 --> 00:29:40,940 și pe fiecare iterație Pun s [i] in interiorul t [i]. 473 00:29:40,940 --> 00:29:45,060 Deci, asta e ceea ce am implicat cu degetele îndreptate mele 2 la siruri de caractere înainte. 474 00:29:45,060 --> 00:29:49,260 În ceea ce acest lucru pentru bucla iterează de acest fel, am de gând să fie în copierea h aici, 475 00:29:49,260 --> 00:29:52,890 E într-aici, am în aici, pentru că este e, asta este t. 476 00:29:52,890 --> 00:29:58,770 Și apoi în cele din urmă, în linia 35 ce fac asta? 477 00:29:58,770 --> 00:30:03,770 Am nevoie să vă asigurați că am încheie șirul T. 478 00:30:03,770 --> 00:30:06,170 Și am făcut-o în acest fel să fie super explicite. 479 00:30:06,170 --> 00:30:09,510 Dar propune, cineva, daca ai putea, un alt mod de a face acest lucru. 480 00:30:09,510 --> 00:30:13,930 Nu am nevoie de linia 35. Există un alt mod de a face acest lucru. 481 00:30:13,930 --> 00:30:18,880 Da. >> [Elevului răspunsul neauzit] >> Spune-o mai tare. 482 00:30:18,880 --> 00:30:20,960 [Elev] Mai mic sau egal cu. Exact >>. 483 00:30:20,960 --> 00:30:24,450 Am putea spune doar mai mic sau egal cu n, care, în general, a fost rău 484 00:30:24,450 --> 00:30:28,190 deoarece aproape întotdeauna atunci când vom merge până la o sumă egală cu lucrul suntem de numărare 485 00:30:28,190 --> 00:30:30,000 mergem un pas prea departe. 486 00:30:30,000 --> 00:30:32,170 Dar tine minte, cât de mulți octeți am aloca? 487 00:30:32,170 --> 00:30:37,210 Am alocat strlen de s, astfel încât 5 + 1 pentru un total de 6. 488 00:30:37,210 --> 00:30:39,980 Deci, în acest caz, am putea face ceva de genul asta 489 00:30:39,980 --> 00:30:46,450 astfel că suntem nu doar copierea salut, dar, de asemenea, 0 \, la sfârșitul foarte. 490 00:30:46,450 --> 00:30:49,860 Alternativ, am putea folosi o funcție numită str. copiere, strcpy, 491 00:30:49,860 --> 00:30:51,700 dar care nu ar fi distractiv aproape la fel de mult. 492 00:30:51,700 --> 00:30:54,000 Dar asta e tot ce face sub capota. 493 00:30:54,000 --> 00:30:56,050 Apoi în cele din urmă, vom face același lucru ca înainte. 494 00:30:56,050 --> 00:31:01,620 Am valorifica t și apoi am susțin că originalul arata ca acest lucru și copia arată așa. 495 00:31:01,620 --> 00:31:08,570 Așa că hai să încercăm asta acum. Lasă-mă să plec de aici. Asigurați-copy2. Vom mări și a alerga copy2. 496 00:31:08,570 --> 00:31:13,840 Am de gând să tastați în salut cu litere mici, și într-adevăr mă litere mici salut ca originalul 497 00:31:13,840 --> 00:31:16,930 dar de capital Buna ziua pentru copiere. 498 00:31:16,930 --> 00:31:20,300 Dar nu am terminat încă. Am nevoie pentru a face un ultim lucru aici. 499 00:31:20,300 --> 00:31:28,000 46 și 47 este în mod clar eliberarea de memorie, dar ce înseamnă asta de fapt? 500 00:31:28,000 --> 00:31:33,250 Ce fac, crezi că, prin apel la linia 46 și linia 47? 501 00:31:33,250 --> 00:31:38,900 Ce efect are avea asta? Da. 502 00:31:38,900 --> 00:31:43,140 [Răspuns studentul nu pot fi auzite] >> Exact. 503 00:31:43,140 --> 00:31:46,380 >> Sunteți spun doar sistemul de operare, hei, mulțumesc pentru această memorie. 504 00:31:46,380 --> 00:31:48,320 Puteți folosi acum pentru altcineva. 505 00:31:48,320 --> 00:31:50,790 Și aici e un exemplu perfect de valori de gunoi. 506 00:31:50,790 --> 00:31:55,430 Am folosit asta de memorie pentru a scrie cuvântul salut in 2 locuri, 507 00:31:55,430 --> 00:31:57,490 aici, aici, aici, și aici. 508 00:31:57,490 --> 00:32:00,910 Deci, aceasta este h-e-L-am-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Dar apoi m-am sunati la linia 46 și linia 47, și știi ce se întâmplă acolo, în termeni de imagine? 510 00:32:06,960 --> 00:32:10,010 De fapt, stai, această imagine este vechi. 511 00:32:10,010 --> 00:32:12,550 După ce vom face copie, tipul ăsta este, de fapt îndreptat aici, 512 00:32:12,550 --> 00:32:16,110 așa că hai să scoateți numerele și doar abstract departe ca săgețile noastre din nou. 513 00:32:16,110 --> 00:32:19,370 Ce se întâmplă în această imagine atunci când chem liber? 514 00:32:19,370 --> 00:32:22,750 [Răspuns studentul nu pot fi auzite] >> Nici chiar. 515 00:32:22,750 --> 00:32:29,510 Dacă aș suna gratuit de pe S și T - un fel de întrebare capcană - de această imagine nu se schimba deloc 516 00:32:29,510 --> 00:32:33,880 pentru că de asteptare s și t asteptare spune doar sistemul de operare, 517 00:32:33,880 --> 00:32:39,010 hei, puteți utiliza această memorie din nou, dar aceasta nu schimbă acest lucru să null 518 00:32:39,010 --> 00:32:41,840 sau unele caracter special, aceasta nu schimbă acest lucru, 519 00:32:41,840 --> 00:32:47,350 aceasta nu schimbă h sau e sau l sau l sau in oricare loc o pentru nimic altceva. 520 00:32:47,350 --> 00:32:51,610 În ceea ce privește imaginea, de îndată ce voi numiți modificări gratuite, nimic. 521 00:32:51,610 --> 00:32:56,570 Și în aceasta constă originea valorilor de gunoi pentru că dacă aș apoi mai târziu în acest program 522 00:32:56,570 --> 00:33:01,010 cere sistemul de operare pentru mai multă memorie cu getString sau malloc sau ceva de genul asta 523 00:33:01,010 --> 00:33:04,900 și sistemul de operare spune, sigur, am 12 bytes de memorie de doar eliberate, 524 00:33:04,900 --> 00:33:08,080 utilizează acestea, ce ai de gând să fi predat? 525 00:33:08,080 --> 00:33:10,830 Ai de gând să fie înmânat o bucată de memorie care ne-ar trage de obicei, 526 00:33:10,830 --> 00:33:13,700 cu semne de întrebare, dar care sunt aceste semne de intrebare? 527 00:33:13,700 --> 00:33:17,000 Ele se întâmplă să fie h-e-L-L-o, h-e-L-L-o. 528 00:33:17,000 --> 00:33:20,940 Acestea sunt valorile noastre noi de gunoi, de îndată ce vă elibera acea memorie. 529 00:33:20,940 --> 00:33:22,750 >> Există o implicație lumea reală aici. 530 00:33:22,750 --> 00:33:24,720 Acest lucru se întâmplă pentru a face cu RAM, dar computerele dvs. 531 00:33:24,720 --> 00:33:26,720 face de fapt acelasi lucru cu disc. 532 00:33:26,720 --> 00:33:30,620 Vom vorbi despre asta, în special, cu un set de probleme în viitor, care se concentrează pe criminalistica. 533 00:33:30,620 --> 00:33:36,170 Dar ce se întâmplă de fapt în cazul în care aveți unele fișiere financiare sensibile de pe desktop 534 00:33:36,170 --> 00:33:39,600 sau unele JPEG sumare și îl trageți în coșul dvs. de gunoi, 535 00:33:39,600 --> 00:33:44,390 ceea ce se întâmplă atunci când îl trageți în coșul de gunoi sau coșul de gunoi? 536 00:33:44,390 --> 00:33:47,240 Știai ce vorbeam despre. [Râsete] 537 00:33:47,240 --> 00:33:52,370 Ce se întâmplă atunci când v-ați târât că dovezile în coșul de reciclare sau cosul de gunoi? 538 00:33:52,370 --> 00:33:55,920 [Răspuns studentul neauzit] 539 00:33:55,920 --> 00:33:58,000 Ei bine, asa ca fiti atenti. Ce se întâmplă când faci asta? 540 00:33:58,000 --> 00:34:01,030 Răspunsul scurt este nimic, nu? 541 00:34:01,030 --> 00:34:04,790 Fișier vag sau sensibile este încă doar stând acolo undeva pe hard disk. 542 00:34:04,790 --> 00:34:07,940 Cei mai mulți dintre noi, cel puțin au învățat pe calea cea grea de care aveți nevoie pentru a goli coșul dvs. de gunoi 543 00:34:07,940 --> 00:34:10,429 sau coșul de reciclare pentru a șterge fișierele de fapt. 544 00:34:10,429 --> 00:34:13,440 Și într-adevăr, atunci când faceți clic dreapta sau Control faceți clic pe gunoi dvs. poate 545 00:34:13,440 --> 00:34:15,580 sau alegeți Fișier, Empty Trash sau orice altceva 546 00:34:15,580 --> 00:34:21,420 si de fapt goli coșul de gunoi sau Recycle Bin, ceea ce se întâmplă de fapt atunci la această imagine? 547 00:34:22,810 --> 00:34:25,969 Mai mult nimic. Deci, nimic nu se întâmplă de fapt pe disc. 548 00:34:25,969 --> 00:34:30,880 >> Și dacă ne-am abate temporar și să scrie - Voi folosi doar partea din spate a acestui. 549 00:34:30,880 --> 00:34:34,639 Deci, acum este povestea se schimba din memoria RAM, care este în cazul în care există programe 550 00:34:34,639 --> 00:34:39,250 în timp ce le execută, la disc, care este în cazul în care acestea sunt depozitate pe termen lung 551 00:34:39,250 --> 00:34:42,920 chiar și atunci când puterea se stinge, de acum - și ne vom întoarce la acest lucru în viitor - 552 00:34:42,920 --> 00:34:46,380 Să prefacem că acest lucru reprezintă interiorul unitatea hard disk a computerului 553 00:34:46,380 --> 00:34:50,110 deoarece înapoi în ziua în care au folosit pentru a fi discuri circulare, la fel ca dischetele. 554 00:34:50,110 --> 00:34:55,130 Deci, dacă aveți unele sensibile de fișier Excel, s-ar putea dura până acest segment de memorie 555 00:34:55,130 --> 00:34:59,770 pe discul calculatorului dumneavoastră, și eu desen doar 1s fel arbitrară și 0s. 556 00:34:59,770 --> 00:35:03,970 Când glisați fișierul așa la gunoi sau poate recicla bin, 557 00:35:03,970 --> 00:35:07,750 literalmente nu se întâmplă nimic, deoarece Apple și Microsoft au decis doar să 558 00:35:07,750 --> 00:35:10,450 coș de gunoi și coșul de gunoi este de fapt doar un substituent temporar. 559 00:35:10,450 --> 00:35:14,710 Poate că în cele din urmă sistemul de operare va goli pentru tine, dar de obicei, nu se face nimic, 560 00:35:14,710 --> 00:35:17,090 cel puțin până când ești într-adevăr puțin spațiu. 561 00:35:17,090 --> 00:35:20,870 >> Cu toate acestea, atunci când te duci la gunoi gol sau gol coșul de gunoi, 562 00:35:20,870 --> 00:35:23,460 În mod similar, nu se întâmplă nimic la această imagine. 563 00:35:23,460 --> 00:35:28,590 Tot ceea ce se întâmplă este în altă parte pe calculatorul dumneavoastră, există un fel de tabel. 564 00:35:28,590 --> 00:35:35,400 E ca un fel de foaie de ieftin mic care spune că, să zicem, resume.doc, 565 00:35:35,400 --> 00:35:40,920 CV-ul astfel încât într-un fișier Microsoft Word folosit pentru a trăi la locația 123 de pe hard disk, 566 00:35:40,920 --> 00:35:43,710 nu în memorie și nu în memoria RAM, dar pe hard disk, 567 00:35:43,710 --> 00:35:49,050 și viețile voastre schematice JPEG la 456, și dvs. de fișier Excel locuiește la 789 sau ori de câte ori. 568 00:35:49,050 --> 00:35:53,640 Când ștergeți fișierele de golire, de fapt gunoi sau coșul de gunoi, 569 00:35:53,640 --> 00:35:59,530 această imagine nu se schimba. 0s și 1s de pe hard disk nu pleca nicăieri. 570 00:35:59,530 --> 00:36:03,930 Dar acest tabel, această bază de date mic de soiuri, se schimbă. 571 00:36:03,930 --> 00:36:08,750 Când ștergeți CV-ul tau, este ca și cum fișierul este șters într-un anumit sens, 572 00:36:08,750 --> 00:36:12,790 dar toate computerul nu se uita unde chestia aia traieste pe hard disk. 573 00:36:12,790 --> 00:36:17,870 0s și 1s care compun CV-ul sau pe oricare dintre aceste alte fisiere sunt încă intacte. 574 00:36:17,870 --> 00:36:21,960 >> Deci, dacă ai făcut asta accidental, există încă o probabilitate non-zero 575 00:36:21,960 --> 00:36:25,800 pe care le puteți recupera datele folosind Norton Utilities sau unele software-ul comercial 576 00:36:25,800 --> 00:36:29,810 Scopul a cărui în viață este de a găsi 0s și 1s, care au un fel de rămas orfani, 577 00:36:29,810 --> 00:36:33,300 uitate aici, dar a plecat de aici, astfel încât să puteți obține datele înapoi. 578 00:36:33,300 --> 00:36:38,410 Sau anchetatori criminaliști, cu poliția sau FBI-ul ar avea de fapt, un hard-disk 579 00:36:38,410 --> 00:36:42,550 și uita de fapt, pentru modele de 0s și 1s care arata ca JPEG, arata ca fișiere Excel, 580 00:36:42,550 --> 00:36:46,400 și a le recupera în acest fel, chiar dacă computerul le-a uitat acolo. 581 00:36:46,400 --> 00:36:49,820 Deci, într-adevăr singura modalitate de a șterge datele, după cum vom discuta în viitor, 582 00:36:49,820 --> 00:36:54,190 este să spele sau ștergeți fișierul sau hard disk de - 583 00:36:54,190 --> 00:36:56,540 Nu puteți obține cu adevărat scăpa de 0s și 1s 584 00:36:56,540 --> 00:36:59,440 pentru că altfel ai începe cu un hard disk gigabyte 585 00:36:59,440 --> 00:37:02,380 și vei termina cu un hard-disk megabyte dacă în mod constant s-au ștergerea, 586 00:37:02,380 --> 00:37:04,380 literal, 0s și 1s. 587 00:37:04,380 --> 00:37:06,310 Deci, ce-ai face dacă într-adevăr a vrut să acopere urmele 588 00:37:06,310 --> 00:37:10,510 și problema fundamentală este că există încă 0s și 1s de pe disc? 589 00:37:10,510 --> 00:37:14,930 Văd pe cineva care le-ar gesticulând rupe fizic dispozitivul. Care va lucra. 590 00:37:14,930 --> 00:37:19,600 [Râsete] Dar dacă asta e un fel de o soluție costisitoare, ceea ce ar fi mai rezonabil? 591 00:37:19,600 --> 00:37:23,270 Da. >> [Elev] Overwrite ei. Overwrite >> le cu ce? >> [Elev] Alte date. 592 00:37:23,270 --> 00:37:29,070 Alte date. Puteți suprascrie doar discul cu 0s sau 1s sau toate 0s, toate 1s. 593 00:37:29,070 --> 00:37:31,230 >> Și asta e într-adevăr, ceea ce unii dintre software-ul face. 594 00:37:31,230 --> 00:37:33,570 Poti cumpara software sau chiar obține software-ul liber, 595 00:37:33,570 --> 00:37:36,610 și chiar a construit în Mac OS aceste zile, mai puțin în Windows, 596 00:37:36,610 --> 00:37:38,660 este abilitatea de a șterge în siguranță. 597 00:37:38,660 --> 00:37:41,960 De fapt, daca vrei sa administrat total acasă astăzi, dacă aveți un Mac și de a face acest lucru, 598 00:37:41,960 --> 00:37:45,740 dacă ai niște lucruri în gunoi poate, puteți face Trash Secure Empty, 599 00:37:45,740 --> 00:37:47,610 care face exact asta. 600 00:37:47,610 --> 00:37:53,350 , Mai degrabă decât doar fișierele șterge de aici, ea nu șterge aici 0s și 1s, 601 00:37:53,350 --> 00:38:01,240 mai degrabă, se schimbă-le pe toate, de exemplu, pentru a 0s și dot, dot, dot. 602 00:38:01,240 --> 00:38:05,330 Deci, unul din psets dvs. viitoare vor fi de fapt de a recupera în mod intenționat date - 603 00:38:05,330 --> 00:38:08,430 fotografii pe care le-am luat de oameni, locuri și lucruri, în campus 604 00:38:08,430 --> 00:38:12,810 pentru care vom face o imagine medico-legală a unui card de memorie aparat de fotografiat digital, 605 00:38:12,810 --> 00:38:17,120 care este exact aceeași idee - și va trebui să fie contestate pentru a găsi de fapt, 606 00:38:17,120 --> 00:38:20,160 modelele care reprezintă JPEG de pe hard disk, 607 00:38:20,160 --> 00:38:23,610 mai mult ca faptul că studentul a cărui fostul e-mail Am citit câteva săptămâni în urmă a avut 608 00:38:23,610 --> 00:38:25,860 pentru a recupera fotografiile surorii sale. 609 00:38:25,860 --> 00:38:30,300 De ce nu luăm o pauză de 5 minute aici, și vom regrupa cu mult pe memorie. 610 00:38:33,030 --> 00:38:38,610 Deci, aici e în cazul în care lucrurile devin un pic de minte-îndoire, dar acesta este un pas foarte puternic 611 00:38:38,610 --> 00:38:40,480 spre intelegerea aceasta tot mai mult. 612 00:38:40,480 --> 00:38:42,900 Aici este un program numit pointers.c. 613 00:38:42,900 --> 00:38:45,430 Este printre mostre de cod de astăzi. 614 00:38:45,430 --> 00:38:51,280 Observați că în primele linii, 19 prin 22, tot ce facem este ceva de genul getString 615 00:38:51,280 --> 00:38:54,460 și se întorc o adresă, stocarea acestuia în s.. 616 00:38:54,460 --> 00:38:58,380 De acum înainte pentru PSET chiar 3, dacă doriți, dar PSET 4 și pe 617 00:38:58,380 --> 00:39:01,030 în cazul în care puteți începe să luați aceste roți de formare off-te, 618 00:39:01,030 --> 00:39:04,030 nu există nici un motiv pentru a pretinde că există mai siruri de caractere. 619 00:39:04,030 --> 00:39:07,030 E bine să înceapă cu siguranță doar că char *. 620 00:39:07,030 --> 00:39:12,610 >> Ca o paranteza, în referințele on-line și în cărțile pe care le pot vedea de multe ori steaua de lângă variabila. 621 00:39:12,610 --> 00:39:15,600 S-ar putea vedea chiar și spațiile de aproximativ ambele părți ale acestuia. 622 00:39:15,600 --> 00:39:17,680 Toate acestea sunt corecte funcțional. 623 00:39:17,680 --> 00:39:21,180 Pentru moment, însă, vom standardiza pe această abordare pentru a face super-clar 624 00:39:21,180 --> 00:39:24,000 că char * este ca și cum spune indicatorul de caractere. 625 00:39:24,000 --> 00:39:25,680 Acesta este tipul de date. 626 00:39:25,680 --> 00:39:28,730 Și apoi numele variabilei este e în acest caz. 627 00:39:28,730 --> 00:39:31,180 Deci, am ajuns un șir și am numit-o e. 628 00:39:31,180 --> 00:39:35,180 Și apoi aici observați că fac de fapt, un pic de șmecherie. 629 00:39:35,180 --> 00:39:39,080 Aceasta se numește pointer aritmetic, care este un fel de super-simplu. 630 00:39:39,080 --> 00:39:41,790 Aceasta înseamnă doar să adăugați și să scad numere pentru pointeri. 631 00:39:41,790 --> 00:39:43,660 Dar acest fapt funcționează. 632 00:39:43,660 --> 00:39:49,170 Acest program afiseaza aparent sirul s 1 caracter pe linie, astfel încât rezultatul final - 633 00:39:49,170 --> 00:39:54,920 Doar așa ne putem strica în cazul în care acest lucru se întâmplă, face pointeri, pointerii alerga, lasă-mă să zoom inch 634 00:39:54,920 --> 00:39:58,940 Acum, lasă-mă să tip în ceva de genul și tipul HELLO Enter 635 00:39:58,940 --> 00:40:01,080 și se imprimă un caracter pe fiecare rând. 636 00:40:01,080 --> 00:40:04,730 Până la o secundă în urmă, ne-am fi făcut acest lucru cu notație suport pătrat. 637 00:40:04,730 --> 00:40:09,760 Am avea o buclă și pentru ne-ar face printf de s [i] si vom face asta din nou și din nou și din nou 638 00:40:09,760 --> 00:40:11,950 cu un backslash N, la sfârșitul fiecărui rând. 639 00:40:11,950 --> 00:40:16,800 Dar acest program este diferit. Acest program se utilizează, literalmente, aritmetică. 640 00:40:16,800 --> 00:40:18,860 Deci, ce se întâmplă aici? 641 00:40:18,860 --> 00:40:24,720 Mai întâi de toate, înainte de a executa această buclă, chiar, ceea ce, doar pentru a fi clar, este de fapt e? 642 00:40:24,720 --> 00:40:27,270 S este? >> [Elev] O adresă. O adresă >>. 643 00:40:27,270 --> 00:40:32,980 >> Și e adresa, în caz de salut, primul caracter din acel cuvânt, care este h. 644 00:40:32,980 --> 00:40:37,370 Deci s este, în acest exemplu particular, adresa de ore. 645 00:40:37,370 --> 00:40:41,850 Deci, ce înseamnă să faci e + i? 646 00:40:41,850 --> 00:40:46,280 Ei bine, am începe de la 0 în acest buclă pentru. Am făcut asta de multe ori. 647 00:40:46,280 --> 00:40:49,760 I este de gând să meargă până la lungimea șirului, se pare. 648 00:40:49,760 --> 00:40:53,950 Astfel, pe prima iterație a acestui bucla, i este evident 0. 649 00:40:53,950 --> 00:41:01,740 Deci, această expresie se spune e + i -, mai degrabă, s-+0- care este, evident, doar e. 650 00:41:01,740 --> 00:41:04,320 Deci, ce este * e aici? 651 00:41:04,320 --> 00:41:08,530 Acum suntem cu stea într-un mod ușor diferit. 652 00:41:08,530 --> 00:41:13,080 Lasă-mă să mergeți mai departe și de a scăpa de t, deoarece am terminat de vorbit despre t și copii ale lui. 653 00:41:13,080 --> 00:41:15,540 Acum vrem doar să spun o poveste care implică uri. 654 00:41:15,540 --> 00:41:20,090 Și astfel, în acest moment, după ce tipul de șir, lumea noastră pare destul de la fel ca înainte 655 00:41:20,090 --> 00:41:26,630 cu doar e stocarea adresa de ore și mai mult, în general, arătând spre șirul de salut. 656 00:41:26,630 --> 00:41:33,170 Dacă aș face acum o linie de genul * (e + i), să încercăm asta. 657 00:41:33,170 --> 00:41:40,140 Deci, * (e + i). Lasă-mă să simplifice acest lucru, deoarece aceasta este 0, deci acest lucru este * (e +0). 658 00:41:40,140 --> 00:41:43,790 Ei bine, așteptați un minut. Simplifica și mai mult. Acest lucru este * (e). 659 00:41:43,790 --> 00:41:47,020 Ei bine, acum parantezele sunt un fel de prost, deci acum să facem la fel * e. 660 00:41:47,020 --> 00:41:50,540 Deci, în prima iterație a acestui bucla, acea linie care este evidențiată, 26, 661 00:41:50,540 --> 00:41:53,650 este destul de mult echivalent cu imprimarea asta. 662 00:41:53,650 --> 00:41:56,040 Care este tipul de date de * e? 663 00:41:56,040 --> 00:42:00,770 În acest context, deoarece steaua se întâmplă să fie alături de ea însăși s, 664 00:42:00,770 --> 00:42:04,930 dar mai ales, pentru că nu mai suntem declară s, 665 00:42:04,930 --> 00:42:09,730 nu avem de a crea o variabilă mai, nu e nici o mențiune de char * în linia 26, 666 00:42:09,730 --> 00:42:14,280 nu există nici o mențiune a cuvântului cheie șir, suntem folosind doar o variabilă numită s, 667 00:42:14,280 --> 00:42:19,650 se pare că acum stele are ușor diferite și, desigur, confuz sensul. 668 00:42:19,650 --> 00:42:26,590 * E aici inseamna mergeți la adresa din S și de imprimare ceea ce este acolo. 669 00:42:26,590 --> 00:42:33,750 Deci, este de aici, * s este - ca un fel de tobogane și Scări, urmați săgeata - aici. 670 00:42:33,750 --> 00:42:35,850 Deci asta este * e. 671 00:42:35,850 --> 00:42:39,060 >> Deci, ceea ce se imprimă pe prima iterație a buclei, în linia 26? 672 00:42:39,060 --> 00:42:42,170 Am imprima% C, care este substituent pentru un caracter, 673 00:42:42,170 --> 00:42:48,520 apoi o \ n pentru o nouă linie. * (E + i) unde i este 0 este doar asta. 674 00:42:48,520 --> 00:42:53,670 Deci, ce char plasez in pentru c%? H. 675 00:42:53,670 --> 00:42:56,900 În urmatoarea iteratie a buclei - puteți vedea, probabil, în cazul în care acest lucru se întâmplă - 676 00:42:56,900 --> 00:43:01,350 urmatoarea iteratie i este evident 1, deci acest lucru înseamnă s +1, 677 00:43:01,350 --> 00:43:05,580 si apoi acum am nevoie de paranteze, deoarece acum trebuie să spun stele 678 00:43:05,580 --> 00:43:08,620 du-te la adresa de memorie e +1. 679 00:43:08,620 --> 00:43:14,170 Ce este e? Să se rostogolească înapoi în timp și spun acest lucru săgeata acum nu este, de fapt ne face nici un favor. 680 00:43:14,170 --> 00:43:18,450 Să-i mai precis spun că acest lucru este stocarea numărul 123 681 00:43:18,450 --> 00:43:25,110 din cauza începutul acestui șir salut, aceasta este adresa 123, aceasta este de 124, și așa mai departe. 682 00:43:25,110 --> 00:43:30,550 Deci, pe doua repetare când spun e +1, asta e cum ai spune 123 1, 683 00:43:30,550 --> 00:43:35,340 altfel cunoscut sub numele de 124, astfel încât ceea ce se char imprimat pe doua repetare? 684 00:43:35,340 --> 00:43:37,850 E la adresa de memorie 124. 685 00:43:37,850 --> 00:43:44,440 Apoi, din nou +, 125, 126, 127, iar aceasta bucla din fericire se oprește înainte de a ajunge aici 686 00:43:44,440 --> 00:43:49,040 pentru că eu sunt, folosind strlen pentru a vă asigura că nu contează prea mare. 687 00:43:49,040 --> 00:43:50,810 Așa că prea este. 688 00:43:50,810 --> 00:43:55,000 Din nou, aceasta este doar ca și cum am fi făcut-o săptămână în urmă. 689 00:43:55,000 --> 00:43:59,200 Lasă-mă să-l scrie pe linia de mai jos, chiar dacă nu vrem să facem pe amândouă. 690 00:43:59,200 --> 00:44:02,500 Acest lucru este identic acum la asta. 691 00:44:02,500 --> 00:44:08,310 >> Deci, chiar daca s este un șir de caractere, așa cum am fost de asteptare pentru aceasta săptămâni, s este într-adevăr un char *. 692 00:44:08,310 --> 00:44:13,270 Deci, dacă vrem să fim super-anal, e foarte buna pentru a scrie caracterul specific 693 00:44:13,270 --> 00:44:17,490 la locația lea folosind aceste adrese numerice și acest operator stele, 694 00:44:17,490 --> 00:44:20,470 dar sincer, acest lucru este doar atât de mult mai curat. Deci, acest lucru nu este rău. 695 00:44:20,470 --> 00:44:26,720 Nici un motiv să nu mai faci linia 27 aici, dar 26 este funcțional aceeași, 696 00:44:26,720 --> 00:44:31,570 și este funcțional aceeași pentru exact motivele pe care le-am discutat până acum. 697 00:44:31,570 --> 00:44:33,650 Și, în fine, 29 este o practică bună doar. 698 00:44:33,650 --> 00:44:38,420 Apelând gratuit de e înseamnă că acum te dai înapoi de memorie pe care ți-a dat getString 699 00:44:38,420 --> 00:44:41,630 deoarece din nou, așa cum am menționat luni, getString de săptămâni 700 00:44:41,630 --> 00:44:44,180 a fost introducerea unui bug în codul dumneavoastră. 701 00:44:44,180 --> 00:44:46,490 Codul dvs. de săptămâni a avut pierderi de memorie 702 00:44:46,490 --> 00:44:49,970 , prin care ați fost cerut getString pentru memorie, dar nu ați fost l dau înapoi. 703 00:44:49,970 --> 00:44:53,410 Și care a fost ales în mod deliberat de către noi pedagogic 704 00:44:53,410 --> 00:44:55,880 pentru că e prea mult să se gândească mai devreme. 705 00:44:55,880 --> 00:44:57,710 Dar acum avem nevoie de mai mult simetrie. 706 00:44:57,710 --> 00:45:00,830 Dacă vă întrebați de calculator pentru memorie, așa cum este cazul pentru getString, 707 00:45:00,830 --> 00:45:02,820 cum este cazul aparent pentru malloc, 708 00:45:02,820 --> 00:45:07,970 trebuie să vă acum pentru PSET 4 ulterior, de asemenea, gratuit orice astfel de memorie. 709 00:45:07,970 --> 00:45:11,650 Observă acest lucru este diferit de a spune n int. 710 00:45:11,650 --> 00:45:15,040 Nu aveți nevoie pentru a elibera acest lucru, deoarece nu ai sunat getString 711 00:45:15,040 --> 00:45:16,890 si nu ai sunat malloc. 712 00:45:16,890 --> 00:45:20,610 >> Și chiar dacă te-a sunat GetInt cum vom vedea în cele din urmă, 713 00:45:20,610 --> 00:45:25,520 GetInt nu alocă memorie pentru tine, pentru că puteți trece de fapt în jurul valorii de numere întregi 714 00:45:25,520 --> 00:45:29,430 și plutește și caractere doar modul în care le-am făcut de câteva săptămâni. 715 00:45:29,430 --> 00:45:33,960 Siruri de caractere, deși, într-adevăr sunt speciale, deoarece acestea sunt concatenarea caractere multiple. 716 00:45:33,960 --> 00:45:37,450 Deci, sunt doar diferite de caractere, pluteste si Ints și place. 717 00:45:37,450 --> 00:45:39,980 Dar ne vom reveni la asta înainte de mult. 718 00:45:39,980 --> 00:45:44,920 Orice întrebări Apoi, pe acest început de pointeri? Da. 719 00:45:44,920 --> 00:45:49,690 [Întrebare elev neauzit] 720 00:45:49,690 --> 00:45:51,440 Ah, întrebare foarte bună. 721 00:45:51,440 --> 00:45:55,790 Unul dintre puținele lucruri C, de fapt nu pentru tine, care este convenabil, 722 00:45:55,790 --> 00:46:00,110 este că cifrele pentru tine ceea ce este dimensiunea de tipul de date 723 00:46:00,110 --> 00:46:03,060 și apoi face acest gen de multiplicare pentru tine. 724 00:46:03,060 --> 00:46:06,610 Aceasta este lipsită de relevanță în cazul de caractere, deoarece aproape întotdeauna un caracter este 1 octet, 725 00:46:06,610 --> 00:46:08,150 Deci, aceasta pur și simplu funcționează. 726 00:46:08,150 --> 00:46:11,220 Dar de dragul discuției, dacă ai fi fost, de fapt imprimare numere întregi 727 00:46:11,220 --> 00:46:15,500 și ați încercat să imprimați câteva valoarea lui, care a fost îndreptat la un număr întreg, 728 00:46:15,500 --> 00:46:20,720 te în mod similar, nu ar trebui să facă + 4 * i, doar pentru că un int este de 4 octeți. 729 00:46:20,720 --> 00:46:25,780 Aritmetică indicatorul înseamnă că C și compilatorul face tot ceea ce matematica pentru tine. 730 00:46:25,780 --> 00:46:29,190 Tot ce trebuie să pasă de numărare în fel de simț umane. Da. 731 00:46:29,190 --> 00:46:35,200 [Elev] Dacă declara un șir într-un pentru buclă, nu trebuie să-l elibereze mai târziu? 732 00:46:35,200 --> 00:46:36,760 Bună întrebare. 733 00:46:36,760 --> 00:46:41,390 >> Dacă ați declarat o în interiorul șir de bucla pentru, aveți nevoie să-l elibereze mai târziu? 734 00:46:41,390 --> 00:46:47,520 Trebuie doar pentru a elibera memorie pe care le aloca cu getString sau cu malloc. 735 00:46:47,520 --> 00:46:53,110 Deci, dacă ai spus ceva de genul - lasa-ma sa pun acoladele acum atât de tot codul este legată. 736 00:46:53,110 --> 00:46:58,580 Dacă ai făcut ceva, deși buggily, ca aceasta, char * t = e, 737 00:46:58,580 --> 00:47:03,450 nu aveți nevoie de t gratuite, deoarece t nu implică nici o mențiune de malloc sau getString. 738 00:47:03,450 --> 00:47:08,960 Dacă în schimb ai făcut asta, getString, atunci da, va trebui să T gratuite. 739 00:47:08,960 --> 00:47:14,350 Și, de fapt, singura ta șansă de a face acest lucru este acum în această buclă, pentru aceeași problemă a domeniului de aplicare 740 00:47:14,350 --> 00:47:16,060 pe care le-am discutat în trecut. 741 00:47:16,060 --> 00:47:18,830 În caz contrar, vei fi alocarea de memorie, alocarea de memorie, alocarea de memorie, 742 00:47:18,830 --> 00:47:21,230 și la sfârșitul programului pentru că ești în afara de faptul că bucla, 743 00:47:21,230 --> 00:47:24,240 T nu există, dar niciodată nu am spus sistemul de operare 744 00:47:24,240 --> 00:47:26,750 ca nu ai nevoie de memorie mai. 745 00:47:26,750 --> 00:47:30,430 Și înainte de mult timp, pentru PSET 4 sau 5 vă vom dota cu un program numit Valgrind, 746 00:47:30,430 --> 00:47:34,160 care este similar în spirit pentru a GDB, în sensul că are oarecum de o interfață arcane, 747 00:47:34,160 --> 00:47:35,750 dar scopul său în viață este să vă ajute. 748 00:47:35,750 --> 00:47:39,380 Și Valgrind este un program care va fi în viitor căuta programele dvs. 749 00:47:39,380 --> 00:47:42,550 In cautare de pierderi de memorie, fie din getString sau malloc, 750 00:47:42,550 --> 00:47:47,800 pe care vom începe să utilizați tot mai mult cu cât ne oprim folosind biblioteca CS50 la fel de mult. 751 00:47:47,800 --> 00:47:53,030 Avem în sfârșit avem acum un fel de vocabular și un fel de model mental în teorie 752 00:47:53,030 --> 00:47:55,170 cu care să rezolve acest program rupt. 753 00:47:55,170 --> 00:47:59,410 >> Deci, în acest program de spart, de swap franco interiorul de swap, 754 00:47:59,410 --> 00:48:05,280 dar niciodată nu-l efectiv lucrate în principal din cauza principală a trecut în x și y, rechemare, 755 00:48:05,280 --> 00:48:07,260 și acestea au fost în trecut de valori, ca să spunem așa. 756 00:48:07,260 --> 00:48:09,330 Copii ale acestora s-au dat la schimb. 757 00:48:09,330 --> 00:48:12,520 Până la sfârșitul anului de swap, a și b au fost într-adevăr schimbate, 758 00:48:12,520 --> 00:48:16,120 dar, desigur, x și y, așa cum am discutat, luni, nu a fost. 759 00:48:16,120 --> 00:48:19,940 Așa că am propun, în verde, aici, faptul că aceasta este de fapt soluția aici. 760 00:48:19,940 --> 00:48:22,640 Și, de fapt, lasă-mă să mutați stele mei doar pentru a fi în concordanță 761 00:48:22,640 --> 00:48:24,440 chiar dacă, din nou, funcțional acest lucru nu contează. 762 00:48:24,440 --> 00:48:28,730 În săptămânile viitoare vom explica când și de ce contează. 763 00:48:28,730 --> 00:48:30,600 Deci, în verde este acum o soluție. 764 00:48:30,600 --> 00:48:33,700 Sincer, se pare o mulțime Messier, deoarece am toate aceste stele. 765 00:48:33,700 --> 00:48:35,380 Permiteți-mi să subliniez un singur lucru. 766 00:48:35,380 --> 00:48:40,040 Linia de sus aici, în cazul în care se spune int * int * a și b 767 00:48:40,040 --> 00:48:42,820 fundamental este de a face același lucru ca și el are întotdeauna. 768 00:48:42,820 --> 00:48:47,070 Se declară 2 argumente sau parametri, pentru a schimba, 769 00:48:47,070 --> 00:48:49,940 prima, care este un pointer int numit-o, 770 00:48:49,940 --> 00:48:53,100 al doilea, care este un pointer int b numit. 771 00:48:53,100 --> 00:48:55,770 Singurul lucru care este nou în acest moment este faptul că există o stea acolo. 772 00:48:55,770 --> 00:48:59,340 >> Ce înseamnă asta? A nu este un int, b nu este un int. 773 00:48:59,340 --> 00:49:04,100 A este adresa unui int și b este adresa unui int diferit. 774 00:49:04,100 --> 00:49:06,980 Aici jos, acest lucru este în cazul în care am admite C devine confuz. 775 00:49:06,980 --> 00:49:09,790 Acum suntem cu o stea, dar are sens diferit în acest context. 776 00:49:09,790 --> 00:49:13,150 Pentru ca noi nu suntem de declarare indicii ca suntem aici, 777 00:49:13,150 --> 00:49:15,500 aici suntem dereferencing lucruri. 778 00:49:15,500 --> 00:49:21,520 Deci punct de vedere tehnic, stele, în acest context, de prima linie, al doilea, și al treilea în interiorul a swap-ului 779 00:49:21,520 --> 00:49:24,560 este operatorul dereference, ceea ce înseamnă doar du-te acolo. 780 00:49:24,560 --> 00:49:27,400 Deci, la fel ca și degetul meu a urmat săgeată pentru a h, 781 00:49:27,400 --> 00:49:31,100 * Un mijloc merge la acea adresă și pentru a găsi-mi int că e acolo. 782 00:49:31,100 --> 00:49:34,250 * Mijloace b mergeți la adresa și dă-mi ce-i acolo. 783 00:49:34,250 --> 00:49:40,730 Deci, haideți să aspira imaginea de luni acum, folosind o stivă de cadre, 784 00:49:40,730 --> 00:49:43,130 cea de jos a, care va fi principala, 785 00:49:43,130 --> 00:49:47,600 cel de sus din care va fi de swap, 786 00:49:47,600 --> 00:49:50,880 astfel încât lumea noastră arată, la fel ca luni, la fel ca asta. 787 00:49:50,880 --> 00:49:53,620 Aici este o bucată de memorie care principală este de gând să utilizați. 788 00:49:53,620 --> 00:49:56,520 >> Retrag de la, luni, că programul a avut doar 2 variabile, 789 00:49:56,520 --> 00:50:01,930 cea numita x și unul numit Y, și am pus numerele 1 și 2 acolo. 790 00:50:01,930 --> 00:50:06,580 Acum, când eu numesc schimb cum am făcut-o luni, 791 00:50:06,580 --> 00:50:11,000 anterior, atunci când am folosit versiunea rosie a acestui program, care arata ca acest lucru, 792 00:50:11,000 --> 00:50:17,470 Am 2 parametri, a și b, și ceea ce am scrie aici și aici? 793 00:50:17,470 --> 00:50:21,160 Doar 1 și 2, literalmente copii ale x și y. 794 00:50:21,160 --> 00:50:23,070 Astăzi vom schimba asta. 795 00:50:23,070 --> 00:50:28,510 Astăzi, în loc de a trece Ints a și b vom trece în 2 adrese. 796 00:50:28,510 --> 00:50:34,290 Aceste adrese se întâmplă să indice Ints, dar aceste adrese nu sunt ele însele Ints. 797 00:50:34,290 --> 00:50:37,330 Acestea sunt adrese. E ca o adresă poștală în loc. 798 00:50:37,330 --> 00:50:40,580 Deci, acum, avem nevoie să mă dau doar un pic mai mult detalii pe ecran. 799 00:50:40,580 --> 00:50:43,250 Aceasta este memoria calculatorului meu, așa cum a fost toată ziua. 800 00:50:43,250 --> 00:50:45,120 Acum, avem nevoie de ceva arbitrar schema de numerotare. 801 00:50:45,120 --> 00:50:50,580 Deci, hai să spunem, doar din întâmplare, că aceasta este adresa de memorie 123, 124. 802 00:50:50,580 --> 00:50:55,660 Să spunem că aceasta este de 125, aceasta este 126, și așa mai departe, dar asta e cu totul arbitrar. 803 00:50:55,660 --> 00:50:58,590 Avem nevoie doar de o schema de numerotare în memoria mea. 804 00:50:58,590 --> 00:51:04,030 Așa că acum, când de fapt am trece în x și y, eu nu am de gând să treacă în x și y; 805 00:51:04,030 --> 00:51:08,400 Am de gând să treacă în adresa poștală, ca să spunem așa, de x și y de 806 00:51:08,400 --> 00:51:11,870 astfel încât ceea ce este stocat aici și aici nu este 1 și 2, 807 00:51:11,870 --> 00:51:16,030 dar dacă puteți vedea textul meu mic, ceea ce devine trecut pe aici și aici? 808 00:51:16,030 --> 00:51:23,340 [Răspuns studentul nu pot fi auzite] >> Exact. 123 se pune aici și 124 se pune aici. 809 00:51:23,340 --> 00:51:28,910 >> Acum, pentru ca am folosit stea în acest fel prima linie foarte sus aici, la partea de sus, 810 00:51:28,910 --> 00:51:34,340 programul meu știe doar că 123 și 124, chiar dacă ele sunt în mod evident numere întregi 811 00:51:34,340 --> 00:51:40,160 că orice om ar putea observa, acestea ar trebui să fie interpretate ca adresele, adresele numerice. 812 00:51:40,160 --> 00:51:43,250 Ei nu sunt în sine Ints, sunt adrese, 813 00:51:43,250 --> 00:51:46,120 și asta pentru că am pus în mod explicit stele acolo. 814 00:51:46,120 --> 00:51:51,360 Așa că acum, în linia mea primul, al doilea, și al treilea din codul actual, ceea ce se întâmplă aici? 815 00:51:51,360 --> 00:51:53,380 Să atragă restul imaginii. 816 00:51:53,380 --> 00:51:56,980 Tmp este la fel cum era pe luni. Special despre tmp nimic. 817 00:51:56,980 --> 00:52:03,060 Acesta este doar un local 32 de biți variabilă, și în interiorul că am stocarea aparent valoarea * o. 818 00:52:03,060 --> 00:52:08,580 Acum, dacă am spus tmp = o, ce s-ar mi-am pus aici? >> [Elev] 123. 819 00:52:08,580 --> 00:52:10,370 123. Dar asta nu e ceea ce fac eu. 820 00:52:10,370 --> 00:52:13,670 Spun tmp = * o. Mijloace stele du-te acolo. 821 00:52:13,670 --> 00:52:19,370 Deci, aici este o, 123. Cum pot să merg acolo? Pretinde că e ca și cum o săgeată. 822 00:52:19,370 --> 00:52:24,460 Ei bine, acolo este, 1. Deci, ce se depoziteaza in tmp, aparent? Doar 1. 823 00:52:24,460 --> 00:52:29,620 Deci, cu alte cuvinte, este tmp * a *, un mijloc de du-te la adresa care este în prezent într-o, 824 00:52:29,620 --> 00:52:31,320 care este aparent 123. 825 00:52:31,320 --> 00:52:33,910 >> Bine, aici suntem la locația 123, văd numărul 1, 826 00:52:33,910 --> 00:52:35,670 așa că am de gând să pună numărul 1 acolo. 827 00:52:35,670 --> 00:52:39,020 Acum, ce să fac în linia 2, * o * b =? 828 00:52:39,020 --> 00:52:44,570 Acesta este un pic mai implicat, deoarece acum ceea ce este o? E 123. 829 00:52:44,570 --> 00:52:50,220 Deci, în cazul în care este o *? Chiar acolo unde am fost înainte. Merge atât de acolo. Bine. 830 00:52:50,220 --> 00:52:53,420 Acum, în sfârșit, și apoi în cele din urmă acest lucru va începe să aibă sens, să sperăm, 831 00:52:53,420 --> 00:53:00,280 * B inseamna ce e în b? 124. Așa că am nevoie pentru a merge acolo, care este 2. 832 00:53:00,280 --> 00:53:03,430 Deci, ce mi-am pus unde? 833 00:53:03,430 --> 00:53:10,100 2 merge aici, pentru că în * b * merge într-o. Așa că voi face asta. 834 00:53:10,100 --> 00:53:13,120 Și puteți vedea deja, probabil, că suntem mult mai aproape 835 00:53:13,120 --> 00:53:17,710 pentru rezolvarea acestei probleme prost, simplu în mod corect pentru prima dată 836 00:53:17,710 --> 00:53:20,920 pentru că acum avem încă o amintire a ceea ce a fost x, 837 00:53:20,920 --> 00:53:23,230 avem 2 copii, desigur, de Y, 838 00:53:23,230 --> 00:53:25,850 dar acum spune line 3 * b. 839 00:53:25,850 --> 00:53:31,080 Deci, aici e b. * Mijloace b du-te acolo. Deci, în cazul în care este locația 124? 840 00:53:31,080 --> 00:53:35,560 E aparent aici. Deci, ce am pus aici? În mod evident, tmp. 841 00:53:35,560 --> 00:53:39,600 Deci, acum fac asta. Deci am 1 și 2 aici aici. 842 00:53:39,600 --> 00:53:43,560 Și acum ce despre toate astea, 123, 124, și 1? 843 00:53:43,560 --> 00:53:47,910 De îndată ce se întoarce de swap, această memorie este la fel de bun ca pierdere 844 00:53:47,910 --> 00:53:51,070 pentru ca imediat ce se întoarce de swap, sistemul de operare 845 00:53:51,070 --> 00:53:54,190 este libertatea de a folosi ca memoria din nou în viitor. 846 00:53:54,190 --> 00:53:58,870 Doar principal de memorie de la partea de jos a acestei stivei așa-numitei lipeste în jurul valorii de. 847 00:53:58,870 --> 00:54:01,470 >> Și astfel avem în sfârșit avem acum o versiune de lucru. 848 00:54:01,470 --> 00:54:06,310 Lasă-mă să intru în swap.c, și observați mai jos. 849 00:54:06,310 --> 00:54:11,280 În partea de sus a programului mi-am schimbat prototipul meu de a fi int * int * a și b. 850 00:54:11,280 --> 00:54:15,000 Deci, singurul lucru pe care mi-am schimbat pentru a merge de la roșu, care a fost rău, la verde, ceea ce e bine, 851 00:54:15,000 --> 00:54:17,350 Se Am adaugat aceste stele azi. 852 00:54:17,350 --> 00:54:21,520 Dar apoi aici, în sine, schimb am avut de a copia, lipi ceea ce a fost doar pe diapozitiv. 853 00:54:21,520 --> 00:54:24,140 Am o stea aici, stea aici - care se potrivește cu prototip - 854 00:54:24,140 --> 00:54:27,930 și apoi toate aceste lucruri au acum Stele, cu excepția pentru tmp 855 00:54:27,930 --> 00:54:30,680 deoarece utilizarea o variabilă temporară, nu e nimic nou acolo. 856 00:54:30,680 --> 00:54:33,040 Am nevoie doar de depozitare temporară pentru un int. 857 00:54:33,040 --> 00:54:34,820 Deci, nu avem nevoie de o stea acolo. 858 00:54:34,820 --> 00:54:39,310 Avem nevoie doar de stele, astfel încât să putem traversa acest fel a frontierei arbitrare 859 00:54:39,310 --> 00:54:42,900 între aceste 2 cadre în memoria computerului meu. 860 00:54:42,900 --> 00:54:45,630 Dar un lucru trebuie să se schimbe ultimul, și s-ar putea l-au zărit deja. 861 00:54:45,630 --> 00:54:48,810 Ce alta linie este în mod evident diferită acum? >> [Elev] & x. 862 00:54:48,810 --> 00:54:53,270 >> Da, deci 25 este ultima linie de cod am nevoie pentru a schimba pentru ca aceasta să funcționeze. 863 00:54:53,270 --> 00:54:58,360 O săptămână în urmă și chiar pe linia 25 luni arata ca acest lucru, schimb de x și y, 864 00:54:58,360 --> 00:55:02,020 și acest lucru a fost doar rupt pentru că dacă spui de swap (x, y) 865 00:55:02,020 --> 00:55:05,660 vă oferă copii ale lui x și y pentru a face schimb, apoi se face ceva sa, 866 00:55:05,660 --> 00:55:09,080 dar nu sunteți niciodată în schimbare, de fapt x și y în sine. 867 00:55:09,080 --> 00:55:12,880 Deci, chiar dacă nu ați mai văzut înainte de acest personaj cu ampersand în cod, 868 00:55:12,880 --> 00:55:15,860 să ia doar o presupunere. Ce face ampersand face, aparent? 869 00:55:15,860 --> 00:55:17,890 [Elev] ia adresa. Ia >> adresa. 870 00:55:17,890 --> 00:55:21,160 Deci, ampersand spune-mi dea adresa lui x. 871 00:55:21,160 --> 00:55:25,590 Cine stie unde este? Se întâmplă să fie 123. Nu-mi pasă. Doar da-mi adresa lui x. 872 00:55:25,590 --> 00:55:28,340 & Y înseamnă să-mi dai adresa lui y. 873 00:55:28,340 --> 00:55:34,450 Și în acel moment povestea este în perfectă concordanță cu imaginea am desenat acum un moment. 874 00:55:34,450 --> 00:55:38,310 >> Așa că am să recunosc indicii, cu siguranță, pentru mine, când am început să învăț acest lucru, 875 00:55:38,310 --> 00:55:40,570 au fost cu siguranta una dintre cele mai dificile lucruri să-și încheie în jurul valorii de mintea mea. 876 00:55:40,570 --> 00:55:43,760 Dar dau seama, mai ales ca am să continui să joci cu aceste tipuri de lucruri, 877 00:55:43,760 --> 00:55:48,030 dacă îl rupe în jos la aceste fel de simplu super neinteresant intelectual probleme 878 00:55:48,030 --> 00:55:52,270 de a muta doar în jurul valorii de numere, să se răspundă la o mulțime de confuzie cu pointeri 879 00:55:52,270 --> 00:55:56,590 într-adevăr poate fi derivat din aceste mecanica foarte de bază. 880 00:55:56,590 --> 00:55:59,070 Iată o adresă. Du-te acolo cu steaua. 881 00:55:59,070 --> 00:56:03,830 Sau invers, aici e un ampersand. Figura ce este de fapt adresa. 882 00:56:03,830 --> 00:56:06,270 Bine. 883 00:56:06,270 --> 00:56:09,000 Deci, în cazul în care este în întregime acest memorie vine de la? 884 00:56:09,000 --> 00:56:12,360 Am întocmit această imagine de câteva ori, și I a păstra promițătoare ne vom întoarce la ea, 885 00:56:12,360 --> 00:56:14,920 dar aici este o reprezentare a memoriei computerului dvs. 886 00:56:14,920 --> 00:56:17,420 asta e un pic mai mult de etichetat tabla noastră aici este. 887 00:56:17,420 --> 00:56:21,590 Segmentul Textul de la partea de sus reprezintă ceea ce cu privire la programul tău? 888 00:56:21,590 --> 00:56:26,090 [Răspuns studentul nu pot fi auzite] >> Ne pare rău? Spune din nou. 889 00:56:26,090 --> 00:56:28,660 [Elev] real de program. Programul >> reală. 890 00:56:28,660 --> 00:56:32,430 >> Deci, zăngănit 0s și 1s pe care le-ați compilat după ce a scris cod C și apoi rulează 891 00:56:32,430 --> 00:56:35,910 si generarea de capete 0s și 1s până obtinerea ascuns acolo în memorie 892 00:56:35,910 --> 00:56:38,570 pentru că atunci când faceți dublu clic o icoana de pe Mac sau PC 893 00:56:38,570 --> 00:56:43,010 sau executați o comandă cum ar fi Mario la promptul dvs., 0s și 1s de pe disc 894 00:56:43,010 --> 00:56:45,700 vor fi încărcate în memorie, astfel încât computerul poate le manipuleze 895 00:56:45,700 --> 00:56:47,540 si le executa mai repede. 896 00:56:47,540 --> 00:56:50,880 De date, astfel inițializată și de date neinițializate, nu vom vorbi mai mult despre cei, 897 00:56:50,880 --> 00:56:52,420 dar acestea sunt doar variabile globale. 898 00:56:52,420 --> 00:56:54,710 Inițializate înseamnă variabile globale pe care le-au dat valori; 899 00:56:54,710 --> 00:56:59,300 neinitializata variabile globale înseamnă că nu a dat încă valori. 900 00:56:59,300 --> 00:57:01,900 Apoi, există aceste variabile de mediu pe care le voi val complet mâna mea la, 901 00:57:01,900 --> 00:57:04,860 dar ele sunt acolo și că lucrurile magazine, cum ar fi numele dvs. de utilizator 902 00:57:04,860 --> 00:57:08,090 și alt fel de detalii de nivel inferior. 903 00:57:08,090 --> 00:57:12,880 Dar juiciest piese de aspectul memoria ta este acest lucru numit stivă și heap. 904 00:57:12,880 --> 00:57:17,470 Stivă din nou, să fie clar, este memoria care este folosit ori de câte ori funcții sunt numite, 905 00:57:17,470 --> 00:57:19,710 ori de câte ori există variabile locale 906 00:57:19,710 --> 00:57:22,120 și ori de câte ori sunt parametrii fiind trecut în jurul valorii de. 907 00:57:22,120 --> 00:57:24,490 Toate acestea se întâmplă în stivă. 908 00:57:24,490 --> 00:57:29,570 Heap nu am vorbit despre, dar ia o presupunere care utilizează heap. 909 00:57:31,120 --> 00:57:32,690 Doar o bucată de memorie diferite. 910 00:57:32,690 --> 00:57:36,620 Se întâmplă să fie trase aici, la partea de sus, dar asta e o convenție arbitrară pictural. 911 00:57:36,620 --> 00:57:41,670 Cine a fost aparent cu ajutorul de memorie din heap de săptămâni? 912 00:57:41,670 --> 00:57:44,830 E punct de vedere tehnic, dar tu în mod indirect. >> [Elev] getString. 913 00:57:44,830 --> 00:57:47,950 GetString și malloc. Deci, aici e diferența fundamentală. 914 00:57:47,950 --> 00:57:51,300 >> Știi în ultimele săptămâni că, dacă aveți nevoie de memorie, declara doar o variabila. 915 00:57:51,300 --> 00:57:54,560 Dacă aveți nevoie de o mulțime de memorie, declara o matrice drept interiorul funcția. 916 00:57:54,560 --> 00:57:59,620 Dar problema ne-am păstrat cu care se confruntă este dacă declarați variabile la nivel local în interiorul funcțiilor, 917 00:57:59,620 --> 00:58:05,340 de îndată ce revine funcției, ce se întâmplă cu memoria și aceste variabile? 918 00:58:05,340 --> 00:58:09,620 Doar un fel de nu mai e al tău, nu? Ea dispare doar un fel de punct de vedere conceptual. 919 00:58:09,620 --> 00:58:13,950 E încă acolo fizic, evident, dar nu mai e dreptul dvs. de a utiliza. 920 00:58:13,950 --> 00:58:17,160 Acest lucru este, evident, o problemă în cazul în care doriți să scrieți funcții în viața 921 00:58:17,160 --> 00:58:20,440 că de fapt aloca memorie și nu-l dau inapoi imediat. 922 00:58:20,440 --> 00:58:24,180 Cauza în punctul: scopul getString lui în viață este de a avea nici o idee în avans 923 00:58:24,180 --> 00:58:26,390 cât de mare a unui șir am de gând să tastați de la tastatură, 924 00:58:26,390 --> 00:58:30,390 dar trebuie sa fie capabil de a aloca memorie pentru a organiza David sau salut 925 00:58:30,390 --> 00:58:32,860 sau un eseu întreg pe care utilizatorul ar putea fi tastat inch 926 00:58:32,860 --> 00:58:35,280 Deci, getString a fost folosind malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc, prin urmare, trebuie să utilizați nu stiva; 928 00:58:38,910 --> 00:58:40,770 în loc să-l folosește acest lucru numit heap. 929 00:58:40,770 --> 00:58:44,430 Nu e nimic diferit despre memorie. Nu e mai rapid sau mai lent sau ceva de genul asta. 930 00:58:44,430 --> 00:58:46,570 E doar fizic într-o locație diferită. 931 00:58:46,570 --> 00:58:50,120 >> Dar regula este că memoria pe care se alocă pe heap 932 00:58:50,120 --> 00:58:56,180 nu va fi luat de la tine până te sun - să ia o presupunere - gratuit. 933 00:58:56,180 --> 00:59:00,510 În schimb, orice memorie vă întreb pentru stiva pe declarând doar o matrice 934 00:59:00,510 --> 00:59:03,320 sau de declarare a unei variabile ca am facut de săptămâni, 935 00:59:03,320 --> 00:59:05,640 care se încheie în mod implicit pe stiva. 936 00:59:05,640 --> 00:59:09,550 Și care funcționează mare de 90% din timp, dar în acele ocazii rare 937 00:59:09,550 --> 00:59:12,470 în cazul în care doriți să aloce memorie și păstrați-l în jurul valorii de, 938 00:59:12,470 --> 00:59:14,730 atunci ai nevoie pentru a utiliza o funcție ca malloc. 939 00:59:14,730 --> 00:59:19,370 Sau ne-am folosit o functie ca getString, care, la rândul său, folosește malloc. 940 00:59:19,370 --> 00:59:23,300 Să vedem dacă acest lucru s-ar putea rupe în jos și apoi să ia o privire la Binky. 941 00:59:23,300 --> 00:59:25,820 Vom reveni la faptul că, în viitor. 942 00:59:25,820 --> 00:59:29,270 Aici este un program super-simplu că, în primele 2 linii ce face? 943 00:59:29,270 --> 00:59:33,460 În limba engleză, ceea ce fac aceste primele 2 linii de cod face în interiorul principal? 944 00:59:33,460 --> 00:59:35,600 [Răspuns studentul neauzit] 945 00:59:35,600 --> 00:59:37,880 Atentă. Ea nu-mi dea adresa lui x sau y. 946 00:59:37,880 --> 00:59:41,840 [Elev] dă indicii pentru a Ints. Bine >>. Dă-mi 2 pointeri la întregi. 947 00:59:41,840 --> 00:59:45,130 Cu alte cuvinte, da-mi 2 bucati de memorie pe care am păstra desen astăzi, 948 00:59:45,130 --> 00:59:46,950 chiar daca l-am sters acum, ca pătrate. 949 00:59:46,950 --> 00:59:50,000 Dă-mi 2 bucati de memorie, unul numit x, y unul numit - 950 00:59:50,000 --> 00:59:54,320 Am sunat mai devreme le-S și T - și ceea ce este tipul de care bucata de memorie? 951 00:59:54,320 --> 00:59:57,160 Se va stoca o adresă. 952 00:59:57,160 --> 00:59:59,110 Este de tip int *. 953 00:59:59,110 --> 01:00:01,630 >> Deci, adresa unui int vor locui în cele din urmă în x, 954 01:00:01,630 --> 01:00:03,860 adresa unui int vor locui în cele din urmă în y, 955 01:00:03,860 --> 01:00:08,460 dar inițial, ceea ce este în interiorul lui x și y? Cine știe? Garbage valori. 956 01:00:08,460 --> 01:00:10,180 Ea nu are nimic de-a face cu pointeri. 957 01:00:10,180 --> 01:00:12,720 Dacă nu ne-am pus ceva acolo, cine stie ce e de fapt acolo? 958 01:00:12,720 --> 01:00:18,950 Acum, x. Ce se întâmplă aici? Acest lucru este legit acum, deoarece x este un pointer. E un * int. 959 01:00:18,950 --> 01:00:21,870 Asta înseamnă că eu pot pune în x adresa unor bucată de memorie. 960 01:00:21,870 --> 01:00:25,120 Ce se malloc intoarce? Top, se întoarce adrese, 961 01:00:25,120 --> 01:00:28,510 adresa primul octet într-o bucată întreagă de memorie. 962 01:00:28,510 --> 01:00:31,140 Cât de multe bytes este acest aparent alocarea, de exemplu, în aparat? 963 01:00:31,140 --> 01:00:33,510 Care este dimensiunea unui int? 4. 964 01:00:33,510 --> 01:00:36,600 Dacă credeți că inapoi la saptamana 1, nu e foarte important să ne amintim întotdeauna că, 965 01:00:36,600 --> 01:00:38,870 dar în acest caz e util să știi, 4 octeți. 966 01:00:38,870 --> 01:00:41,770 Deci, acest lucru este alocarea pe heap 4 octeți 967 01:00:41,770 --> 01:00:46,110 și este returnarea adresa primul pentru mine arbitrar. 968 01:00:46,110 --> 01:00:47,700 Acum, ceea ce face x? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 este de a face ce? 970 01:00:52,200 --> 01:00:57,150 Dacă la acest punct, în povestea avem x, care arata ca acest lucru cu o anumită valoare gunoi, 971 01:00:57,150 --> 01:01:04,120 acest lucru este acum y cu o valoare gunoi, acum în linia 3 am alocat 4 octeți. 972 01:01:04,120 --> 01:01:06,950 Această imagine în esență, arată așa. 973 01:01:06,950 --> 01:01:12,010 Sau, mai precis, în cazul în care aceasta este adresa arbitrară 123, aceasta este ceea ce povestea noastră acum arata ca. 974 01:01:12,010 --> 01:01:23,940 * X = 42 înseamnă acum ce? Asta înseamnă că mergeți la adresa 123 și a pus acolo numărul 42. 975 01:01:23,940 --> 01:01:26,220 Nu am nevoie să atragă aceste linii, deoarece nu facem siruri de caractere. 976 01:01:26,220 --> 01:01:29,480 >> Ar fi trebuit să-l pur și simplu scris ca aceasta, și doar de dragul demonstrației lui, 977 01:01:29,480 --> 01:01:33,240 42 ca un fel de int ia o mulțime de spațiu, 4 octeți. 978 01:01:33,240 --> 01:01:35,960 Deci, asta e ceea ce sa întâmplat acolo, dar există o problemă acum. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Ce se va întâmpla aici? 980 01:01:40,580 --> 01:01:46,470 Problema este y * în lumea noastră simplificată înseamnă doar du-te la adresa din y. 981 01:01:46,470 --> 01:01:48,590 Ce e în y? E o valoare gunoi. 982 01:01:48,590 --> 01:01:53,150 Deci, să presupunem că această valoare este 5551212 gunoi, ceva de genul ăsta nebun. 983 01:01:53,150 --> 01:01:56,750 * Mijloace y du-te la adresa 5551212. 984 01:01:56,750 --> 01:02:00,450 Asta e ca si cum aici. Ea nu există, de exemplu. 985 01:02:00,450 --> 01:02:05,310 Deci * y devine 13 mijloace Am încercat să atrag aici 13. Ea nu exista. 986 01:02:05,310 --> 01:02:08,790 Am depășit segmentul de tablă. Ce primesc? 987 01:02:08,790 --> 01:02:14,930 Asta criptic segmentare vina mesaj deoarece am încercat să pun în memorie 988 01:02:14,930 --> 01:02:19,470 o valoare ca 13 la un loc care nu există. 989 01:02:19,470 --> 01:02:23,900 Restul programului ar putea sa functioneze bine, dar până în acel moment nu. 990 01:02:23,900 --> 01:02:25,350 Deci, haideți să încercăm să spunem aceasta poveste. 991 01:02:25,350 --> 01:02:27,830 Vom reveni la această dată am vorbit despre hex. 992 01:02:27,830 --> 01:02:30,290 Să ne întoarcem la acest lucru și încheie cu acest lucru numit Binky, 993 01:02:30,290 --> 01:02:33,710 care amintesc este un profesor de la Stanford ședinței la domiciliu joc cu claymation, 994 01:02:33,710 --> 01:02:36,380 pentru a spune povestea exact același program. 995 01:02:36,380 --> 01:02:40,580 E doar aproximativ 3 minute lungi. Aici avem Binky. 996 01:02:40,580 --> 01:02:45,030 [Vorbitor de sex masculin în video] Hei Binky, trezește-te. E timpul pentru distracție indicatorul. 997 01:02:45,030 --> 01:02:50,080 [Binky] Ce e asta? Aflați mai multe despre indicii? Ce bine! 998 01:02:50,080 --> 01:02:53,700 [Vorbitor de sex masculin] Ei bine, pentru a începe, Cred că am de gând să nevoie de un cuplu indicii. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Ok. Acest cod alocă 2 pointeri, care pot indica la întregi. 1000 01:02:57,890 --> 01:03:02,220 [Vorbitor de sex masculin] Ok. Ei bine, eu văd cele 2 indicii, dar acestea nu par să fie îndreptată spre nimic. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Asta-i drept. Inițial, indicii nu indică nimic. 1002 01:03:05,550 --> 01:03:09,270 Lucrurile pe care le indica sunt numite pointees, și de a le sus este un pas separat. 1003 01:03:09,270 --> 01:03:12,330 [Vorbitor de sex masculin] Oh, corect, corect. Știam asta. Cele pointees sunt separate. 1004 01:03:12,330 --> 01:03:15,630 Er, asa cum a face tu aloce o pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Ok. Acest cod alocă o nouă pointee întreg, iar această parte stabilește x pentru a indica aceasta. 1006 01:03:21,510 --> 01:03:23,500 [Vorbitor de sex masculin] Hei, care arată mai bine. 1007 01:03:23,500 --> 01:03:26,030 Deci, face fac ceva. >> [Binky] Ok. 1008 01:03:26,030 --> 01:03:30,300 Voi dereference x indicatorul pentru a stoca numărul 42 în pointee său. 1009 01:03:30,300 --> 01:03:34,410 Pentru acest truc am nevoie de bagheta mea magică a dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Vorbitor de sex masculin] bagheta magică a dvs. dereferencing? Asta-i grozav. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Aceasta este ceea ce pare a fi codul. Voi seta doar până numărul și ... [Popping sunetul] 1012 01:03:44,230 --> 01:03:46,100 [Vorbitor de sex masculin] Hei uite, acolo se duce. 1013 01:03:46,100 --> 01:03:50,990 Face acest lucru un dereference pe x urmează săgeata pentru a accesa pointee său, 1014 01:03:50,990 --> 01:03:53,230 în acest caz, pentru a stoca 42 acolo. 1015 01:03:53,230 --> 01:03:57,630 Hei, încercați să utilizați-l pentru a stoca numărul 13, prin indicatorul altă parte, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Ok. Mă duc doar aici pentru a obține y și numărul 13 instituit 1017 01:04:03,250 --> 01:04:08,360 și apoi să ia bagheta de dereferencing și doar ... [Sunet zumzet] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Vorbitor de sex masculin] Oh hei, care nu au de lucru. 1019 01:04:10,980 --> 01:04:14,870 >> Spune, Binky, nu cred că dereferencing y este o idee bună 1020 01:04:14,870 --> 01:04:17,880 deoarece înființarea pointee este un pas separat 1021 01:04:17,880 --> 01:04:19,850 și nu cred că am făcut-o vreodată. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, bun punct de. 1023 01:04:21,770 --> 01:04:26,640 [Vorbitor de sex masculin] Da. Am alocat y indicatorul dar nu-l setat pentru a indica o pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, foarte atent. 1025 01:04:28,780 --> 01:04:30,690 [Vorbitor de sex masculin] Hei, arăți bine acolo, Binky. 1026 01:04:30,690 --> 01:04:34,160 Poți să-l repari, astfel că punctele de y la fel ca pointee x? >> [Binky] Sigur. 1027 01:04:34,160 --> 01:04:37,100 Eu voi folosi bagheta mea magică de cesiune pointer. 1028 01:04:37,100 --> 01:04:39,070 [Vorbitor de sex masculin] este că va fi o problemă ca înainte? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Nu, acest lucru nu atinge pointees. 1030 01:04:40,840 --> 01:04:44,780 Se schimbă doar un pointer pentru a indica acelasi lucru ca altul. [Popping sunetul] 1031 01:04:44,780 --> 01:04:48,570 [Vorbitor de sex masculin] Oh, văd. Acum puncte y la același loc ca și x. 1032 01:04:48,570 --> 01:04:51,140 Așa că așteptați. Acum, y este fixat. Ea are o pointee. 1033 01:04:51,140 --> 01:04:54,520 Astfel, puteți încerca bagheta dereferencing din nou pentru a trimite peste 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, bine. Aici merge. [Popping sunetul] 1035 01:04:58,130 --> 01:05:01,250 [Vorbitor de sex masculin] Hei, uită-te la asta. Dereferencing acum funcționează pe y. 1036 01:05:01,250 --> 01:05:05,200 Și, pentru că sunt indicii că unul comun pointee, amândoi se vedea 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Da, de partajare. Oricare ar fi. 1038 01:05:06,910 --> 01:05:08,880 >> Deci, vom schimba locurile acum? 1039 01:05:08,880 --> 01:05:11,420 [Vorbitor de sex masculin] Oh uite, nu mai avem timp. >> [Binky] Dar - 1040 01:05:11,420 --> 01:05:13,880 [Vorbitor de sex masculin] Doar amintiți-vă cele 3 reguli pointer. 1041 01:05:13,880 --> 01:05:18,630 Numărul 1, structura de bază este că veți avea un pointer și-l arată pe la o pointee. 1042 01:05:18,630 --> 01:05:23,120 Dar indicatorul și pointee sunt separate, iar eroarea comună este de a crea un pointer 1043 01:05:23,120 --> 01:05:25,680 dar să uitați să-i dea o pointee. 1044 01:05:25,680 --> 01:05:29,580 Numărul 2, dereferencing indicatorul pornește de la indicatorul și urmează săgeata de peste 1045 01:05:29,580 --> 01:05:31,060 pentru a accesa pointee sale. 1046 01:05:31,060 --> 01:05:34,340 După cum știm cu toții, aceasta funcționează numai dacă există o pointee, 1047 01:05:34,340 --> 01:05:36,460 ce fel de se întoarce să se pronunțe cu numărul 1. 1048 01:05:36,460 --> 01:05:39,870 Numarul 3, cesiune indicatorul ia un pointer și schimbă-l 1049 01:05:39,870 --> 01:05:42,390 să indice pointee fel ca un alt indicator. 1050 01:05:42,390 --> 01:05:45,890 Deci, după cesiune, cele 2 indicii pentru a va indica pointee aceeași. 1051 01:05:45,890 --> 01:05:47,800 Uneori, asta se numește partajare. 1052 01:05:47,800 --> 01:05:50,910 >> Și asta e tot acolo este să-l cu adevărat. Pa-pa acum. 1053 01:05:50,910 --> 01:05:55,840 Acest lucru este Binky. Acest lucru este CS50. Ne vedem săptămâna viitoare. [Aplauze] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]