1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Bună ziua, și bun venit înapoi la CS50. 3 00:00:13,260 --> 00:00:14,860 Deci, acesta este sfârșitul de patru saptamani. 4 00:00:14,860 --> 00:00:16,680 Doar un anunț întâi. 5 00:00:16,680 --> 00:00:19,600 Deci, așa-numitul cincea luni este vine aceasta vine luni. 6 00:00:19,600 --> 00:00:22,800 Acest lucru este posibilitatea de a schimba de la SAT / UnSat la un grad scrisoare, sau de la 7 00:00:22,800 --> 00:00:24,130 Calitate scrisoare SAT / UnSat. 8 00:00:24,130 --> 00:00:27,130 Supărător, că procesul are nevoie de o semnătură, pentru că trebuie să completați 9 00:00:27,130 --> 00:00:28,770 unul dintre aceste add / drop forme roz. 10 00:00:28,770 --> 00:00:31,680 >> Deoarece punct de vedere tehnic, SAT / UnSat versiune și versiunea gradul litera 11 00:00:31,680 --> 00:00:33,320 au numere de catalog distincte. 12 00:00:33,320 --> 00:00:34,240 Dar nu e mare lucru. 13 00:00:34,240 --> 00:00:36,620 Vino la mine sau de la Rob sau a Lauren în orice punct. 14 00:00:36,620 --> 00:00:39,550 Sau e-mail, dacă nu aveți un fel de documente care aveți nevoie astăzi, și ne- 15 00:00:39,550 --> 00:00:43,410 va fi sigur de a vă ajuta să luați grijă de asta înainte de luni. 16 00:00:43,410 --> 00:00:45,780 >> În regulă, așa că astăzi - 17 00:00:45,780 --> 00:00:47,630 De fapt, există un pic de un ecou. 18 00:00:47,630 --> 00:00:51,070 Putem tonul ma jos un pic? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Așa că astăzi, vom introduce un subiect cunoscut sub numele de indicii. 21 00:00:54,850 --> 00:00:57,770 Și eu recunosc că aceasta este una din subiecte mai complexe pe care avem tendința de a 22 00:00:57,770 --> 00:01:00,960 acoperă în această clasă, sau într-adevăr orice curs introductiv care utilizează C. 23 00:01:00,960 --> 00:01:05,510 >> Dar ia cuvântul meu pentru ea, în special Dacă mintea ta se simte un pic mai mult îndoit 24 00:01:05,510 --> 00:01:07,100 astăzi și în următoarele săptămâni. 25 00:01:07,100 --> 00:01:10,340 Nu este reprezentativ de apariție a mai rău la acest lucru înseamnă doar că 26 00:01:10,340 --> 00:01:13,360 este un subiect deosebit de sofisticat care promit, câteva săptămâni 27 00:01:13,360 --> 00:01:17,610 prin urmare, va părea mult prea izbitor simplu în retrospectivă. 28 00:01:17,610 --> 00:01:18,720 >> Îmi amintesc încă la această zi. 29 00:01:18,720 --> 00:01:22,190 Am fost așezat la Elliott sala de mese, a următoarei ședințe pentru a-mi TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 care a fost un rezident al casei Elliott. 31 00:01:24,070 --> 00:01:26,340 Și pentru un motiv oarecare, această subiect câteva clicuri. 32 00:01:26,340 --> 00:01:29,430 Care este de a spune că am prea luptat cu ea pentru o anumită cantitate de timp, dar am 33 00:01:29,430 --> 00:01:33,610 va face tot posibilul pentru a evita orice astfel de lupta cu un subiect care în cele din urmă 34 00:01:33,610 --> 00:01:34,580 este destul de puternic. 35 00:01:34,580 --> 00:01:37,350 >> De fapt, unul dintre subiectele pe care le vom discuta în următoarele săptămâni este că 36 00:01:37,350 --> 00:01:41,130 de securitate, și cum puteți de fapt, exploata mașini în moduri 37 00:01:41,130 --> 00:01:42,320 care nu au fost destinate. 38 00:01:42,320 --> 00:01:45,850 Și aceste exploatări sunt de obicei rezultatul de bug-uri, greseli pe care le 39 00:01:45,850 --> 00:01:49,740 oamenii fac de nu înțelege unele de punere în aplicare care stau la baza 40 00:01:49,740 --> 00:01:52,250 detalii prin care programele sunt realizate. 41 00:01:52,250 --> 00:01:55,410 >> Acum, pentru a face acest lucru pare cu atât mai ușor de utilizat prietenos, m-am gândit să joace un 10 42 00:01:55,410 --> 00:01:59,680 al doilea preview de un pic claymation Figura numit Binky care a fost adus la 43 00:01:59,680 --> 00:02:03,020 viata de un prieten de-al nostru de la Stanford, profesor Nick parlante. 44 00:02:03,020 --> 00:02:06,753 Deci, permiteți-mi să vă dau această teaser de Binky aici. 45 00:02:06,753 --> 00:02:09,520 >> [Redare video] 46 00:02:09,520 --> 00:02:10,380 >> -Hei, Binky. 47 00:02:10,380 --> 00:02:11,050 Trezește-te. 48 00:02:11,050 --> 00:02:13,610 E timpul pentru distracție pointer. 49 00:02:13,610 --> 00:02:14,741 >> -Ce-i asta? 50 00:02:14,741 --> 00:02:16,440 Aflați mai multe despre indicii? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END redare video] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Acesta este Stanford informatică. 54 00:02:20,670 --> 00:02:23,194 Astfel mai mult pe care să vină. 55 00:02:23,194 --> 00:02:24,930 >> [Aplauze] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Îmi pare rău, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Astfel amintesc că ultima dată când am ajuns pe acest Cliffhanger cu adevarat interesant 58 00:02:30,680 --> 00:02:32,960 prin care această funcție pur și simplu nu au de lucru. 59 00:02:32,960 --> 00:02:34,960 Cel puțin intuitiv, am simțit ca și cum ar trebui să funcționeze. 60 00:02:34,960 --> 00:02:37,600 Pur și simplu schimbarea valorilor a două numere întregi. 61 00:02:37,600 --> 00:02:40,915 Dar amintesc că atunci când am imprimat valorile originale în principal, o și 62 00:02:40,915 --> 00:02:44,210 doi, ei erau încă una și două și nu doi și unu. 63 00:02:44,210 --> 00:02:46,070 >> Deci, lasă-mă să comuta de fapt pe la aparat. 64 00:02:46,070 --> 00:02:50,180 Și am scris un pic de cod scheletice în avansa aici, unde am susțin că x 65 00:02:50,180 --> 00:02:52,500 va fi 1, y va fi 2. 66 00:02:52,500 --> 00:02:54,810 Apoi am imprima atât lor Valorile cu print f. 67 00:02:54,810 --> 00:02:57,540 >> Atunci eu pretind aici că am de gând să le schimba. 68 00:02:57,540 --> 00:03:00,800 Am lăsat un loc gol aici pentru a ne completați astăzi, într-o clipă. 69 00:03:00,800 --> 00:03:03,380 Apoi, am de gând să pretind că două variabile au fost schimbate. 70 00:03:03,380 --> 00:03:04,770 Apoi, am de gând să imprima le din nou. 71 00:03:04,770 --> 00:03:07,090 Și așa sperăm, că ar trebui să vezi 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Asta e super-simplu Scopul chiar acum. 74 00:03:09,830 --> 00:03:12,430 >> Deci, cum putem merge despre schimbarea două variabile? 75 00:03:12,430 --> 00:03:17,220 Ei bine, dacă eu propun aici că aceste cupe ar putea reprezenta memorie într-un calculator. 76 00:03:17,220 --> 00:03:19,070 Aceasta este o mușcătură, această este un alt mușcătură. 77 00:03:19,070 --> 00:03:23,260 Am fi putut-o voluntar venit pe sus și amesteca-ne ceva de băut, dacă familiar? 78 00:03:23,260 --> 00:03:23,920 Hai sus. 79 00:03:23,920 --> 00:03:24,815 Care e numele tău? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID MALAN: Jess? 82 00:03:25,690 --> 00:03:26,540 Hai sus, Jess. 83 00:03:26,540 --> 00:03:29,180 Dacă nu te superi, trebuie sa punem Google sticla pe tine astfel încât să putem 84 00:03:29,180 --> 00:03:30,430 imortaliza acest lucru. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, sticla. 87 00:03:34,670 --> 00:03:37,250 Înregistrarea unui clip video. 88 00:03:37,250 --> 00:03:43,103 Și OK, suntem buni la du-te cu Jess aici. 89 00:03:43,103 --> 00:03:43,810 Bine. 90 00:03:43,810 --> 00:03:45,120 Îmi pare bine. 91 00:03:45,120 --> 00:03:47,720 >> Deci, ce aș vrea să fac aici - dacă ai putea, destul de repede - 92 00:03:47,720 --> 00:03:51,040 doar ne toarna o jumatate de pahar de Orange suc și o jumătate de pahar de lapte, 93 00:03:51,040 --> 00:03:55,710 reprezentând eficient numerele 1 într-o singură cupă și 2 în cealaltă cupa. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Acest lucru va fi imagini bune. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Îmi pare rău. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nu, nu. 99 00:04:06,330 --> 00:04:08,703 E în regulă. 100 00:04:08,703 --> 00:04:10,120 Frumos. 101 00:04:10,120 --> 00:04:12,950 În regulă, deci avem patru octeți în valoare de suc de portocale. 102 00:04:12,950 --> 00:04:14,460 Vom numit valoarea 1. 103 00:04:14,460 --> 00:04:16,579 Acum, un alt patru octeti în valoare de lapte. 104 00:04:16,579 --> 00:04:18,519 Va numi valoarea 2. 105 00:04:18,519 --> 00:04:20,440 Deci, x și y, respectiv. 106 00:04:20,440 --> 00:04:23,450 >> Bine, asa ca acum, dacă sarcina la îndemână - pentru tine, Jess, în fața tuturor 107 00:04:23,450 --> 00:04:24,270 de colegii dumneavoastră - 108 00:04:24,270 --> 00:04:28,510 este de a schimba valorile x și y astfel pe care ne-o dorim suc de portocale în 109 00:04:28,510 --> 00:04:32,070 alte Cup și laptele în acest pahar, cum S-ar putea - înainte de a face de fapt, 110 00:04:32,070 --> 00:04:34,020 l - du-te despre a face acest lucru? 111 00:04:34,020 --> 00:04:35,220 >> OK, decizie inteleapta. 112 00:04:35,220 --> 00:04:36,340 Deci, ai nevoie de un pic mai mult memorie. 113 00:04:36,340 --> 00:04:38,190 Deci, haideți să aloce o temporar ceașcă, dacă vreți. 114 00:04:38,190 --> 00:04:40,540 Si acum continua să facă schimb de x și y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excelent. 117 00:04:53,530 --> 00:04:54,420 Deci, foarte bine facut. 118 00:04:54,420 --> 00:04:55,670 Vă mulțumesc foarte mult, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Poftiți. 121 00:05:00,020 --> 00:05:01,950 Un mic suvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, deci, evident, o idee foarte simplă. 123 00:05:04,350 --> 00:05:07,500 Complet intuitiv că avem nevoie de un pic mai mult spațiu de stocare - în această formă, 124 00:05:07,500 --> 00:05:09,750 o ceașcă - dacă de fapt, doresc să schimba aceste două variabile. 125 00:05:09,750 --> 00:05:11,110 Deci, haideți să facă exact acest lucru. 126 00:05:11,110 --> 00:05:14,330 Aici între care eu pretind că sunt gând să faci ceva pompare, voi 127 00:05:14,330 --> 00:05:15,720 mergeți mai departe și să declare temp. 128 00:05:15,720 --> 00:05:17,980 Și voi stabili o egal cu, să zicem, x. 129 00:05:17,980 --> 00:05:21,110 >> Apoi, am de gând să schimbe valoarea de x fel ca Jess făcut aici cu 130 00:05:21,110 --> 00:05:23,200 lapte și suc de portocale să fie egal cu y. 131 00:05:23,200 --> 00:05:27,460 Și am de gând să schimbe y să fie egal pentru a nu x, pentru că acum ne-ar fi 132 00:05:27,460 --> 00:05:29,530 blocat într-un cerc, ci mai degrabă temp. 133 00:05:29,530 --> 00:05:33,170 Unde am temporar - sau în cazul în care Jess a pus temporar suc de portocale 134 00:05:33,170 --> 00:05:35,460 înainte platesti care cupa cu lapte. 135 00:05:35,460 --> 00:05:37,250 >> Așa că lasă-mă să merg mai departe acum și să facă acest lucru. 136 00:05:37,250 --> 00:05:39,210 Se numește noswap.c. 137 00:05:39,210 --> 00:05:41,190 Și acum permiteți-mi să ruleze nu de swap. 138 00:05:41,190 --> 00:05:43,910 Și într-adevăr văd, dacă am extinde Fereastra un pic, că 139 00:05:43,910 --> 00:05:45,160 x este 1, y este 2. 140 00:05:45,160 --> 00:05:47,230 Și atunci x este 2, y este 1. 141 00:05:47,230 --> 00:05:51,910 >> Dar amintesc că luni am făcut lucruri un pic diferit prin care am 142 00:05:51,910 --> 00:05:56,760 implementat în schimb o funcție de ajutor, dacă vreți, care a fost de fapt gol. 143 00:05:56,760 --> 00:05:58,010 Am sunat-l schimb. 144 00:05:58,010 --> 00:06:01,600 I-am dat doi parametri, și am sunat le-o și am sunat le-b. 145 00:06:01,600 --> 00:06:04,380 >> Sincer, am putea să le x și y apel. 146 00:06:04,380 --> 00:06:06,040 Nu e nimic de oprire ma de la a face asta. 147 00:06:06,040 --> 00:06:08,140 Dar aș argumenta că e atunci un pic ambiguu. 148 00:06:08,140 --> 00:06:11,910 Deoarece amintesc de luni pe care le a susținut că acești parametri au fost 149 00:06:11,910 --> 00:06:13,650 copii ale valorilor trecut inch 150 00:06:13,650 --> 00:06:15,640 Deci, doar popotelor cu dvs. minte, cred că, dacă utilizați 151 00:06:15,640 --> 00:06:17,370 exact aceleași variabile. 152 00:06:17,370 --> 00:06:20,150 >> Asa ca le voi numi un loc și b, doar pentru claritate. 153 00:06:20,150 --> 00:06:21,840 Dar le-am putea numi cele mai orice vrem. 154 00:06:21,840 --> 00:06:26,280 Și am de gând să copiați și să lipiți în mod eficient acest cod de acolo de sus 155 00:06:26,280 --> 00:06:27,170 jos în aici. 156 00:06:27,170 --> 00:06:29,110 Pentru că am văzut că funcționează. 157 00:06:29,110 --> 00:06:30,790 Deci, asta e intr-o forma destul de buna. 158 00:06:30,790 --> 00:06:37,390 Și voi schimba mea x la o, mi x pentru o, y mea de b și y mea de b. 159 00:06:37,390 --> 00:06:39,130 >> Deci, cu alte cuvinte, aceeași logică exactă. 160 00:06:39,130 --> 00:06:40,850 Exact același lucru pe care Jess făcut. 161 00:06:40,850 --> 00:06:44,350 Și apoi singurul lucru ce trebuie să fac în sus aici, desigur, este acum invoca această 162 00:06:44,350 --> 00:06:45,990 funcția, sau suna această funcție. 163 00:06:45,990 --> 00:06:50,430 Așa că va apela această funcție cu două intrări, x și y, și a lovit Salvare. 164 00:06:50,430 --> 00:06:52,300 >> În regulă, deci fundamental același lucru. 165 00:06:52,300 --> 00:06:55,570 De fapt, le-am făcut, probabil, programul inutil de complexe de 166 00:06:55,570 --> 00:07:00,820 scris o funcție care tocmai ia unele șase linii de cod în timp ce eu 167 00:07:00,820 --> 00:07:02,970 anterior au pus în aplicare acest lucru în doar trei. 168 00:07:02,970 --> 00:07:06,230 >> Așa că lasă-mă să merg mai departe acum și remake-ul acest lucru, nu fac nici de swap. 169 00:07:06,230 --> 00:07:07,920 În regulă, am greșit aici. 170 00:07:07,920 --> 00:07:11,290 Acest lucru ar trebui să fie o eroare care s-ar putea a se vedea în ce mai frecvent ca dvs. 171 00:07:11,290 --> 00:07:12,380 Programele devin mai complexe. 172 00:07:12,380 --> 00:07:13,470 Dar există o repara ușor. 173 00:07:13,470 --> 00:07:15,650 Lasă-mă să derulați înapoi aici. 174 00:07:15,650 --> 00:07:18,190 >> Și ceea ce este prima eroare văd eu? 175 00:07:18,190 --> 00:07:19,520 Declarația implicit. 176 00:07:19,520 --> 00:07:21,466 Ce înseamnă că indică de obicei? 177 00:07:21,466 --> 00:07:22,830 Oh, am uitat prototipul. 178 00:07:22,830 --> 00:07:26,900 Am uitat să-i învețe compilator care swap- va exista, chiar dacă el 179 00:07:26,900 --> 00:07:28,920 nu există de la bun început a programului. 180 00:07:28,920 --> 00:07:35,780 Deci, eu sunt doar de gând să spun vid, de swap, Int, un b Int, punct și virgulă. 181 00:07:35,780 --> 00:07:37,280 >> Deci, eu nu am de gând să-l reimplementa. 182 00:07:37,280 --> 00:07:39,140 Dar acum se potrivește cu ceea ce este aici. 183 00:07:39,140 --> 00:07:42,530 Și notificare, lipsa de un punct și virgulă aici, care nu este necesară atunci când 184 00:07:42,530 --> 00:07:43,200 de punere în aplicare. 185 00:07:43,200 --> 00:07:46,010 >> Deci, lasă-mă să refacă acest lucru, nu fac schimb. 186 00:07:46,010 --> 00:07:46,910 Mult mai bine forma. 187 00:07:46,910 --> 00:07:48,130 Rula nici de swap. 188 00:07:48,130 --> 00:07:48,740 Și la naiba. 189 00:07:48,740 --> 00:07:51,650 Acum ne-am întors de unde am fost, luni, în cazul în care lucru nu schimba. 190 00:07:51,650 --> 00:07:55,410 >> Și ceea ce este explicația intuitiv de ce acesta este cazul? 191 00:07:55,410 --> 00:07:56,380 Da? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [inaudibil]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Exact. 195 00:08:05,230 --> 00:08:07,330 Deci, a și b sunt copii ale x și y. 196 00:08:07,330 --> 00:08:10,680 Și, de fapt, în orice moment ai fost apelarea unei funcții până acum că 197 00:08:10,680 --> 00:08:12,540 trece variabile, cum ar fi int - 198 00:08:12,540 --> 00:08:14,470 la fel de swap se asteapta aici - 199 00:08:14,470 --> 00:08:16,270 voi au fost trecerea la copii. 200 00:08:16,270 --> 00:08:19,150 >> Acum, asta înseamnă că este nevoie de un pic de timp, o fracțiune de secundă, pentru 201 00:08:19,150 --> 00:08:23,270 computer pentru a copia de biți de la un variabilă în biți de altul. 202 00:08:23,270 --> 00:08:24,610 Dar asta nu-i mare lucru. 203 00:08:24,610 --> 00:08:25,920 Dar ele sunt, totuși, o copie. 204 00:08:25,920 --> 00:08:30,020 >> Iar acum, în contextul schimb, Sunt, de fapt, cu succes 205 00:08:30,020 --> 00:08:31,180 schimbare a și b. 206 00:08:31,180 --> 00:08:33,000 De fapt, hai să facem o scurtă verifică bun-simț. 207 00:08:33,000 --> 00:08:36,830 Print f o este de% i, linie nouă. 208 00:08:36,830 --> 00:08:38,770 Și conectați hai într-o. 209 00:08:38,770 --> 00:08:41,830 Acum, hai sa facem acelasi lucru cu b. 210 00:08:41,830 --> 00:08:43,640 Și să facem același lucru aici. 211 00:08:43,640 --> 00:08:47,260 >> Și acum, permiteți-mi să copiați aceleași linii din nou la partea de jos a funcției 212 00:08:47,260 --> 00:08:51,250 după cei trei linii de interesant ar putea fi executate, și 213 00:08:51,250 --> 00:08:53,270 imprimare a și b din nou. 214 00:08:53,270 --> 00:08:56,030 Deci, acum, hai să facem acest lucru, nu fac schimb. 215 00:08:56,030 --> 00:08:58,430 Permiteți-mi să fac o fereastră terminal bit mai înalt, astfel încât să putem vedea 216 00:08:58,430 --> 00:08:59,520 mai mult de ea, la o dată. 217 00:08:59,520 --> 00:09:00,860 >> Și a alerga nu de swap. 218 00:09:00,860 --> 00:09:04,000 x este 1, y este 2. a este 1, b este 2. 219 00:09:04,000 --> 00:09:06,070 Și apoi, o este 2, b este 1. 220 00:09:06,070 --> 00:09:09,390 Deci, este de lucru, la fel ca Jess a făcut aici în interiorul de swap. 221 00:09:09,390 --> 00:09:13,090 Dar, desigur, se are nici un efect pe variabile în principal. 222 00:09:13,090 --> 00:09:15,360 >> Așa că am văzut un truc prin care am ar putea rezolva această problemă, nu? 223 00:09:15,360 --> 00:09:19,560 Cand esti confruntat cu această definire a domeniului problema, ai putea miza si faceti-va x 224 00:09:19,560 --> 00:09:22,400 și Y ce fel de variabile în loc? 225 00:09:22,400 --> 00:09:23,390 >> Ai putea să le facă la nivel mondial. 226 00:09:23,390 --> 00:09:27,560 Pune-le la foarte de sus a fișierului așa cum am făcut-o, chiar și în jocul de 15. 227 00:09:27,560 --> 00:09:28,890 Noi folosim o variabilă globală. 228 00:09:28,890 --> 00:09:32,420 Dar, în cadrul unui joc 15, este rezonabil să aibă un nivel global 229 00:09:32,420 --> 00:09:37,170 variabilei reprezentând bord, deoarece toate elementele de 15.c este tot 230 00:09:37,170 --> 00:09:38,650 de punere în aplicare a jocului. 231 00:09:38,650 --> 00:09:41,470 Asta e ceea ce există fișierul de a face. 232 00:09:41,470 --> 00:09:44,170 >> Dar, în acest caz aici, eu sunt solicită un schimb funcție. 233 00:09:44,170 --> 00:09:45,380 Vreau să schimb două variabile. 234 00:09:45,380 --> 00:09:48,950 Și ar trebui să înceapă să se simtă doar neglijent dacă soluția la toate noastre 235 00:09:48,950 --> 00:09:51,300 probleme atunci când am rula în domeniul de aplicare probleme este de a face aceasta la nivel mondial. 236 00:09:51,300 --> 00:09:54,730 Pentru că foarte repede programul nostru este va deveni destul de un dezastru. 237 00:09:54,730 --> 00:09:57,760 Și am făcut asta foarte rar ca rezultat în 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Dar se pare că există o cale mai bună totul. 239 00:10:00,470 --> 00:10:05,600 Permiteți-mi merge de fapt, înapoi și a șterge imprima lui f, doar pentru a simplifica acest cod. 240 00:10:05,600 --> 00:10:09,160 Și permiteți-mi să propun ca acest lucru, într-adevăr, este rău. 241 00:10:09,160 --> 00:10:15,990 Dar, dacă în loc să adaug, in unele asteriscuri și stele, eu pot transforma în schimb acest 242 00:10:15,990 --> 00:10:18,670 funcție într-una care este de fapt operaționale. 243 00:10:18,670 --> 00:10:25,020 >> Așa că lasă-mă să mă întorc aici și să recunoaștem spune asteriscuri este întotdeauna dificil, 244 00:10:25,020 --> 00:10:26,170 asa ca voi spune stele. 245 00:10:26,170 --> 00:10:27,660 Voi Fess doar până la acel unul. 246 00:10:27,660 --> 00:10:28,190 Bine. 247 00:10:28,190 --> 00:10:30,190 Și acum, ce am de gând de a face schimb? 248 00:10:30,190 --> 00:10:34,130 >> Deci, în primul rând, am de gând să specificați că, în loc de a trece un int în 249 00:10:34,130 --> 00:10:37,980 funcția de swap, eu sunt în schimb de gând să spun stea Int. 250 00:10:37,980 --> 00:10:39,170 Acum, ceea ce indică steaua? 251 00:10:39,170 --> 00:10:41,970 Acest lucru este că noțiunea de un pointer care Binky, caracterul claymation, a fost 252 00:10:41,970 --> 00:10:43,465 referindu-se la un moment în urmă. 253 00:10:43,465 --> 00:10:47,610 >> Deci, dacă am spune Int stele, sensul acest lucru acum este că o nu va fi 254 00:10:47,610 --> 00:10:49,110 în trecut prin valoarea sa. 255 00:10:49,110 --> 00:10:50,350 Nu va fi copiat inch 256 00:10:50,350 --> 00:10:54,700 Mai degrabă, este adresa unui va fi trecut inch 257 00:10:54,700 --> 00:10:57,840 >> Astfel amintesc că în interiorul computerului este o grămadă de memorie, altfel 258 00:10:57,840 --> 00:10:58,760 cunoscut sub numele de RAM. 259 00:10:58,760 --> 00:11:00,520 Și că RAM este doar o grămadă de bytes. 260 00:11:00,520 --> 00:11:03,320 Deci, în cazul în care Mac-ul sau PC-ul are doi gigabytes, aveți 2 261 00:11:03,320 --> 00:11:05,760 miliarde de bytes de memorie. 262 00:11:05,760 --> 00:11:08,440 >> Acum, sa presupunem doar că doar a să păstreze lucrurile frumos și ordonat, am 263 00:11:08,440 --> 00:11:09,450 atribui o adresă - 264 00:11:09,450 --> 00:11:10,170 un număr - 265 00:11:10,170 --> 00:11:12,270 pentru fiecare octet de RAM din computer. 266 00:11:12,270 --> 00:11:15,410 Primul octet din cei 2 miliarde de euro este de numărul zero. 267 00:11:15,410 --> 00:11:18,572 Următorul este numărul un octet, numărul doi, tot drumul pe sus, dot dot 268 00:11:18,572 --> 00:11:20,530 punct, la aproximativ 2 miliarde. 269 00:11:20,530 --> 00:11:23,640 >> Astfel încât să puteți numarul de bytes de memorie în computer. 270 00:11:23,640 --> 00:11:26,460 Deci, să presupunem că asta e ceea ce ne referim de o adresă. 271 00:11:26,460 --> 00:11:31,360 Așa că atunci când văd int stea o, ce se întâmplă a fi trecut în schimb acum este 272 00:11:31,360 --> 00:11:32,830 adresa o. 273 00:11:32,830 --> 00:11:37,150 Nu sa valoare, dar indiferent poștal sale Adresa este, ca să spunem așa - 274 00:11:37,150 --> 00:11:38,810 locației sale în RAM. 275 00:11:38,810 --> 00:11:41,250 >> Și în mod similar pentru b, am de gând pentru a spune același lucru. 276 00:11:41,250 --> 00:11:42,720 Int, stele, b. 277 00:11:42,720 --> 00:11:46,350 Ca o paranteza, tehnic stele ar putea merge în alte locații. 278 00:11:46,350 --> 00:11:50,140 Dar vom standardiza de stele fiind chiar lângă tipul de date. 279 00:11:50,140 --> 00:11:54,080 >> Deci semnături Swap înseamnă acum, dă-mi adresa un int, iar apelul 280 00:11:54,080 --> 00:11:55,400 că adresa o. 281 00:11:55,400 --> 00:11:58,690 Și dă-mi o adresa de INT și apelați care adresa b.. 282 00:11:58,690 --> 00:12:01,120 >> Dar acum codul meu de aici trebuie să se schimbe. 283 00:12:01,120 --> 00:12:03,470 Pentru că dacă eu declar temp int - 284 00:12:03,470 --> 00:12:05,580 care este încă de tip int - 285 00:12:05,580 --> 00:12:08,700 dar păstrează într-o, ce fel de valoare? 286 00:12:08,700 --> 00:12:12,870 Pentru a fi clar, am pune un o cu codul asa cum este scris chiar acum? 287 00:12:12,870 --> 00:12:14,360 >> Pun locație într-o. 288 00:12:14,360 --> 00:12:16,500 Dar nu-mi pasă despre locația acum, nu? 289 00:12:16,500 --> 00:12:21,940 Temperatura există doar trei ceașcă Jess " a existat, pentru ce scop? 290 00:12:21,940 --> 00:12:23,090 Pentru a stoca o valoare. 291 00:12:23,090 --> 00:12:24,830 Lapte sau suc de portocale. 292 00:12:24,830 --> 00:12:28,520 Nu a stoca de fapt adresa oricare dintre aceste lucruri, care se simte un 293 00:12:28,520 --> 00:12:31,200 puțin lipsite de sens în această reală Contextul mondial oricum. 294 00:12:31,200 --> 00:12:34,990 >> Deci, într-adevăr, ceea ce vreau să pun la temp nu este adresa unui, dar 295 00:12:34,990 --> 00:12:36,180 Conținutul o. 296 00:12:36,180 --> 00:12:41,930 Deci, dacă a este un număr ca 123, aceasta este octet 123 de memorie care o tocmai 297 00:12:41,930 --> 00:12:45,090 întâmplă să fie ocuparea, că valoarea într-o întâmplă să fie de ocupație. 298 00:12:45,090 --> 00:12:49,040 >> Dacă eu vreau să merg la acea adresă, Am nevoie să spun o stea. 299 00:12:49,040 --> 00:12:52,610 Similar, dacă ar fi să schimbe ceea ce este la adresa unei, am schimba 300 00:12:52,610 --> 00:12:53,570 aceasta pentru a începe o. 301 00:12:53,570 --> 00:12:58,185 Dacă vreau să stocați în ceea ce-i la o locatie cu ceea ce este la locul 302 00:12:58,185 --> 00:13:02,180 la b, b stele stele. 303 00:13:02,180 --> 00:13:05,340 >> Deci, pe scurt, chiar dacă acest lucru nu este destul scufundarea în încă - și nu aș aștepta 304 00:13:05,340 --> 00:13:06,560 că ar fi atât de repede - 305 00:13:06,560 --> 00:13:11,100 dau seama că tot ce fac este prefixarea aceste stelele la variabile mele, 306 00:13:11,100 --> 00:13:13,350 spune nu apuca valorile. 307 00:13:13,350 --> 00:13:14,520 Nu schimba valorile. 308 00:13:14,520 --> 00:13:17,600 Ci, mai degrabă, du-te la aceste adrese și pentru a obține valoarea. 309 00:13:17,600 --> 00:13:21,430 Du-te la acea adresă și schimbarea valoare acolo. 310 00:13:21,430 --> 00:13:25,500 >> Deci, acum lasă-mă să derulați înapoi până la partea de sus, doar pentru a rezolva această linie aici, la 311 00:13:25,500 --> 00:13:27,690 schimba prototip pentru a se potrivi. 312 00:13:27,690 --> 00:13:30,280 Dar acum am nevoie pentru a face un alt lucru. 313 00:13:30,280 --> 00:13:35,500 Intuitiv, dacă m-am schimbat tipurile de argumente care de swap se așteaptă, 314 00:13:35,500 --> 00:13:37,245 Ce altceva am nevoie pentru a schimba în codul meu? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Când m-am apel de swap. 317 00:13:40,840 --> 00:13:43,340 Pentru că acum, ce am Am trece de a schimba în continuare? 318 00:13:43,340 --> 00:13:47,450 Valoarea x și valoarea lui y, sau lapte și suc de portocale. 319 00:13:47,450 --> 00:13:48,510 Dar eu nu vreau să fac asta. 320 00:13:48,510 --> 00:13:51,060 Eu în schimb să treacă în ce? 321 00:13:51,060 --> 00:13:53,050 Locul de amplasare a x și locația de y. 322 00:13:53,050 --> 00:13:55,300 Care sunt adresele lor poștale, ca să spunem așa. 323 00:13:55,300 --> 00:13:57,600 >> Deci, pentru a face acest lucru, există un ampersand. 324 00:13:57,600 --> 00:13:59,260 Fel ampersand de sunete, cum ar fi adresa. 325 00:13:59,260 --> 00:14:03,240 așa n, ampersand, adresa lui x, și adresa de y. 326 00:14:03,240 --> 00:14:06,790 Deci, este deliberată pe care le folosim ampersand când apela functia, 327 00:14:06,790 --> 00:14:10,230 și stelele când declararea și atunci când realizarea funcției. 328 00:14:10,230 --> 00:14:14,220 >> Și cred că a ampersand ca adresa operatorului, și stele, cum 329 00:14:14,220 --> 00:14:15,490 du-te acolo operatorul - 330 00:14:15,490 --> 00:14:18,640 sau, mai corect, operatorul dereference. 331 00:14:18,640 --> 00:14:23,480 Astfel că este o mulțime de cuvinte doar pentru a spun că acum, sperăm, de swap se întâmplă 332 00:14:23,480 --> 00:14:24,440 pentru a fi corect. 333 00:14:24,440 --> 00:14:26,550 >> Lasă-mă să merg mai departe și să facă - 334 00:14:26,550 --> 00:14:30,940 să redenumiți efectiv fișierul, ca nu cumva acest program încă să fie numit nici de swap. 335 00:14:30,940 --> 00:14:33,240 Eu susțin că o vom numi swap.c acum. 336 00:14:33,240 --> 00:14:35,670 Deci, a face, schimba. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, schimba. 338 00:14:37,520 --> 00:14:40,210 >> Și acum, într-adevăr, x este 1, y este 2. 339 00:14:40,210 --> 00:14:44,040 Și apoi, x este 2, y este unul. 340 00:14:44,040 --> 00:14:46,500 Ei bine, să vedem dacă nu putem face acest lucru o pic diferit cu privire la ceea ce este 341 00:14:46,500 --> 00:14:47,180 întâmplă pe aici. 342 00:14:47,180 --> 00:14:51,250 În primul rând, permiteți-mi mări noastră desen ecran aici. 343 00:14:51,250 --> 00:14:54,160 Și lasă-mă să propună pentru un moment - și ori de câte ori mă trage aici vor fi reflectate 344 00:14:54,160 --> 00:14:58,660 acolo acum - permiteți-mi să propun ca aici este o grămadă de memorie, sau 345 00:14:58,660 --> 00:15:00,540 RAM, în interiorul computerul meu. 346 00:15:00,540 --> 00:15:04,140 >> Și acesta va fi numărul musca, să zicem, 1. 347 00:15:04,140 --> 00:15:05,720 Acest lucru va fi octeți numărul 2. 348 00:15:05,720 --> 00:15:08,220 Și eu voi face o grămadă mai mult, și apoi o grămadă de dot dot puncte de 349 00:15:08,220 --> 00:15:10,880 indică faptul că există 2 miliarde de euro de aceste lucruri. 350 00:15:10,880 --> 00:15:13,520 4, 5, și așa mai departe. 351 00:15:13,520 --> 00:15:17,055 >> Deci, există primii cinci octeti de memoria computerului meu. 352 00:15:17,055 --> 00:15:17,560 În regulă? 353 00:15:17,560 --> 00:15:19,060 Foarte puțini din 2 miliarde de euro. 354 00:15:19,060 --> 00:15:21,120 Dar acum am de gând să propună următor. 355 00:15:21,120 --> 00:15:27,490 Am de gând să propun ca x va stoca numărul 1, și Y se întâmplă 356 00:15:27,490 --> 00:15:29,690 pentru a stoca numărul 2. 357 00:15:29,690 --> 00:15:35,000 Și lasă-mă să merg mai departe acum și reprezintă aceste valori, după cum urmează. 358 00:15:35,000 --> 00:15:41,510 >> Să facem acest lucru, după cum urmează. 359 00:15:41,510 --> 00:15:42,870 Dă-mi doar o secundă. 360 00:15:42,870 --> 00:15:44,150 O secundă. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Vreau sa fac acest lucru un pic - 363 00:15:47,560 --> 00:15:50,440 hai sa facem acest lucru din nou. 364 00:15:50,440 --> 00:15:53,250 În caz contrar, am de gând să și utilizarea aceleași numere, neintenționat, 365 00:15:53,250 --> 00:15:54,230 de mai multe ori. 366 00:15:54,230 --> 00:15:57,320 >> Deci, doar așa că avem numere diferite pentru a vorbi despre, sa-i spunem acest octet 367 00:15:57,320 --> 00:16:03,391 numărul 123, 124, 125, 126, și dot dot dot. 368 00:16:03,391 --> 00:16:08,400 Și permiteți-mi să pretind că am de gând să pune valoarea 1 aici, iar valoarea 2 369 00:16:08,400 --> 00:16:11,990 aici, altfel cunoscut ca x și y. 370 00:16:11,990 --> 00:16:15,300 Așa că doar așa se întâmplă că acest lucru este x, aceasta este y. 371 00:16:15,300 --> 00:16:18,180 >> Și doar printr-o întâmplare, calculator, sistemul de operare, 372 00:16:18,180 --> 00:16:21,890 sa întâmplat să pună x la locație numărul 123. 373 00:16:21,890 --> 00:16:25,590 Și Y ajuns la locația 124 - 374 00:16:25,590 --> 00:16:26,330 la naiba. 375 00:16:26,330 --> 00:16:28,700 Ar fi trebuit stabilit acest lucru. 376 00:16:28,700 --> 00:16:34,040 Oh, omule, nu chiar vreau să fac asta? 377 00:16:34,040 --> 00:16:37,340 Da, doresc să se stabilească acest lucru și b buna despre acest lucru astăzi. 378 00:16:37,340 --> 00:16:39,950 Ne pare rău, noi la asta. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, și nu am vrut să fie această complex, dar de ce am schimba 380 00:16:45,020 --> 00:16:46,340 Numerele acolo? 381 00:16:46,340 --> 00:16:48,360 Pentru că doresc să int fi de fapt patru bytes. 382 00:16:48,360 --> 00:16:49,810 Deci, hai să fim foarte anal cu privire la acest lucru. 383 00:16:49,810 --> 00:16:53,800 Așa că, dacă 1 se întâmplă să fie abordate 123, 2 va fi la adresa 384 00:16:53,800 --> 00:16:55,730 127 pentru ca e doar 4 despartirile departe. 385 00:16:55,730 --> 00:16:56,210 Asta e tot. 386 00:16:56,210 --> 00:16:58,640 Și vom uita de toate alte adrese din lume. 387 00:16:58,640 --> 00:17:03,320 >> Deci, x este la locația 123, y este la locația 127. 388 00:17:03,320 --> 00:17:05,770 Și acum, ce fac eu de fapt vrei sa faci? 389 00:17:05,770 --> 00:17:10,099 Când m-am apel de swap acum, ceea ce este de fapt se întâmplă? 390 00:17:10,099 --> 00:17:14,920 Ei bine, când am apel schimb, am trece la adresa x și adresa de y. 391 00:17:14,920 --> 00:17:18,540 Deci, de exemplu, în cazul în care aceste două piese de hârtie reprezintă acum două 392 00:17:18,540 --> 00:17:23,510 Argumentele a și b pentru a schimba, ceea ce sunt eu de gând să scrie pe prima dintre acestea, 393 00:17:23,510 --> 00:17:27,720 pe care am de gând pentru a apela referă la ca o? 394 00:17:27,720 --> 00:17:30,610 >> Exact, 123. 395 00:17:30,610 --> 00:17:31,905 Deci, acest lucru am pretinde este o. 396 00:17:31,905 --> 00:17:32,955 Acesta este un parametru. 397 00:17:32,955 --> 00:17:35,856 Pun adresa de x acolo. 398 00:17:35,856 --> 00:17:38,152 >> Ce-i asta? 399 00:17:38,152 --> 00:17:40,890 >> Ce-i asta? 400 00:17:40,890 --> 00:17:41,190 >> Nu, nu. 401 00:17:41,190 --> 00:17:41,720 Asta e OK. 402 00:17:41,720 --> 00:17:42,570 Încă bun, mai bun. 403 00:17:42,570 --> 00:17:43,530 Deci, aceasta este o. 404 00:17:43,530 --> 00:17:46,240 Și acum în a doua bucată de hârtie, acest lucru va fi b, și ceea ce sunt eu 405 00:17:46,240 --> 00:17:49,010 va fi scris pe această bucată de hârtie? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Deci, singurul lucru care sa schimbat de la elocvent noastră anterioară a acestei povești este, 408 00:17:53,720 --> 00:17:58,590 mai degrabă decât pur și simplu 1 și 2, sunt O să treacă în 123 și 127. 409 00:17:58,590 --> 00:18:02,130 Și am acum de gând să pun astea în interiorul din această casetă, bine? 410 00:18:02,130 --> 00:18:04,640 Astfel că cutie neagră reprezintă acum funcția de swap. 411 00:18:04,640 --> 00:18:07,230 >> Între timp, hai acum pe cineva implementa funcția de swap. 412 00:18:07,230 --> 00:18:09,090 Ar fi cineva aici ofer voluntar? 413 00:18:09,090 --> 00:18:09,560 Hai sus. 414 00:18:09,560 --> 00:18:11,080 Care e numele tău? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 În regulă, Charlie. 417 00:18:12,080 --> 00:18:14,810 Hai sus. 418 00:18:14,810 --> 00:18:17,310 >> Deci, Charlie se va juca rolul de cutia neagră. 419 00:18:17,310 --> 00:18:21,460 Și Charlie, ce mi-ar place să faci acum se implementeze schimbul în așa fel 420 00:18:21,460 --> 00:18:25,320 că, având în vedere cele două adrese, ai fost de fapt merge 421 00:18:25,320 --> 00:18:26,330 pentru a schimba valorile. 422 00:18:26,330 --> 00:18:28,290 Și voi sopti la ureche Cum de a rula televizor aici. 423 00:18:28,290 --> 00:18:29,930 >> Așa că mergeți mai departe, și tu ești cutia neagră. 424 00:18:29,930 --> 00:18:30,920 Ajunge acolo. 425 00:18:30,920 --> 00:18:34,054 Ce valori vezi pentru o, și Ce valori vezi pentru b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: a este 123 și b este 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: Bine, exact. 428 00:18:37,530 --> 00:18:38,940 Acum, pauza acolo doar pentru o clipă. 429 00:18:38,940 --> 00:18:41,680 Primul lucru pe care ai de gând să faci acum, conform codului - care 430 00:18:41,680 --> 00:18:43,220 Voi trage acum pe ecran - 431 00:18:43,220 --> 00:18:46,750 va fi de a aloca un pic bit de memorie numit temp. 432 00:18:46,750 --> 00:18:48,850 Așa că am de gând să merg mai departe și da acea memorie. 433 00:18:48,850 --> 00:18:52,210 >> Deci, aceasta va fi a treia variabilă că aveți acces la 434 00:18:52,210 --> 00:18:54,080 ai sunat temp. 435 00:18:54,080 --> 00:18:57,120 Și ce ai de gând să scrie pe bucata temperatura de hârtie? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: indicatori, corect? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, dar nu neapărat indicii. 439 00:19:04,790 --> 00:19:07,230 Deci, linia de cod care le-am evidențiată pe partea dreaptă, 440 00:19:07,230 --> 00:19:07,900 Să începem de acolo. 441 00:19:07,900 --> 00:19:08,890 Se spune o stea. 442 00:19:08,890 --> 00:19:11,670 Deci, o este în prezent stocarea numărul 123. 443 00:19:11,670 --> 00:19:16,660 Și doar intuitiv, ceea ce am vrut stele 123? 444 00:19:16,660 --> 00:19:21,630 >> Dar în mod special, în cazul în care a este 123, stele, un mijloc de ce? 445 00:19:21,630 --> 00:19:22,560 Valoarea unui. 446 00:19:22,560 --> 00:19:24,580 Sau mai mult ocazional, du-te acolo. 447 00:19:24,580 --> 00:19:28,620 Deci, permiteți-mi să propun ca, deține o în mâna ta, mergeți mai departe și să trateze ca 448 00:19:28,620 --> 00:19:29,430 de parcă ar fi o hartă. 449 00:19:29,430 --> 00:19:32,940 Și merge-te pe a calculatorului memorie, și ne găsim ceea ce este 450 00:19:32,940 --> 00:19:36,520 la locația 123. 451 00:19:36,520 --> 00:19:37,720 Exact. 452 00:19:37,720 --> 00:19:41,100 >> Deci, vom vedea la locația 123 este ceea ce, în mod evident? 453 00:19:41,100 --> 00:19:44,240 OK, deci ce valoare acum esti gând să pună în temp? 454 00:19:44,240 --> 00:19:44,750 Exact. 455 00:19:44,750 --> 00:19:45,600 Deci, mergeți mai departe și face asta. 456 00:19:45,600 --> 00:19:51,280 Și scrie numărul 1 de pe bucata de hârtie, care este intitulat în prezent temp. 457 00:19:51,280 --> 00:19:53,540 >> Și acum, următorul pas pe care ai de gând să pună în aplicare 458 00:19:53,540 --> 00:19:54,310 va fi ceea ce. 459 00:19:54,310 --> 00:19:57,820 Ei bine, pe partea dreaptă a următoarea linie de cod este steaua b. b, de 460 00:19:57,820 --> 00:19:59,260 Desigur, stochează o adresă. 461 00:19:59,260 --> 00:20:02,270 Care se adresează 127. 462 00:20:02,270 --> 00:20:06,620 Steaua b înseamnă ceea ce, ocazional vorbind? 463 00:20:06,620 --> 00:20:08,700 >> Du-te la acea locație. 464 00:20:08,700 --> 00:20:14,988 Deci, mergeți mai departe și ne găsim ceea ce este la locația 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Desigur, la locația 127, este încă valoarea 2. 467 00:20:19,170 --> 00:20:24,060 Deci, ce ai de gând acum la magazin orice e de locație într-o? 468 00:20:24,060 --> 00:20:26,860 Deci stea un mijloc de a merge la locul de. 469 00:20:26,860 --> 00:20:29,770 Care este locatia un? 470 00:20:29,770 --> 00:20:30,430 >> Exact. 471 00:20:30,430 --> 00:20:34,190 Deci, acum, dacă doriți să modificați ceea ce la acea locație - 472 00:20:34,190 --> 00:20:36,470 Voi merge mai departe și a alerga radiera sunt aici. 473 00:20:36,470 --> 00:20:37,760 Și acum pune-l înapoi pe pensula. 474 00:20:37,760 --> 00:20:42,190 Ce număr ai de gând să scrie în care cutia goală acum? 475 00:20:42,190 --> 00:20:42,850 >> Exact. 476 00:20:42,850 --> 00:20:46,470 Deci, această linie de cod, să fie clar - să ma opresc ce face Charlie și 477 00:20:46,470 --> 00:20:51,730 subliniez aici, ce-a făcut este scrie în cutia aia de la locație 123 478 00:20:51,730 --> 00:20:55,150 valoarea care a fost anterior la B. 479 00:20:55,150 --> 00:20:59,140 Și astfel am implementat acum, într-adevăr această a doua linie de cod. 480 00:20:59,140 --> 00:21:01,920 >> Acum, din păcate, nu există încă o linie rămas. 481 00:21:01,920 --> 00:21:04,900 Acum, ceea ce este în temp, literalmente? 482 00:21:04,900 --> 00:21:06,200 Este evident numărul unu. 483 00:21:06,200 --> 00:21:07,020 Asta nu-i o adresă. 484 00:21:07,020 --> 00:21:09,380 E doar un număr, un fel de o variabilă de la o saptamana. 485 00:21:09,380 --> 00:21:13,520 >> Iar acum, când spui stea b, ceea ce înseamnă du-te la adresa b, care este de 486 00:21:13,520 --> 00:21:15,090 Desigur aici. 487 00:21:15,090 --> 00:21:16,020 Deci, odată ce ajunge acolo - 488 00:21:16,020 --> 00:21:18,320 Voi merge mai departe și a șterge ceea ce este de fapt acolo - si ceea ce esti 489 00:21:18,320 --> 00:21:20,820 de gând să scrie acum la 127 de locație? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, care este unul. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, care este unul. 492 00:21:23,430 --> 00:21:25,670 Și ce se întâmplă cu temp în cele din urmă? 493 00:21:25,670 --> 00:21:26,600 Ei bine, nu prea știu. 494 00:21:26,600 --> 00:21:27,420 Noi nu le pasă cu adevărat. 495 00:21:27,420 --> 00:21:31,090 Orice dată când am implementat o funcție Până în prezent, toate variabilele locale trebuie 496 00:21:31,090 --> 00:21:31,890 sunt într-adevăr locale. 497 00:21:31,890 --> 00:21:33,060 Și ei doar dispar. 498 00:21:33,060 --> 00:21:35,040 Sunt recuperate de operare sistem în cele din urmă. 499 00:21:35,040 --> 00:21:39,800 >> Deci, faptul că temperatura are încă Valoarea 1 este un fel de fundamental 500 00:21:39,800 --> 00:21:41,150 neinteresante pentru noi. 501 00:21:41,150 --> 00:21:43,100 Bine, deci o rundă de aplauze dacă am putea pentru Charlie. 502 00:21:43,100 --> 00:21:46,400 Foarte bine facut. 503 00:21:46,400 --> 00:21:51,520 >> Bine, deci ce mai face acest lucru înseamnă că ne putem face? 504 00:21:51,520 --> 00:21:54,400 Deci, se dovedește că am fost spune câteva minciuni albe 505 00:21:54,400 --> 00:21:55,540 de ceva timp. 506 00:21:55,540 --> 00:21:59,990 Într-adevăr, se pare că un șir, tot acest timp, nu este într-adevăr o 507 00:21:59,990 --> 00:22:02,190 secvență de caractere per se. 508 00:22:02,190 --> 00:22:03,980 Este un fel de este că intuitiv. 509 00:22:03,980 --> 00:22:08,270 >> Dar tehnic vorbind, este un șir tipul de date pe care am declarat în interiorul 510 00:22:08,270 --> 00:22:12,170 CS50 biblioteca a simplifica lumea pentru primele câteva săptămâni de clasa. 511 00:22:12,170 --> 00:22:20,130 Ce un șir într-adevăr este este adresa de un caracter undeva în memoria RAM. 512 00:22:20,130 --> 00:22:25,530 Un șir este într-adevăr un număr, cum ar fi 123 sau 127, care se întâmplă de a delimita 513 00:22:25,530 --> 00:22:28,420 în cazul în care un șir începe în memoria computerului. 514 00:22:28,420 --> 00:22:31,870 >> Dar aceasta nu reprezintă șir, per se, în sine. 515 00:22:31,870 --> 00:22:33,460 Și putem vedea acest lucru, după cum urmează. 516 00:22:33,460 --> 00:22:35,980 Lasă-mă să merg mai departe și să se deschidă un cod care e printre 517 00:22:35,980 --> 00:22:38,340 exemple de cod sursă de astăzi. 518 00:22:38,340 --> 00:22:42,225 Și am de gând să merg mai departe și deschide la, să zicem, compara-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Acesta este un program cu erori care se întâmplă să fie puse în aplicare după cum urmează. 521 00:22:48,790 --> 00:22:49,040 >> În primul rând. 522 00:22:49,040 --> 00:22:50,420 Am de gând să spun ceva. 523 00:22:50,420 --> 00:22:52,660 Apoi, am de gând să merg mai departe și obține un șir de utilizator 524 00:22:52,660 --> 00:22:53,750 în care linia următoare. 525 00:22:53,750 --> 00:22:55,370 Apoi, am de gând să o spun din nou. 526 00:22:55,370 --> 00:22:57,540 Apoi am de gând pentru a obține un alt șir de la utilizator. 527 00:22:57,540 --> 00:23:00,390 >> Și observați, eu arăt una din siruri într-o variabilă numită s, i 528 00:23:00,390 --> 00:23:03,040 un alt din aceste siruri de caractere într-o variabilă numită t. 529 00:23:03,040 --> 00:23:07,480 Și acum am de gând să ceară, foarte în mod rezonabil, că dacă e egal egal t, 530 00:23:07,480 --> 00:23:08,940 șirurile sunt aceleași. 531 00:23:08,940 --> 00:23:09,970 Tastați același lucru. 532 00:23:09,970 --> 00:23:11,830 Altfel, siruri de caractere sunt Nu același lucru. 533 00:23:11,830 --> 00:23:15,440 >> La urma urmei, dacă am de intrare două int, două caractere, două flotoare, două duble, nici de 534 00:23:15,440 --> 00:23:18,400 tipurile de date care le-am vorbit despre până acum să le compare - 535 00:23:18,400 --> 00:23:22,070 amintesc că am făcut foarte clar de ceva vreme în urmă că tu nu faci acest lucru, pentru că o 536 00:23:22,070 --> 00:23:25,840 semn egal unic este, desigur, operatorului de atribuire. 537 00:23:25,840 --> 00:23:26,820 Așa că ar fi un bug. 538 00:23:26,820 --> 00:23:29,260 >> Noi folosim semnul egal egal, care compară într-adevăr 539 00:23:29,260 --> 00:23:31,050 lucruri pentru adevărata egalitate. 540 00:23:31,050 --> 00:23:32,275 Dar eu susțin acest lucru este buggy. 541 00:23:32,275 --> 00:23:37,400 Dacă am merge mai departe și de a face compara la zero, și apoi nu dot slash compara zero. 542 00:23:37,400 --> 00:23:39,700 Și am tip în, să zicem, salut. 543 00:23:39,700 --> 00:23:41,590 Și apoi să-l salut din nou. 544 00:23:41,590 --> 00:23:46,040 Literalmente același lucru, computerul creanțe am scris lucruri diferite. 545 00:23:46,040 --> 00:23:47,640 >> Acum, poate doar am scris gresit ceva. 546 00:23:47,640 --> 00:23:49,910 Voi scrie numele meu de data asta. 547 00:23:49,910 --> 00:23:52,580 Adică, salut. 548 00:23:52,580 --> 00:23:54,770 Bună ziua. 549 00:23:54,770 --> 00:23:57,360 Este diferit de fiecare data. 550 00:23:57,360 --> 00:23:58,430 >> Ei bine, de ce este asta? 551 00:23:58,430 --> 00:24:00,140 Ce se intampla cu adevarat sub capota? 552 00:24:00,140 --> 00:24:03,270 Ei bine, ce se întâmplă cu adevărat pe dedesubt hota este șirul apoi 553 00:24:03,270 --> 00:24:07,410 Am scris în acea prima dată, de exemplu, este cuvântul salut, desigur. 554 00:24:07,410 --> 00:24:11,660 Dar dacă ne reprezentăm această sub capota, amintesc că o 555 00:24:11,660 --> 00:24:13,470 string este într-o matrice. 556 00:24:13,470 --> 00:24:15,040 Și am spus la fel de mult în trecut. 557 00:24:15,040 --> 00:24:20,200 >> Deci, dacă am trage ca matrice ca aceasta, sunt O să reprezinte ceva destul de 558 00:24:20,200 --> 00:24:23,030 similar cu ceea ce am făcut acum o clipă. 559 00:24:23,030 --> 00:24:25,390 Și nu e de fapt ceva special aici, de asemenea. 560 00:24:25,390 --> 00:24:28,090 Ce am determina sa la sfârșitul fiecărui șir? 561 00:24:28,090 --> 00:24:30,760 Da, acest zero, backslash, care este doar modul de reprezentare, 562 00:24:30,760 --> 00:24:33,610 literalmente, 00000000. 563 00:24:33,610 --> 00:24:35,680 Opt 0 biți într-un rând. 564 00:24:35,680 --> 00:24:37,610 >> Nu știu, sincer, ce-i după această. 565 00:24:37,610 --> 00:24:40,090 Asta e doar o grămadă mai mult RAM interiorul computerului meu. 566 00:24:40,090 --> 00:24:40,970 Dar aceasta este o matrice. 567 00:24:40,970 --> 00:24:42,260 Am vorbit despre tablouri înainte. 568 00:24:42,260 --> 00:24:45,010 Și vorbim de obicei despre matrice ca fiind locația la zero, 569 00:24:45,010 --> 00:24:46,580 apoi unul, apoi doi. 570 00:24:46,580 --> 00:24:47,950 Dar asta e doar pentru comoditate. 571 00:24:47,950 --> 00:24:49,380 Și asta e cu totul relativ. 572 00:24:49,380 --> 00:24:53,010 >> Când sunteți de fapt obtinerea de memorie de la calculator, este, desigur, orice 573 00:24:53,010 --> 00:24:55,450 2 miliarde de unele bytes ciudate, potențial. 574 00:24:55,450 --> 00:24:59,100 Deci, într-adevăr sub capota, în tot acest timp, da. 575 00:24:59,100 --> 00:25:01,670 Acest lucru ar putea fi foarte bine la zero suport. 576 00:25:01,670 --> 00:25:04,780 Dar dacă sapi mai adanc sub capota, care este într-adevăr 577 00:25:04,780 --> 00:25:07,000 adresa numărul 123. 578 00:25:07,000 --> 00:25:09,150 Aceasta este adresa 124. 579 00:25:09,150 --> 00:25:11,040 Aceasta este adresa 125. 580 00:25:11,040 --> 00:25:12,540 >> Și nu am în bară de data asta. 581 00:25:12,540 --> 00:25:15,840 Acestea sunt acum una bytes în afară de ceea ce motiv? 582 00:25:15,840 --> 00:25:17,930 Cât de mare este un char? 583 00:25:17,930 --> 00:25:19,170 Un caracter este doar un octet. 584 00:25:19,170 --> 00:25:20,570 Un int este de obicei de patru octeți. 585 00:25:20,570 --> 00:25:24,850 Deci, de aceea am făcut 123, 127, 131 și așa mai departe. 586 00:25:24,850 --> 00:25:27,560 Acum pot păstra matematica simpla și fă plus 1. 587 00:25:27,560 --> 00:25:30,510 Și acest lucru este acum ceea ce se întâmplă cu adevărat pe sub capota. 588 00:25:30,510 --> 00:25:37,760 >> Deci, atunci când declara ceva de genul asta, șir s, aceasta este de fapt - 589 00:25:37,760 --> 00:25:39,170 se pare - 590 00:25:39,170 --> 00:25:41,190 stele char. 591 00:25:41,190 --> 00:25:44,640 Stea, desigur, înseamnă adresa, indicatorul aka. 592 00:25:44,640 --> 00:25:46,200 Deci, este adresa de ceva. 593 00:25:46,200 --> 00:25:47,510 Care este adresa? 594 00:25:47,510 --> 00:25:47,760 >> Ei bine - 595 00:25:47,760 --> 00:25:51,680 Eu sunt singurul care poate vedea foarte punct important Fac, sau cred 596 00:25:51,680 --> 00:25:52,560 Fac. 597 00:25:52,560 --> 00:25:55,270 Deci, string - 598 00:25:55,270 --> 00:25:57,180 lucrul trist este ca eu am un monitor chiar acolo unde am 599 00:25:57,180 --> 00:25:58,100 ar fi putut vedea asta. 600 00:25:58,100 --> 00:26:00,990 >> În regulă, deci șirul s este ceea ce Am declarat anterior. 601 00:26:00,990 --> 00:26:04,600 Dar se pare că, datorită unui mic magie în CS50 biblioteca, toate acestea 602 00:26:04,600 --> 00:26:08,780 șir timp are literalmente fost stele char. 603 00:26:08,780 --> 00:26:11,310 Stele înseamnă din nou pointer sau adresa. 604 00:26:11,310 --> 00:26:14,180 Faptul că se flanchează Cuvântul caracter înseamnă că este 605 00:26:14,180 --> 00:26:15,970 adresa unui personaj. 606 00:26:15,970 --> 00:26:23,100 >> Deci, dacă se string este numit, și eu tip în H-E-L-L-O, propune acum ceea ce a obține 607 00:26:23,100 --> 00:26:27,330 șir fost literalmente întoarce toate de data aceasta, chiar dacă ne-am mai 608 00:26:27,330 --> 00:26:29,980 simplificat lumea? 609 00:26:29,980 --> 00:26:33,310 Ce se obține șirul de fapt, reveni ca valoarea schimb? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 în acest caz, de exemplu. 612 00:26:38,720 --> 00:26:42,630 Anterior am spus că se string pur și simplu returnează un șir, o secvență de 613 00:26:42,630 --> 00:26:43,300 caractere. 614 00:26:43,300 --> 00:26:44,790 Dar asta e un pic de o minciună albă. 615 00:26:44,790 --> 00:26:48,010 Modul în care se string într-adevăr funcționează sub capota este ea devine o 616 00:26:48,010 --> 00:26:48,930 șir de la utilizator. 617 00:26:48,930 --> 00:26:51,530 Acesta plops caracterele el sau ea tipuri de memorie. 618 00:26:51,530 --> 00:26:54,680 Se pune un zero backslash la sfârșitul dintre cei secvență de caractere. 619 00:26:54,680 --> 00:26:57,310 >> Dar atunci ce se obține șirul literalmente reveni? 620 00:26:57,310 --> 00:27:02,710 Se întoarce literalmente adresa primele bytes din RAM care 621 00:27:02,710 --> 00:27:04,130 este folosit pentru putere. 622 00:27:04,130 --> 00:27:07,500 Și se pare că doar prin revenirea o singură adresă a 623 00:27:07,500 --> 00:27:12,120 primul caracter în șir, care este suficient pentru a găsi toate elementele de 624 00:27:12,120 --> 00:27:12,630 șir. 625 00:27:12,630 --> 00:27:16,930 >> Cu alte cuvinte, pentru a primi șir nu are să se întoarcă 123 și 124 și 125. 626 00:27:16,930 --> 00:27:19,950 Aceasta nu trebuie să-mi dea un lung lista a tuturor octeți care 627 00:27:19,950 --> 00:27:20,740 șir meu este folosind. 628 00:27:20,740 --> 00:27:22,670 Deoarece unul, toate sunt spate în spate. 629 00:27:22,670 --> 00:27:28,160 Și doi, bazat pe prima adresa, eu pot da seama unde se termină șirul. 630 00:27:28,160 --> 00:27:29,910 Cum? 631 00:27:29,910 --> 00:27:33,490 >> Caracterul nul special, backslash zero la sfârșitul. 632 00:27:33,490 --> 00:27:35,430 Deci, cu alte cuvinte, dacă treci în jurul - 633 00:27:35,430 --> 00:27:36,530 interiorul variabile - 634 00:27:36,530 --> 00:27:41,300 adresa de un char, si va asumati că, la sfârșitul oricărui șir, orice 635 00:27:41,300 --> 00:27:45,040 secvență de caractere, ca noi, oamenii, cred că de siruri de caractere, dacă presupuneți că 636 00:27:45,040 --> 00:27:48,600 la sfârșitul oricărei astfel de string nu e un zero backslash, esti de aur. 637 00:27:48,600 --> 00:27:52,430 Pentru că puteți găsi întotdeauna sfârșitul unui șir. 638 00:27:52,430 --> 00:27:54,870 >> Acum, ceea ce este într-adevăr, atunci va pe în acest program? 639 00:27:54,870 --> 00:27:59,990 De ce este acest program, compara-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Ce este, de fapt se compară? 641 00:28:01,690 --> 00:28:02,420 Da? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [inaudibil]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Exact. 644 00:28:05,730 --> 00:28:08,350 Este compararea locații siruri de caractere. 645 00:28:08,350 --> 00:28:12,420 Deci, dacă utilizatorul a introdus în Bună ziua dată, așa cum am făcut-o, memorie s-ar putea sfârși prin a 646 00:28:12,420 --> 00:28:13,430 aratand ca aceasta. 647 00:28:13,430 --> 00:28:18,210 Dacă atunci utilizatorul tipurile din Bună din nou, dar de apel ajunge din nou string, C este 648 00:28:18,210 --> 00:28:21,800 nu deosebit de inteligent dacă nu vă învață să fie inteligent de scrierea de cod. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 și calculatoare în general - 651 00:28:23,860 --> 00:28:27,370 dacă tastați în cuvântul salut din nou, stii ce ai de gând pentru a obține. 652 00:28:27,370 --> 00:28:31,480 Esti doar mergi la a lua un al doilea tablou de memorie pe care, da, se întâmplă să fie 653 00:28:31,480 --> 00:28:35,510 stocarea H-E-L-L-O și așa mai departe. 654 00:28:35,510 --> 00:28:38,240 >> Se va arata la fel de noi, oamenii, dar această adresă 655 00:28:38,240 --> 00:28:39,460 ar putea să nu fie 123. 656 00:28:39,460 --> 00:28:42,470 S-ar putea doar atât întâmpla ca Sistemul de operare are unele disponibile 657 00:28:42,470 --> 00:28:45,430 spațiu de exemplu la locație - 658 00:28:45,430 --> 00:28:49,820 să spunem ceva arbitrar, ca aceasta este poziția 200. 659 00:28:49,820 --> 00:28:51,620 Și aceasta este poziția 201. 660 00:28:51,620 --> 00:28:53,060 Și aceasta este poziția 202. 661 00:28:53,060 --> 00:28:55,730 Nu avem nici o idee unde e Va fi în memorie. 662 00:28:55,730 --> 00:28:59,110 >> Dar ce înseamnă acest lucru este că ceea ce este O să fie depozitate în cele din urmă în s? 663 00:28:59,110 --> 00:29:00,750 Numărul 123. 664 00:29:00,750 --> 00:29:04,860 Ce se întâmplă să fie stocate în t, în acest exemplu arbitrar? 665 00:29:04,860 --> 00:29:06,300 Numărul 200. 666 00:29:06,300 --> 00:29:11,410 Și tot ceea ce înseamnă, atunci este evident, 123 nu este egal cu 200. 667 00:29:11,410 --> 00:29:14,940 Și astfel, această condiție, dacă nu se evaluează la TRUE. 668 00:29:14,940 --> 00:29:18,430 Deoarece șir obține este de folosind diferite bucăți de memorie de fiecare dată. 669 00:29:18,430 --> 00:29:20,360 >> Acum putem vedea acest lucru din nou într-un alt exemplu. 670 00:29:20,360 --> 00:29:23,764 Lasă-mă să merg mai departe și să se deschidă copie-0.c. 671 00:29:23,764 --> 00:29:28,770 Eu susțin că acest exemplu se va încercați - dar nu - pentru a copia două șiruri 672 00:29:28,770 --> 00:29:29,910 după cum urmează. 673 00:29:29,910 --> 00:29:31,730 >> Am de gând să spun ceva pentru utilizator. 674 00:29:31,730 --> 00:29:34,490 Am apoi merge pentru a obține o șir și îl numesc e. 675 00:29:34,490 --> 00:29:36,400 Și acum, eu fac acest cec aici. 676 00:29:36,400 --> 00:29:37,990 Am menționat acest lucru o înapoi în timp. 677 00:29:37,990 --> 00:29:42,490 Dar când s-ar putea obține șir intoarce null, un alt caracter special, sau speciale 678 00:29:42,490 --> 00:29:45,050 simbol Să zicem. 679 00:29:45,050 --> 00:29:45,900 Dacă e din memorie. 680 00:29:45,900 --> 00:29:48,970 >> De exemplu, dacă utilizatorul este într-adevăr fiind dificil și tipuri de atroce 681 00:29:48,970 --> 00:29:51,220 numărul de caractere de la tastatură și hit-uri Enter. 682 00:29:51,220 --> 00:29:54,580 În cazul în care numărul de caractere pur si simplu nu se poate se potrivesc în RAM pentru orice nebun 683 00:29:54,580 --> 00:29:57,820 motiv, și se string s-ar putea foarte bine intoarce null. 684 00:29:57,820 --> 00:30:01,080 >> Sau, dacă programul în sine este de a face o mulțime de alte lucruri și nu doar 685 00:30:01,080 --> 00:30:03,790 nu suficientă memorie pentru șir get pentru a reuși, ar putea sfârși 686 00:30:03,790 --> 00:30:05,240 până se întoarce null. 687 00:30:05,240 --> 00:30:07,160 Dar să fim mai precis ca la ceea ce este aceasta. 688 00:30:07,160 --> 00:30:10,280 Ce este e Tipul de date cu adevărat? 689 00:30:10,280 --> 00:30:11,610 Stele char. 690 00:30:11,610 --> 00:30:14,560 >> Deci, se dovedește acum că se pot dezlipi înapoi stratul de nul. 691 00:30:14,560 --> 00:30:17,500 Se pare că, nul este - da, în mod evident un simbol special. 692 00:30:17,500 --> 00:30:19,190 Dar ceea ce este cu adevarat? 693 00:30:19,190 --> 00:30:25,220 Într-adevăr, null este doar un simbol pe care le oamenii folosesc pentru a reprezenta zero, la fel de bine. 694 00:30:25,220 --> 00:30:29,010 >> Deci, autorii C, și calculatoare mai general, a decis ani în urmă 695 00:30:29,010 --> 00:30:30,010 că, știi ce. 696 00:30:30,010 --> 00:30:34,850 De ce nu ne asigurăm că nici un utilizator de date este niciodată, niciodată, niciodată 697 00:30:34,850 --> 00:30:36,730 depozitate la zero pa? 698 00:30:36,730 --> 00:30:39,610 De fapt, chiar și în exemplul mea arbitrară înainte, nu am începe numerotarea 699 00:30:39,610 --> 00:30:40,390 bytes de la zero. 700 00:30:40,390 --> 00:30:41,540 Am început de la o. 701 00:30:41,540 --> 00:30:44,950 Pentru că știa că oamenii din lume au decis să-și rezerve zero 702 00:30:44,950 --> 00:30:47,970 octet în memoria RAM cuiva ca ceva special. 703 00:30:47,970 --> 00:30:52,020 >> Motivul fiind, oricând doriți să semnala că ceva a mers prost 704 00:30:52,020 --> 00:30:55,960 cu privire la adrese, v-ați întors nul - altfel cunoscut sub numele de zero - 705 00:30:55,960 --> 00:30:59,410 și pentru că știți că nu există nici o legitim de date la adresa de zero, în mod clar 706 00:30:59,410 --> 00:31:00,400 care înseamnă o eroare. 707 00:31:00,400 --> 00:31:04,080 Și de aceea noi, prin convenție, verificați pentru nul și retur ceva 708 00:31:04,080 --> 00:31:06,260 ca unul din aceste cazuri. 709 00:31:06,260 --> 00:31:09,300 >> Deci, dacă vom derula în jos acum, aceasta este doar apoi unele verificarea erorilor, doar în cazul în 710 00:31:09,300 --> 00:31:10,610 ceva a mers prost cu [? cauțiune?] 711 00:31:10,610 --> 00:31:13,470 totul și ieșiți din programul de prin întoarcerea mai devreme. 712 00:31:13,470 --> 00:31:19,030 Această linie acum ar putea fi rescrisă deoarece acest lucru, ceea ce înseamnă ce? 713 00:31:19,030 --> 00:31:23,155 Pe partea stângă, da-mi un alt pointer la un caracter, și îl numesc t. 714 00:31:23,155 --> 00:31:26,935 Ce am depozitarea interiorul t, pe baza pe aceasta linie de cod? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Am stocarea o locație. 717 00:31:32,170 --> 00:31:34,742 În special locație care a fost în s.. 718 00:31:34,742 --> 00:31:39,000 Deci, dacă utilizatorul a introdus în Bună ziua, și că primul salut se întâmplă să se încheie 719 00:31:39,000 --> 00:31:42,567 aici, apoi 123 numărul este să vină înapoi de la a obține 720 00:31:42,567 --> 00:31:43,810 șir și să fie depozitate - 721 00:31:43,810 --> 00:31:44,780 așa cum am spus mai devreme - 722 00:31:44,780 --> 00:31:45,440 în s.. 723 00:31:45,440 --> 00:31:50,560 >> Când Declar acum un alt indicator pentru un caracter și să-l t, ceea ce numărul este 724 00:31:50,560 --> 00:31:53,940 literalmente de gând să se încheie până în t in functie de poveste? 725 00:31:53,940 --> 00:31:55,420 Așa 123. 726 00:31:55,420 --> 00:32:00,310 >> Deci, punct de vedere tehnic acum atât e și Nu sunt orientate spre exactă 727 00:32:00,310 --> 00:32:02,410 aceleași bucăți de memorie. 728 00:32:02,410 --> 00:32:06,140 Deci, observați ce am de gând să fac acum la demonstra că acest program este buggy. 729 00:32:06,140 --> 00:32:08,820 >> În primul rând am de gând să pretind, cu un f imprimare, valorificarea 730 00:32:08,820 --> 00:32:10,080 copie a șirului. 731 00:32:10,080 --> 00:32:11,660 Apoi, am de gând să fac un pic de verificarea erorilor. 732 00:32:11,660 --> 00:32:12,160 Am de gând să vă asigurați. 733 00:32:12,160 --> 00:32:16,710 Să ne asigurăm că t șirul este la Cel mai mare decât zero, în lungime, 734 00:32:16,710 --> 00:32:19,190 deci nu e un personaj acolo pentru a valorifica efectiv. 735 00:32:19,190 --> 00:32:22,840 >> Și apoi s-ar putea aminti acest din exemplele precedente. 736 00:32:22,840 --> 00:32:25,630 2 sus - care este în fișierul ctype.h. 737 00:32:25,630 --> 00:32:30,800 T suportul zero, îmi dă zero Caracterul de t șir. 738 00:32:30,800 --> 00:32:34,360 Și 2 sus că aceeași valoare, de Desigur, îl convertește în majuscule. 739 00:32:34,360 --> 00:32:38,230 >> Deci intuitiv, aceasta a subliniat linie de cod este valorificarea prima 740 00:32:38,230 --> 00:32:40,250 scrisoare în t. 741 00:32:40,250 --> 00:32:44,485 Dar nu este valorificarea, intuitiv, prima literă din s.. 742 00:32:44,485 --> 00:32:48,130 Dar dacă te gândești înainte, ceea ce sunt eu pe cale de a vedea atunci când am rula acest program 743 00:32:48,130 --> 00:32:54,220 și imprima atât în ​​original, e, și așa-numita copie, t? 744 00:32:54,220 --> 00:32:55,350 >> Ei de fapt, va fi la fel. 745 00:32:55,350 --> 00:32:56,600 Și de ce au de gând să fie la fel? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Sunt atât de indicare a exact același lucru. 748 00:33:01,020 --> 00:33:01,610 Deci, hai sa facem acest lucru. 749 00:33:01,610 --> 00:33:03,160 >> Face la zero copie. 750 00:33:03,160 --> 00:33:04,070 Se compilează OK. 751 00:33:04,070 --> 00:33:06,500 Permiteți-mi să ruleze la zero copie. 752 00:33:06,500 --> 00:33:10,110 Lasă-mă să tastați ceva de genul salut în toate cu litere mici, apoi apăsați Enter. 753 00:33:10,110 --> 00:33:16,520 Și susține că atât e originală și copia sunt într-adevăr identice. 754 00:33:16,520 --> 00:33:17,920 >> Deci, ce sa întâmplat aici? 755 00:33:17,920 --> 00:33:20,100 Lasă-mă retrag această imagine doar pentru a spune povestea într-un 756 00:33:20,100 --> 00:33:21,340 mod ușor diferit. 757 00:33:21,340 --> 00:33:26,060 Ce se întâmplă cu adevărat pe sub capota când declar ceva de genul 758 00:33:26,060 --> 00:33:30,410 char pornire s, sau un șir s, Primesc un pointer - 759 00:33:30,410 --> 00:33:33,090 care se întâmplă să fie de patru bytes în CS50 aparat 760 00:33:33,090 --> 00:33:34,410 și într-o mulțime de calculatoare. 761 00:33:34,410 --> 00:33:36,008 Și am de gând să numim această uri. 762 00:33:36,008 --> 00:33:39,810 Și acest lucru are în prezent o valoare necunoscută. 763 00:33:39,810 --> 00:33:43,900 >> Când declara o variabilă, dacă nu pune-te o valoare acolo, care 764 00:33:43,900 --> 00:33:44,570 știe ce-i acolo. 765 00:33:44,570 --> 00:33:48,110 Ar putea fi un secvență aleatoare de biți de la executarea precedent. 766 00:33:48,110 --> 00:33:52,490 Așa că atunci când am, în linia mea de cod primesc șir, și apoi depozitați retur 767 00:33:52,490 --> 00:33:54,800 valoarea s obține șir într-un fel - 768 00:33:54,800 --> 00:33:58,520 Și vom în cele din urmă coaja de spate cum se lucrări de coarde, alocă cumva o 769 00:33:58,520 --> 00:34:00,480 matrice care, probabil, arată un pic ca aceasta. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, backslash zero. 771 00:34:05,390 --> 00:34:09,510 >> Să presupunem că aceasta este adresa 123 doar prima consistenta. 772 00:34:09,510 --> 00:34:13,000 Deci, se întoarce șir, în a subliniat linie de acolo, se întoarce 773 00:34:13,000 --> 00:34:15,000 număr am spus, 123. 774 00:34:15,000 --> 00:34:17,420 Deci, ce se întâmplă cu adevărat în interiorul e aici? 775 00:34:17,420 --> 00:34:26,590 >> Ei bine, ce se întâmplă cu adevărat interiorul s este 123. 776 00:34:26,590 --> 00:34:29,250 Dar sincer, eu sunt cam confuz de toate aceste adrese, 777 00:34:29,250 --> 00:34:30,320 toate aceste numere arbitrare. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Deci, haideți să simplifica de fapt lumea un pic. 780 00:34:34,570 --> 00:34:38,800 >> Când vorbim despre indicii, sincer, să noi, oamenii, care naiba îi pasă unde 781 00:34:38,800 --> 00:34:39,870 lucrurile sunt în memorie? 782 00:34:39,870 --> 00:34:41,080 Care este complet arbitrar. 783 00:34:41,080 --> 00:34:43,370 Se va depinde de modul în care mult RAM utilizatorul are. 784 00:34:43,370 --> 00:34:46,590 Se va depinde de momentul în ziua rulați programul, probabil, și 785 00:34:46,590 --> 00:34:48,250 ceea ce de intrare de utilizator îți dă. 786 00:34:48,250 --> 00:34:50,060 Suntem locuință cu detalii neimportante. 787 00:34:50,060 --> 00:34:54,230 >> Deci, hai sa abstract departe și spune că, atunci când rulați o linie de cod ca acest lucru, 788 00:34:54,230 --> 00:34:57,320 char stele s devine retur valoarea șir GET. 789 00:34:57,320 --> 00:35:02,720 De ce nu am loc doar trage ceea ce ține de asteptare un indicator ca și cum este 790 00:35:02,720 --> 00:35:04,140 arătând spre ceva? 791 00:35:04,140 --> 00:35:07,000 Deci, eu pretind că e sus există un indicator - 792 00:35:07,000 --> 00:35:08,480 sub capota este o adresă. 793 00:35:08,480 --> 00:35:11,330 Dar este doar subliniind primul octet în 794 00:35:11,330 --> 00:35:12,780 șir care a fost returnat. 795 00:35:12,780 --> 00:35:16,710 >> Dacă mă întorc acum la codul aici, ceea ce se întâmplă la această linie? 796 00:35:16,710 --> 00:35:20,020 Ei bine, în această linie a subliniat acum, Sunt declararea aparent un alt 797 00:35:20,020 --> 00:35:21,070 variabilă numită t. 798 00:35:21,070 --> 00:35:25,700 Dar este, de asemenea, un pointer, așa că am de gând să-l atrage ca, in teorie, exact 799 00:35:25,700 --> 00:35:26,710 aceeași cutie de dimensiuni. 800 00:35:26,710 --> 00:35:28,160 Și am de gând să-i spunem t. 801 00:35:28,160 --> 00:35:33,500 >> Și acum, dacă ne întoarcem la codul din nou, când am stoca e în interiorul t, 802 00:35:33,500 --> 00:35:36,920 ce sunt punct de vedere tehnic punerea interiorul t? 803 00:35:36,920 --> 00:35:39,350 Ei bine, punct de vedere tehnic, acest lucru a fost 123 numărul. 804 00:35:39,350 --> 00:35:42,270 Deci, într-adevăr ar trebui să fie scris 123 numărul acolo. 805 00:35:42,270 --> 00:35:43,900 Dar haideți să nivel superior ia. 806 00:35:43,900 --> 00:35:48,090 t, dacă acesta este doar un pointer, intuitiv, este doar faptul că. 807 00:35:48,090 --> 00:35:49,800 Asta-i tot ce-a fi stocate acolo. 808 00:35:49,800 --> 00:35:54,970 >> Deci, acum, în ultimele rânduri interesante de cod, atunci când merg de fapt despre 809 00:35:54,970 --> 00:36:00,680 valorificarea caracterul zero, în t, ce se întâmplă? 810 00:36:00,680 --> 00:36:06,310 Ei bine, t suport zero, este acum îndreptat de ce caracter, probabil? 811 00:36:06,310 --> 00:36:07,460 >> Se indică de ore. 812 00:36:07,460 --> 00:36:08,870 Pentru că nu suport la zero - 813 00:36:08,870 --> 00:36:12,490 amintesc, aceasta este sintaxa vechi. t suport zero, înseamnă doar dacă T este un șir, t 814 00:36:12,490 --> 00:36:15,590 suport zero, înseamnă obținerea zero personaj în acea putere. 815 00:36:15,590 --> 00:36:18,650 Deci, ceea ce înseamnă că într-adevăr se merge la această matrice - 816 00:36:18,650 --> 00:36:21,520 si da, acest lucru ar putea fi 123, aceasta ar putea fi 124. 817 00:36:21,520 --> 00:36:22,790 Dar totul e relativ, amintiți-vă. 818 00:36:22,790 --> 00:36:25,640 Ori de câte ori vorbim despre o matrice, avem avantajul de a vorbi despre 819 00:36:25,640 --> 00:36:27,000 Indicii relativi. 820 00:36:27,000 --> 00:36:31,120 >> Iar acum putem presupune doar că t zero, suportul este H. 821 00:36:31,120 --> 00:36:35,090 Deci, dacă am numi 2 de sus pe el, ceea ce e a face într-adevăr este valorificarea 822 00:36:35,090 --> 00:36:38,290 h minuscule în majuscule H. Dar, desigur, ceea ce este s? 823 00:36:38,290 --> 00:36:41,010 Se indică în același șir al naibii. 824 00:36:41,010 --> 00:36:44,200 >> Deci, asta e tot ce sa întâmplat în acest cod până acum. 825 00:36:44,200 --> 00:36:45,960 Deci, ce este atunci implicare? 826 00:36:45,960 --> 00:36:48,300 Cum putem rezolva aceste două probleme? 827 00:36:48,300 --> 00:36:50,870 Cum putem compara cu siruri de caractere reale? 828 00:36:50,870 --> 00:36:53,720 >> Ei bine intuitiv, cum ar fi te duci despre compararea două 829 00:36:53,720 --> 00:36:55,090 siruri de caractere pentru egalitate adevărat? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Ce înseamnă dacă două siruri de caractere sunt egale? 832 00:37:00,750 --> 00:37:04,330 În mod clar nu ca adresele lor sunt egal în memorie, pentru că este o mică 833 00:37:04,330 --> 00:37:06,590 nivel de detalii de implementare. 834 00:37:06,590 --> 00:37:08,360 Toate caracterele sunt aceleași. 835 00:37:08,360 --> 00:37:12,810 Deci, permiteți-mi să propun, și permiteți-mi să introducă în versiunea una dintre compare.c 836 00:37:12,810 --> 00:37:14,970 aici, așa compara-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Permiteți-mi să propun că vom obține încă o indicatorul numit s, și magazin în ea 838 00:37:19,590 --> 00:37:20,610 returna valoarea șir GET. 839 00:37:20,610 --> 00:37:21,750 Să facem același lucru cu t. 840 00:37:21,750 --> 00:37:23,230 Astfel încât nici unul dintre codul este diferit. 841 00:37:23,230 --> 00:37:25,420 Am de gând să adăugați un pic mai verificarea erorilor acum. 842 00:37:25,420 --> 00:37:29,390 Deci, acum că suntem un fel de peeling înapoi aceste straturi în CS50 de ce un șir 843 00:37:29,390 --> 00:37:33,520 de fapt este, trebuie să fie mai mult anal despre a face sigur că nu abuza 844 00:37:33,520 --> 00:37:35,330 Valorile invalide, cum ar fi nule. 845 00:37:35,330 --> 00:37:36,440 >> Deci, eu sunt doar de gând să verifice. 846 00:37:36,440 --> 00:37:41,490 Dacă s nu este egal cu zero și T nu egal nul, asta înseamnă că suntem bine. 847 00:37:41,490 --> 00:37:44,460 Ia șir nu am greșit obținerea oricare dintre aceste siruri de caractere. 848 00:37:44,460 --> 00:37:51,270 Și puteți ghici, probabil, acum, ce nu STR CMP probabil nu? 849 00:37:51,270 --> 00:37:52,000 String comparație. 850 00:37:52,000 --> 00:37:55,470 >> Deci, dacă ați programul in Java înainte, acest lucru este ca metoda egali în 851 00:37:55,470 --> 00:37:56,490 clasa string. 852 00:37:56,490 --> 00:37:57,890 Dar pentru cei dintre voi care nu au programate înainte, 853 00:37:57,890 --> 00:37:59,320 aceasta este doar o funcție C. 854 00:37:59,320 --> 00:38:02,180 Se întâmplă să vină într-o fișier numit string.h. 855 00:38:02,180 --> 00:38:03,830 Asta în cazul în care este declarat. 856 00:38:03,830 --> 00:38:05,110 >> Și string comparație - 857 00:38:05,110 --> 00:38:07,530 Am uitat de fapt, utilizarea acestuia, dar nu conteaza asta. 858 00:38:07,530 --> 00:38:10,470 Amintiti-va ca putem face om, se amestecă compara. 859 00:38:10,470 --> 00:38:12,590 Și acest lucru se întâmplă pentru a aduce Linux manual programatori. 860 00:38:12,590 --> 00:38:14,060 Și este, sincer, un pic criptic. 861 00:38:14,060 --> 00:38:15,270 Dar eu pot vedea aici că, da. 862 00:38:15,270 --> 00:38:17,570 Trebuie să includă string.h. 863 00:38:17,570 --> 00:38:20,590 >> Și se spune aici în descriere, " Funcția de comparare șir compară 864 00:38:20,590 --> 00:38:24,560 cele două șiruri S1 și S2. "Și S1 și S2 sunt aparent două 865 00:38:24,560 --> 00:38:26,120 argumente trecut inch 866 00:38:26,120 --> 00:38:28,650 Nu-mi amintesc cu adevărat ce const este, dar acum observa - 867 00:38:28,650 --> 00:38:31,480 și este posibil să fi văzut deja acest lucru atunci când ai folosi paginile de manual, dacă 868 00:38:31,480 --> 00:38:32,390 au toate - 869 00:38:32,390 --> 00:38:36,220 că stele char este doar sinonim cu șir. 870 00:38:36,220 --> 00:38:40,440 >> Deci, se compară cele două șiruri, S1 și S2, și returnează un număr întreg mai mic 871 00:38:40,440 --> 00:38:44,930 mică sau egală cu sau mai mare decât zero dacă S1 este găsit, respectiv, să fie 872 00:38:44,930 --> 00:38:47,450 mai puțin, sau potrivesc, sau să fie mai mare decât S2. 873 00:38:47,450 --> 00:38:51,220 Asta e doar un mod foarte complex de a spune ca șir compara revine 874 00:38:51,220 --> 00:38:55,760 zero dacă două șiruri sunt intuitiv identice, caracterul de 875 00:38:55,760 --> 00:38:57,120 caracter pentru caracter. 876 00:38:57,120 --> 00:38:59,970 >> Se returnează un număr negativ dacă s, în ordine alfabetică, ar trebui 877 00:38:59,970 --> 00:39:01,010 să vină înainte de t. 878 00:39:01,010 --> 00:39:05,300 Sau returnează un număr pozitiv, dacă s ar trebui să vină după t 879 00:39:05,300 --> 00:39:06,170 în ordine alfabetică. 880 00:39:06,170 --> 00:39:08,360 Deci, cu această funcție simplă, ar putea te, de exemplu, sortați o 881 00:39:08,360 --> 00:39:09,770 grămadă de cuvinte? 882 00:39:09,770 --> 00:39:13,984 >> Deci, în această nouă versiune, am de gând pentru a merge mai departe și de a face compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash compara unul. 884 00:39:15,750 --> 00:39:18,030 Voi tip de salut, în toate cazurile inferioară. 885 00:39:18,030 --> 00:39:20,300 Am de gând să tastați în Hello în toate litere mici din nou. 886 00:39:20,300 --> 00:39:23,340 Și din fericire acum își dă seama Am scris același lucru. 887 00:39:23,340 --> 00:39:27,520 >> Între timp, dacă am introduce salut în jos caz și HELLO în majuscule și 888 00:39:27,520 --> 00:39:29,710 le compara, am scris lucruri diferite. 889 00:39:29,710 --> 00:39:32,530 Deoarece nu numai că sunt adresele diferite, dar suntem compararea 890 00:39:32,530 --> 00:39:35,350 diferite personaje din nou și din nou. 891 00:39:35,350 --> 00:39:37,320 >> Ei bine, să mergem și să stabilească un alte probleme acum. 892 00:39:37,320 --> 00:39:41,590 Lasă-mă să deschid versiunea una din copie, care abordează acum 893 00:39:41,590 --> 00:39:42,900 această problemă, după cum urmează. 894 00:39:42,900 --> 00:39:45,650 Și aceasta o va arăta un pic mai complex. 895 00:39:45,650 --> 00:39:49,320 Dar dacă te gândești la ceea ce problema am au nevoie pentru a rezolva, speram ca aceasta va fi 896 00:39:49,320 --> 00:39:51,870 șterge într-o clipă acum. 897 00:39:51,870 --> 00:39:57,280 >> Deci, această primă linie, char start t, în termeni de nespecialist ar putea cineva propune 898 00:39:57,280 --> 00:39:59,450 ceea ce înseamnă aici această linie? 899 00:39:59,450 --> 00:40:01,050 Char stele t, ce este că face? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bun. 902 00:40:07,210 --> 00:40:09,500 Creați un pointer la un loc în memorie. 903 00:40:09,500 --> 00:40:10,930 Și lasă-mă să-l un pic rafina. 904 00:40:10,930 --> 00:40:17,180 Declara o variabila care va stoca Adresa de unele char în memorie, doar 905 00:40:17,180 --> 00:40:18,480 să fie un pic mai buna. 906 00:40:18,480 --> 00:40:21,210 >> OK, deci acum pe partea dreapta, am nu a văzut unul dintre aceste funcții 907 00:40:21,210 --> 00:40:22,660 înainte, malloc. 908 00:40:22,660 --> 00:40:26,980 Dar ceea ce ar putea însemna asta? 909 00:40:26,980 --> 00:40:28,050 Alocarea de memorie. 910 00:40:28,050 --> 00:40:29,410 Alocare de memorie. 911 00:40:29,410 --> 00:40:33,050 >> Deci, se pare că, până acum, ne- nu au avut într-adevăr un mod puternic de 912 00:40:33,050 --> 00:40:36,210 cere sistemului de operare, da-mi ceva de memorie. 913 00:40:36,210 --> 00:40:39,980 Mai degrabă, avem acum o funcție numită malloc care face exact acest lucru. 914 00:40:39,980 --> 00:40:42,960 Chiar dacă acest lucru este un pic de o distragere a atenției chiar acum, observăm că în 915 00:40:42,960 --> 00:40:46,200 între cele două paranteze este va fi doar un număr. 916 00:40:46,200 --> 00:40:48,510 În cazul în care l-am scris în cauză mărci poate fi un număr. 917 00:40:48,510 --> 00:40:51,020 >> Și că numărul înseamnă, da-mi 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Dă-mi 20 de bytes. 919 00:40:52,320 --> 00:40:53,820 Dă-mi 100 de bytes. 920 00:40:53,820 --> 00:40:56,500 Și malloc va face tot posibilul pentru a cere sistemul de operare - 921 00:40:56,500 --> 00:40:57,630 Linux, în acest caz - 922 00:40:57,630 --> 00:40:59,630 Hei, sunt de 100 de bytes de RAM disponibil? 923 00:40:59,630 --> 00:41:04,320 Dacă este așa, le restituie bytes la mine prin revenind adresa care a 924 00:41:04,320 --> 00:41:06,610 aceste bytes, poate? 925 00:41:06,610 --> 00:41:07,610 Foarte primul. 926 00:41:07,610 --> 00:41:10,460 >> Deci, aici - și aceasta este predominantă în C, în orice moment esti 927 00:41:10,460 --> 00:41:11,680 de-a face cu adrese? 928 00:41:11,680 --> 00:41:15,830 Sunteți aproape întotdeauna de-a face cu Primul astfel de adresa, indiferent de cât de mare 929 00:41:15,830 --> 00:41:19,490 o bucată de memorie sunt în curs de dat inapoi, ca să spunem așa. 930 00:41:19,490 --> 00:41:20,880 >> Deci, haideți să se arunca cu capul în aici. 931 00:41:20,880 --> 00:41:23,940 Am încercat să aloce cât de multe bytes, mai exact? 932 00:41:23,940 --> 00:41:24,080 Bine. 933 00:41:24,080 --> 00:41:26,090 Lungime șir de e - Hai face un exemplu concret. 934 00:41:26,090 --> 00:41:30,700 Dacă s este salut, H-E-L-L-O, ce-i Lungimea șir de e, în mod evident? 935 00:41:30,700 --> 00:41:32,010 Deci, este cinci. 936 00:41:32,010 --> 00:41:34,590 Dar fac un plus 1 pe care, de ce? 937 00:41:34,590 --> 00:41:37,700 De ce vreau șase bytes în loc de cinci? 938 00:41:37,700 --> 00:41:38,790 Caracter nul. 939 00:41:38,790 --> 00:41:41,210 >> Nu vreau să plec de pe această caracter nul special. 940 00:41:41,210 --> 00:41:45,160 Pentru că dacă am face o copie de Bună ziua și doar nu H-E-L-L-O, dar eu nu pun 941 00:41:45,160 --> 00:41:50,160 că caracter special, computerul nu ar putea avea, din întâmplare, un backslash 942 00:41:50,160 --> 00:41:51,730 Zero pentru mine. 943 00:41:51,730 --> 00:41:55,570 Și așa, dacă am încercat să dau seama de lungimea copia, am putea crede că 944 00:41:55,570 --> 00:41:59,360 este de 20 de caractere, sau un milion caractere dacă am doar nu se întâmplă 945 00:41:59,360 --> 00:42:01,050 a lovit un zero backslash. 946 00:42:01,050 --> 00:42:05,780 >> Deci, avem nevoie de șase octeți pentru a stoca H-E-L-L-O, backslash zero. 947 00:42:05,780 --> 00:42:07,870 Și atunci acest lucru este doar pentru a fi super-anal. 948 00:42:07,870 --> 00:42:10,700 Să presupunem că am uitat ce de marimea unui caracter este. 949 00:42:10,700 --> 00:42:12,020 Ne tot spun că e un octet. 950 00:42:12,020 --> 00:42:12,860 Și este de obicei. 951 00:42:12,860 --> 00:42:15,425 În teorie, ar putea fi ceva diferite, pe un alt Mac sau un 952 00:42:15,425 --> 00:42:16,250 diferit PC. 953 00:42:16,250 --> 00:42:19,650 >> Deci, se pare că există acest operator numit sizeof că, dacă acesta trece 954 00:42:19,650 --> 00:42:22,680 Numele de un tip de date - cum ar fi char, sau int sau float - 955 00:42:22,680 --> 00:42:26,930 vă va spune, dinamic, câte bytes un caracter preia în acest 956 00:42:26,930 --> 00:42:28,090 special de calculator. 957 00:42:28,090 --> 00:42:31,360 >> Deci, acest lucru este eficient doar cum ar spune ori 1 sau 958 00:42:31,360 --> 00:42:32,440 ori nimic. 959 00:42:32,440 --> 00:42:36,340 Dar eu o fac doar pentru a fi super-anal, că doar în cazul în care un char diferă 960 00:42:36,340 --> 00:42:40,610 pe computerul dumneavoastră față de a mea, în acest fel matematica este întotdeauna o să verific. 961 00:42:40,610 --> 00:42:43,720 >> În cele din urmă, aici am verifica pentru nul, care este întotdeauna bună practică - din nou, 962 00:42:43,720 --> 00:42:44,920 orice moment avem de-a face cu indicii. 963 00:42:44,920 --> 00:42:47,520 Dacă malloc nu a fost în măsură să dea mi șase revedere - care este 964 00:42:47,520 --> 00:42:49,210 puțin probabil, dar doar în cazul în care - 965 00:42:49,210 --> 00:42:50,730 reveni unul imediat. 966 00:42:50,730 --> 00:42:53,290 Și acum, mergeți mai departe și să copiați șir, după cum urmează. 967 00:42:53,290 --> 00:42:57,240 Și acest lucru este sintaxa familiar, chiar dacă într-un rol diferit. 968 00:42:57,240 --> 00:43:01,210 >> Am de gând să merg mai departe și a obține șirul lungime de e și îl stochează în n. 969 00:43:01,210 --> 00:43:06,620 Am apoi merge la repeta de i este egal zero, până la și inclusiv n, 970 00:43:06,620 --> 00:43:08,410 mai mare sau egală cu. 971 00:43:08,410 --> 00:43:13,540 Astfel că la fiecare iterație, am pus Caracterul lea al s-lea în 972 00:43:13,540 --> 00:43:15,380 Caracterul de t. 973 00:43:15,380 --> 00:43:18,190 >> Deci, ce se întâmplă cu adevărat pe dedesubt capota aici? 974 00:43:18,190 --> 00:43:22,140 Ei bine, dacă acest lucru, de exemplu, este s - 975 00:43:22,140 --> 00:43:26,400 și am scris în cuvântul H-E-L-L-O și există un zero backslash. 976 00:43:26,400 --> 00:43:29,020 Și din nou, acest lucru este s îndreptat aici. 977 00:43:29,020 --> 00:43:30,830 Și aici, acum este t. 978 00:43:30,830 --> 00:43:34,860 >> Și acest lucru se indică acum să o copie de memorie, nu? 979 00:43:34,860 --> 00:43:37,340 Malloc mi-a dat un întreg bucată de memorie. 980 00:43:37,340 --> 00:43:41,440 Nu știu inițial ce-i în oricare dintre aceste locații. 981 00:43:41,440 --> 00:43:44,340 Așa că am de gând să mă gândesc la acestea ca o grămadă de semne de întrebare. 982 00:43:44,340 --> 00:43:50,190 >> Dar, de îndată ce am început looping de la zero, pe sus prin lungimea s, t 983 00:43:50,190 --> 00:43:52,790 suport zero și t suport 1 - 984 00:43:52,790 --> 00:43:55,080 și îl voi pune acum pe deasupra capului - 985 00:43:55,080 --> 00:44:04,190 t suport zero și s suport medie zero pe care am de gând să fie copierea 986 00:44:04,190 --> 00:44:09,875 iterativă h în aici, E-L-L-O. În plus, pentru că am făcut plus 987 00:44:09,875 --> 00:44:12,370 1, backslash zero. 988 00:44:12,370 --> 00:44:19,060 >> Deci, acum, în caz de compara-1.c, în cele din urmă, dacă am imprima 989 00:44:19,060 --> 00:44:24,760 capitalizare de t, ar trebui să ne vezi că este de neschimbat. 990 00:44:24,760 --> 00:44:26,090 Lasă-mă să merg mai departe acum și de a face acest lucru. 991 00:44:26,090 --> 00:44:28,630 Deci, asigurați-copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash copy1. 993 00:44:30,860 --> 00:44:33,670 Am de gând să tastați în salut, Enter. 994 00:44:33,670 --> 00:44:37,430 Și acum observați, doar copia a fost capitalizate. 995 00:44:37,430 --> 00:44:40,890 Pentru că într-adevăr avea două bucăți de memorie. 996 00:44:40,890 --> 00:44:44,390 >> Din păcate, se poate face ceva destul de lucruri rele și destul de periculos aici. 997 00:44:44,390 --> 00:44:49,290 Permiteți-mi trage un exemplu aici acum, care ne dă un exemplu de câteva 998 00:44:49,290 --> 00:44:51,540 linii diferite. 999 00:44:51,540 --> 00:44:56,040 Deci, doar intuitiv aici, prima linie de cod, int x stele, se declară 1000 00:44:56,040 --> 00:44:57,340 o variabilă numită x. 1001 00:44:57,340 --> 00:44:58,810 Și ceea ce este tipul de date de ce variabile? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Care este tipul de date de care variabile? 1004 00:45:04,290 --> 00:45:06,980 Că nu a fost Cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Tipul de date este steaua Int. 1006 00:45:08,350 --> 00:45:12,600 Deci, ce înseamnă asta? x va stoca adresa unui Int. 1007 00:45:12,600 --> 00:45:13,520 Simplu ca asta. 1008 00:45:13,520 --> 00:45:16,220 Y este de gând pentru a stoca adresa de un int. 1009 00:45:16,220 --> 00:45:18,390 Care este a treia linie din Codul faci acolo? 1010 00:45:18,390 --> 00:45:21,850 Este alocarea câte bytes, cel mai probabil? 1011 00:45:21,850 --> 00:45:22,350 Patru. 1012 00:45:22,350 --> 00:45:25,460 Datorită mărimii un int este în general, patru, malloc de patru dă 1013 00:45:25,460 --> 00:45:29,950 mi înapoi adresa de o bucată de memorie, primul de a căror octeți este 1014 00:45:29,950 --> 00:45:32,110 stocate acum în x. 1015 00:45:32,110 --> 00:45:34,410 >> Acum ne mișcăm un pic mai repede. 1016 00:45:34,410 --> 00:45:35,760 Steaua x înseamnă ce? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Aceasta înseamnă du-te la acea adresă și a pus ce numărul de acolo? 1019 00:45:42,590 --> 00:45:43,870 Pune numărul 42 acolo. 1020 00:45:43,870 --> 00:45:47,590 Star Y înseamnă du-te la ceea ce e la Y și a pus numărul 13 acolo. 1021 00:45:47,590 --> 00:45:48,600 >> Dar stai un minut. 1022 00:45:48,600 --> 00:45:51,640 Ce este în y în acest moment? 1023 00:45:51,640 --> 00:45:54,950 Care este adresa y depozitare? 1024 00:45:54,950 --> 00:45:55,770 Noi nu știm, nu? 1025 00:45:55,770 --> 00:45:59,230 Noi nu am folosi o dată atribuirea Operatorul implică y. 1026 00:45:59,230 --> 00:46:03,370 Deci, Y ca a declarat pe a doua linie a Codul este doar o valoare gunoi, o mare 1027 00:46:03,370 --> 00:46:04,760 semn de întrebare ca să spunem așa. 1028 00:46:04,760 --> 00:46:07,230 Acesta ar putea fi îndreptat aleatoriu a ceva în memorie, care 1029 00:46:07,230 --> 00:46:08,340 este în general prost. 1030 00:46:08,340 --> 00:46:13,540 >> Asa ca imediat ce am lovit acea linie acolo, star Y este egal cu 13, ceva rău, 1031 00:46:13,540 --> 00:46:17,220 ceva foarte rău este de aproximativ să se întâmple la Binky. 1032 00:46:17,220 --> 00:46:25,810 Deci, haideți să vedem ce se va termina întâmplă binky aici, în acest moment 1033 00:46:25,810 --> 00:46:26,200 sau cam asa arata. 1034 00:46:26,200 --> 00:46:26,490 >> [Redare video] 1035 00:46:26,490 --> 00:46:26,745 >> -Hei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Trezește-te. 1037 00:46:27,000 --> 00:46:29,296 E timpul pentru distracție pointer. 1038 00:46:29,296 --> 00:46:30,680 >> -Ce-i asta? 1039 00:46:30,680 --> 00:46:31,980 Aflați mai multe despre indicii? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Acest cod alocă două indicatoare care pot indica la întregi. 1044 00:46:41,650 --> 00:46:43,760 >> -Bine, bine, eu văd cele două indicii. 1045 00:46:43,760 --> 00:46:45,850 Dar acestea nu par a fi arătând spre nimic. 1046 00:46:45,850 --> 00:46:46,490 >> -Asta-i drept. 1047 00:46:46,490 --> 00:46:48,630 Inițial, indicii nu punctul de nimic. 1048 00:46:48,630 --> 00:46:51,700 Lucrurile pe care le indica sunt numite pointees, și de a le propune este o 1049 00:46:51,700 --> 00:46:52,850 etapă separată. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, dreapta, dreapta. 1051 00:46:53,740 --> 00:46:54,500 Știam că. 1052 00:46:54,500 --> 00:46:56,270 Cele pointees sunt separate. 1053 00:46:56,270 --> 00:46:58,553 Deci, cum a face tu aloca un pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Ei bine, acest cod alocă un nou întregi pointee, și această parte stabilește x 1056 00:47:03,707 --> 00:47:05,520 la punctul să-l. 1057 00:47:05,520 --> 00:47:06,760 >> -Hei, care arată mai bine. 1058 00:47:06,760 --> 00:47:08,520 Astfel încât să se facă ceva. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Voi dereference indicatorul x pentru a stoca numărul 42 în pointee acesteia. 1061 00:47:14,110 --> 00:47:17,660 Pentru acest truc, am nevoie de magia mea bagheta de dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Ta bagheta magica de dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Uh, asta e minunat. 1064 00:47:22,632 --> 00:47:24,620 >> -Aceasta este ceea ce Codul arata. 1065 00:47:24,620 --> 00:47:27,526 Am sa pun doar la numărul, și - 1066 00:47:27,526 --> 00:47:28,250 >> -Hei, uite. 1067 00:47:28,250 --> 00:47:29,680 Nu merge. 1068 00:47:29,680 --> 00:47:34,520 Deci, face o dereference pe x urmează săgeata pentru a accesa pointee sale. 1069 00:47:34,520 --> 00:47:36,690 În acest caz, pentru a stoca 42 acolo. 1070 00:47:36,690 --> 00:47:40,890 Hei, încercați să utilizați-l pentru a stoca numărul 13 prin cealaltă indicatorul, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Voi merge doar aici la y și Obțineți numărul 13 înființat. 1073 00:47:46,810 --> 00:47:50,890 Și apoi să ia bagheta de dereferencing și chiar - 1074 00:47:50,890 --> 00:47:52,430 Oau! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hei. 1076 00:47:53,030 --> 00:47:54,610 Că nu au de lucru. 1077 00:47:54,610 --> 00:47:58,200 Spune, Binky, nu cred dereferencing Y este o idee bună, 1078 00:47:58,200 --> 00:48:01,370 deoarece înființarea pointee este o etapă separată. 1079 00:48:01,370 --> 00:48:03,460 Și nu cred că am făcut-o vreodată. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bun punct. 1082 00:48:05,160 --> 00:48:07,410 >> -Da, am alocat y indicatorul. 1083 00:48:07,410 --> 00:48:10,045 Dar niciodată nu l-am setat la indica o pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Foarte atent. 1086 00:48:12,170 --> 00:48:13,790 >> -Hei, sunteți în căutarea bine acolo, Binky. 1087 00:48:13,790 --> 00:48:16,920 Poți să repari, astfel încât punctele y la fel ca și pointee x? 1088 00:48:16,920 --> 00:48:17,810 >> -Sigur. 1089 00:48:17,810 --> 00:48:20,300 Voi folosi bagheta magică de cesiune pointer. 1090 00:48:20,300 --> 00:48:22,240 >> -Asta va fi o problema ca înainte? 1091 00:48:22,240 --> 00:48:22,665 >> -Nu. 1092 00:48:22,665 --> 00:48:24,300 Acest lucru nu atinge pointees. 1093 00:48:24,300 --> 00:48:27,880 Se schimbă doar un pointer la punctul la același lucru ca un alt. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, văd. 1095 00:48:28,970 --> 00:48:31,730 Acum y puncte în același loc ca și x. 1096 00:48:31,730 --> 00:48:32,450 Așteaptă. 1097 00:48:32,450 --> 00:48:33,490 Acum y este fix. 1098 00:48:33,490 --> 00:48:34,630 Ea are o pointee. 1099 00:48:34,630 --> 00:48:36,520 Astfel, puteți încerca bagheta de dereferencing din nou 1100 00:48:36,520 --> 00:48:39,200 pentru a trimite peste 13 ani. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Aici merge. 1103 00:48:41,570 --> 00:48:42,870 >> -Hei, uita-te la asta. 1104 00:48:42,870 --> 00:48:44,320 Acum dereferencing lucrări pe y. 1105 00:48:44,320 --> 00:48:47,020 Și pentru că indicii sunt de partajare să rețină pointee, ele 1106 00:48:47,020 --> 00:48:48,585 atât vezi 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Da. 1108 00:48:49,040 --> 00:48:49,670 Partajarea. 1109 00:48:49,670 --> 00:48:50,380 Oricare ar fi. 1110 00:48:50,380 --> 00:48:52,290 Deci, vom schimba locul acum? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, uite. 1112 00:48:52,970 --> 00:48:54,150 Nu mai avem timp. 1113 00:48:54,150 --> 00:48:55,200 >> -Dar - 1114 00:48:55,200 --> 00:48:57,060 >> -Doar amintiți-vă trei Normele indicator. 1115 00:48:57,060 --> 00:49:00,100 Numărul unu, structura de bază este că aveți un pointer. 1116 00:49:00,100 --> 00:49:02,170 Și-l arată pe de o pointee. 1117 00:49:02,170 --> 00:49:04,160 Dar indicatorul și pointee sunt separate. 1118 00:49:04,160 --> 00:49:06,460 Și eroarea comun este de a înființat un pointer, dar a 1119 00:49:06,460 --> 00:49:08,540 uita la dat un pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Numărul doi, indicatorul dereferencing începe la indicatorul si urmeaza sa 1121 00:49:12,460 --> 00:49:14,570 săgeată pentru a avea acces pointee acesteia. 1122 00:49:14,570 --> 00:49:18,640 După cum știm cu toții, aceasta funcționează numai dacă există este un pointee, care se întoarce la 1123 00:49:18,640 --> 00:49:19,790 Regula numărul unu. 1124 00:49:19,790 --> 00:49:23,670 >> Numărul trei, cesiune indicatorul se un pointer și modificările pe care să indice 1125 00:49:23,670 --> 00:49:25,850 același pointee ca un alt indicator. 1126 00:49:25,850 --> 00:49:27,840 Deci, după cesiune, cele două indicii vor 1127 00:49:27,840 --> 00:49:29,430 punct la același pointee. 1128 00:49:29,430 --> 00:49:31,600 Uneori, care este numit de partajare. 1129 00:49:31,600 --> 00:49:33,430 Și asta e tot ce există la acesta, într-adevăr. 1130 00:49:33,430 --> 00:49:33,840 Bye bye acum. 1131 00:49:33,840 --> 00:49:34,300 >> [END redare video] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Deci, mai mult pe indicatori, mai mult pe Binky săptămâna viitoare. 1133 00:49:36,940 --> 00:49:38,190 Ne vedem luni. 1134 00:49:38,190 --> 00:49:42,187