1 00:00:00,000 --> 00:00:02,742 2 00:00:02,742 --> 00:00:05,680 >> SPEAKER 1: Bună tuturor. 3 00:00:05,680 --> 00:00:07,530 Vom începe. 4 00:00:07,530 --> 00:00:09,330 Cred că oamenii sunt încă în desfășurare pentru a fi filtrarea în. 5 00:00:09,330 --> 00:00:12,840 Dar, în interesul de timp, astfel încât să putem te voi de aici la timp, 6 00:00:12,840 --> 00:00:14,110 vom începe. 7 00:00:14,110 --> 00:00:18,780 Deci, bun venit pentru a CS50 Quiz 0 revizuire. 8 00:00:18,780 --> 00:00:23,020 Pentru cei dintre voi care nu s-au realizat totuși, aveți o întrebare pe miercuri. 9 00:00:23,020 --> 00:00:25,700 Woo-hoo. 10 00:00:25,700 --> 00:00:29,780 >> Dacă nu ați început să studieze încă sau nu s-au dat seama că aceasta există încă, 11 00:00:29,780 --> 00:00:34,070 teste trecute și toate informațiile cu privire la Quiz-ul sunt pe cs50.net/quizzes. 12 00:00:34,070 --> 00:00:38,090 Sunt niște chestii destul de bine pe acolo, teste trecute de la ultimul 10 13 00:00:38,090 --> 00:00:43,760 ani, precum și informații despre acest test și subiecte 14 00:00:43,760 --> 00:00:46,250 care vor fi acoperite. 15 00:00:46,250 --> 00:00:48,980 Deci, să începem. 16 00:00:48,980 --> 00:00:54,240 >> Deci, voi s-ar putea aminti, primul zi de clasa David a avut aceste lămpi pe. 17 00:00:54,240 --> 00:00:59,650 Deci, în esență, tot ce se pe sub capota de un calculator este 18 00:00:59,650 --> 00:01:00,860 făcut în binar. 19 00:01:00,860 --> 00:01:04,080 Binary înseamnă ceea ce se pare cum ar fi, 0 și 1 a lui. 20 00:01:04,080 --> 00:01:09,290 Ea are două valori care poate fi reprezentat. 21 00:01:09,290 --> 00:01:14,675 >> Deci, la fel ca în prima zi de secțiune când David pornit o lumină 22 00:01:14,675 --> 00:01:21,990 bec pentru a reprezenta pe, sau 1, computerul nostru înțelege binar ca 0 și 23 00:01:21,990 --> 00:01:24,110 1, a pornit sau oprit. 24 00:01:24,110 --> 00:01:25,360 Bazele binare. 25 00:01:25,360 --> 00:01:29,440 26 00:01:29,440 --> 00:01:32,470 Fiecare loc este reprezentată în baza doi. 27 00:01:32,470 --> 00:01:36,260 Deci, se adaugă 2 la 0 la 1 la 2 până sus. 28 00:01:36,260 --> 00:01:41,970 >> Pentru a calcula ce binar ta este de a zecimal, doar să urmați această ecuație 29 00:01:41,970 --> 00:01:42,840 Tipul de lucru. 30 00:01:42,840 --> 00:01:49,510 Dacă aveți un 1 în oricare dintre aceste locuri, l-ai multiplica prin orice 31 00:01:49,510 --> 00:01:53,820 baza este în, adăugați-l în sus, și te zecimal. 32 00:01:53,820 --> 00:01:57,930 Deci, acesta este modul în care te numeri la 5 în binar. 33 00:01:57,930 --> 00:02:01,400 La fel ca ceea ce facem cu privire la Ultima imagine, acesta este modul în care ar fi 34 00:02:01,400 --> 00:02:02,650 reprezintă de la 1 la 5. 35 00:02:02,650 --> 00:02:05,320 36 00:02:05,320 --> 00:02:09,660 >> În mod similar, la fel ca puteți adăuga și scade în zecimal sau baza 10, sau 37 00:02:09,660 --> 00:02:13,040 într-adevăr orice bază, pe poate adăuga și scade în binar. 38 00:02:13,040 --> 00:02:18,400 Exact ceea ce v-ați aștepta, atunci când adăugați două sus, dacă este egal cu o mai mare 39 00:02:18,400 --> 00:02:24,220 decât 1, purtați un 1, fac din el un 0, și de a face adăugarea în acest fel, doar 40 00:02:24,220 --> 00:02:29,910 ca v-ați aștepta cu regularitate zecimal sau orice altă bază. 41 00:02:29,910 --> 00:02:30,970 Se răcește. 42 00:02:30,970 --> 00:02:35,140 >> Așa cum am spus înainte, tot ceea ce merge pe sub capota a computerului nostru 43 00:02:35,140 --> 00:02:37,560 se face în 0 și 1 a lui, sau binar. 44 00:02:37,560 --> 00:02:43,470 Deci, cum putem exprima, de exemplu, litere sau numere, sau caractere? 45 00:02:43,470 --> 00:02:45,560 Si raspunsul la care este ASCII. 46 00:02:45,560 --> 00:02:49,380 >> ASCII este o mapare între caractere care ne-ar vedea în mod normal în 47 00:02:49,380 --> 00:02:53,360 Limba engleză ca a lui A, B lui, C, a sublinia, linii, și 48 00:02:53,360 --> 00:02:54,910 ceva de genul asta. 49 00:02:54,910 --> 00:02:57,260 Și se mapează că la o valoare ASCII. 50 00:02:57,260 --> 00:03:03,080 O valoare ASCII este doar un număr care poate fi înțeleasă de către computer. 51 00:03:03,080 --> 00:03:07,430 Și la fel ca tine se poate face plus și scădere cu numere, puteți face 52 00:03:07,430 --> 00:03:10,890 le cu valori ASCII. 53 00:03:10,890 --> 00:03:14,050 >> Deci, în acest exemplu, care va imprima acest lucru? 54 00:03:14,050 --> 00:03:26,790 55 00:03:26,790 --> 00:03:35,480 Da, deci doar un spațiu spațiu B spațiu C D. Unde sa dus mouse-ul meu? 56 00:03:35,480 --> 00:03:39,200 57 00:03:39,200 --> 00:03:43,380 Observați puteți defini un int la 65. 58 00:03:43,380 --> 00:03:47,080 Și când imprimați că folosind la sută C, se va interpreta ca pe un 59 00:03:47,080 --> 00:03:49,330 caracter și va imprima A. 60 00:03:49,330 --> 00:03:52,800 >> În mod similar, puteți declara ea ca un char. 61 00:03:52,800 --> 00:03:56,860 Și atunci când îl imprimați folosind la sută C, se va interpreta ca, 62 00:03:56,860 --> 00:04:05,240 la sută D. Si la fel ca tine se poate adăuga un număr, puteți adăuga caractere sunt 63 00:04:05,240 --> 00:04:06,878 Valori ASCII, în acest caz. 64 00:04:06,878 --> 00:04:11,370 65 00:04:11,370 --> 00:04:16,130 >> Deci, un pic pointer pentru toată lumea. 66 00:04:16,130 --> 00:04:19,610 5, ca un șir de caractere, nu de fapt, egal cu 5. 67 00:04:19,610 --> 00:04:26,610 Deci, cum am putea converti șir 5 la numărul întreg 5? 68 00:04:26,610 --> 00:04:28,930 Orice idei? 69 00:04:28,930 --> 00:04:31,630 Da. 70 00:04:31,630 --> 00:04:36,720 >> Deci, dacă avem 5 ca un șir de caractere, putem scădea 0. 71 00:04:36,720 --> 00:04:37,820 Și asta ne va da 5. 72 00:04:37,820 --> 00:04:41,670 Și în mod similar, dacă avem 5 ca un întreg, se adaugă faptul că în șirul 0. 73 00:04:41,670 --> 00:04:43,112 Și asta ne dă șirul 5. 74 00:04:43,112 --> 00:04:46,350 75 00:04:46,350 --> 00:04:48,350 Se răcește. 76 00:04:48,350 --> 00:04:52,940 >> Acum, amintesc înapoi pentru a preda o în cazul în care am vorbit despre algoritmi. 77 00:04:52,940 --> 00:04:57,260 Deci, cum ne-o dorim de fapt un calculator de a face lucruri interesante? 78 00:04:57,260 --> 00:05:00,460 Știi, doar adunare și scădere numere și imprimare lucruri nu este 79 00:05:00,460 --> 00:05:01,730 asta interesant. 80 00:05:01,730 --> 00:05:04,620 De obicei, vrem calculatorul nostru de efectua un fel de algoritm. 81 00:05:04,620 --> 00:05:07,820 Ceva un pic mai complex decât doar aritmetică simplă. 82 00:05:07,820 --> 00:05:11,930 >> Un algoritm este doar un pas de set pas de instrucțiuni pentru modul de efectuare a 83 00:05:11,930 --> 00:05:14,640 o anumită task-- 84 00:05:14,640 --> 00:05:15,660 la fel ca o rețetă. 85 00:05:15,660 --> 00:05:19,990 S-ar putea aminti în prima zi a Clasa în care David a ne conta o cameră 86 00:05:19,990 --> 00:05:22,550 de oameni și cât de mulți oameni fost în cameră. 87 00:05:22,550 --> 00:05:24,480 S-ar putea fi folosite pentru numărare unul câte unul. 88 00:05:24,480 --> 00:05:25,860 1, 2, 3, 4. 89 00:05:25,860 --> 00:05:28,010 În acest caz, un algoritm de timp liniar. 90 00:05:28,010 --> 00:05:31,710 >> Dar David a introdus un algoritm pentru să numeri oamenii din sala 91 00:05:31,710 --> 00:05:37,340 în cazul în care toată lumea se ridică în picioare, vă spun dumneavoastră număr de o altă persoană, adăuga că 92 00:05:37,340 --> 00:05:39,200 număr în sus, și o persoană stă jos. 93 00:05:39,200 --> 00:05:40,410 Și tu repeta. 94 00:05:40,410 --> 00:05:42,910 Acesta este un tip de algoritm. 95 00:05:42,910 --> 00:05:47,520 Putem analiza o cât de eficient Algoritmul se bazează pe a rulat timp. 96 00:05:47,520 --> 00:05:49,680 Dar vom vorbi un pic mai multe despre asta mai târziu. 97 00:05:49,680 --> 00:05:52,740 98 00:05:52,740 --> 00:05:57,090 >> Deci, toți algoritmii pot, de asemenea, să fie scris în pseudocod. 99 00:05:57,090 --> 00:06:01,120 Pseudocod este doar o limba engleză ca sintaxă folosită pentru a reprezenta 100 00:06:01,120 --> 00:06:02,420 un limbaj de programare. 101 00:06:02,420 --> 00:06:06,070 De exemplu, dacă am vrut să întreb un utilizator pentru a ghici numărul meu preferat, am 102 00:06:06,070 --> 00:06:08,390 ar putea avea pseudocod ca atare. 103 00:06:08,390 --> 00:06:09,850 >> Ia-o de utilizatori ghici. 104 00:06:09,850 --> 00:06:13,570 În cazul în care ghici este corect, spune-le sunt corecte, altfel le spun 105 00:06:13,570 --> 00:06:15,560 ei nu sunt corecte. 106 00:06:15,560 --> 00:06:22,530 Și pseudocod este un mod de ușor reprezentând o idee sau un algoritm. 107 00:06:22,530 --> 00:06:26,910 Deci, acum ne-am putea dori să scrie de fapt aceasta în limba pe care computerul 108 00:06:26,910 --> 00:06:27,980 s-ar putea înțelege. 109 00:06:27,980 --> 00:06:35,660 Deci, am putea scrie pseudocod noastră și interpreta că în codul sursă. 110 00:06:35,660 --> 00:06:41,320 >> Până în prezent, codul sursă trebuie să adere într-o anumită sintaxă a 111 00:06:41,320 --> 00:06:42,490 un limbaj de programare. 112 00:06:42,490 --> 00:06:45,430 Și până acum, în CS50, ne-am folosit mai ales c. 113 00:06:45,430 --> 00:06:48,320 Deci, acest lucru ar putea fi codul sursă pentru c. 114 00:06:48,320 --> 00:06:51,440 Mai târziu, în cursul, ai venit noapte în contact cu alte programe 115 00:06:51,440 --> 00:06:52,480 limbi, cum ar fi PHP. 116 00:06:52,480 --> 00:06:57,540 Sau, dacă luați chiar alte clase, vă s-ar putea face Java, Python, sau chiar OCML. 117 00:06:57,540 --> 00:07:01,570 Dar, în limbaj de programare C noastră, aceasta este cum am putea scrie codul sursă pentru 118 00:07:01,570 --> 00:07:04,760 algoritmul pseudocod care Tocmai am descris mai devreme. 119 00:07:04,760 --> 00:07:08,630 120 00:07:08,630 --> 00:07:11,430 >> Deci, cum face computerul de fapt Intelegi? 121 00:07:11,430 --> 00:07:14,490 Cum am spus mai înainte, doar într-adevăr înțelege zero si unu. 122 00:07:14,490 --> 00:07:17,880 Deci, cum nu-l lua de la sursa cod pentru ceva ce poate fi 123 00:07:17,880 --> 00:07:18,960 înțeles? 124 00:07:18,960 --> 00:07:22,920 Ei bine, avem ceva numit un compilator. 125 00:07:22,920 --> 00:07:28,450 >> Dacă vă amintiți înapoi în cele mai multe dintre dumneavoastră psets, ai avut un fel de program de 126 00:07:28,450 --> 00:07:30,370 scris într-un fișier punct c. 127 00:07:30,370 --> 00:07:32,550 Și atunci va trebui sa tastezi face. 128 00:07:32,550 --> 00:07:35,970 Deci, ceea ce se face aici? 129 00:07:35,970 --> 00:07:39,970 >> Aveți posibilitatea să tastați face pentru a compila dvs. Programul deoarece someone-- 130 00:07:39,970 --> 00:07:42,730 cine a scris setul p; probabil pe David 131 00:07:42,730 --> 00:07:44,190 a creat un fișier face. 132 00:07:44,190 --> 00:07:51,320 Și asta spune face să știți pentru a rula dvs. compilator, numit zăngănit, că voința 133 00:07:51,320 --> 00:07:55,560 apoi compila codul sursă de a se opune cod, care este zero si unu 134 00:07:55,560 --> 00:07:57,720 care computerul înțelege. 135 00:07:57,720 --> 00:08:01,610 Dar un pic mai târziu, vom merge mai în profunzime despre compilatoare. 136 00:08:01,610 --> 00:08:05,640 137 00:08:05,640 --> 00:08:10,800 >> Deci amintesc PSET 0, Unde-- da, Ai o intrebare? 138 00:08:10,800 --> 00:08:11,620 >> Audiența: [inaudibil]? 139 00:08:11,620 --> 00:08:12,490 >> SPEAKER 1: Da. 140 00:08:12,490 --> 00:08:14,960 Eu cred că ei de fapt ar trebui să fie on-line. 141 00:08:14,960 --> 00:08:15,120 Da. 142 00:08:15,120 --> 00:08:16,572 >> Audiența: Este ca [inaudibil]? 143 00:08:16,572 --> 00:08:19,476 144 00:08:19,476 --> 00:08:20,830 >> SPEAKER 1: Nu este. 145 00:08:20,830 --> 00:08:25,810 Sunt pe cs50.net/quizzes. 146 00:08:25,810 --> 00:08:32,900 >> Audiența: teste Slash, slash 2013, slash 0, și doar să faceți clic prin intermediul 147 00:08:32,900 --> 00:08:35,956 teste 2013 și quiz 0, revizui diapozitive secțiune. 148 00:08:35,956 --> 00:08:40,380 >> SPEAKER 1: Da, așa că dacă vreți să trageți-o în sus și uită-te la el pe dumneavoastră 149 00:08:40,380 --> 00:08:42,740 calculator propriu, care e prea bine. 150 00:08:42,740 --> 00:08:43,130 Spune că din nou. 151 00:08:43,130 --> 00:08:44,546 >> Audiența: [inaudibil]. 152 00:08:44,546 --> 00:08:48,780 >> SPEAKER 1: Da, [neauzit] este variabila dummy. 153 00:08:48,780 --> 00:08:49,644 Oh, da? 154 00:08:49,644 --> 00:08:51,372 >> Audiența: [inaudibil]? 155 00:08:51,372 --> 00:08:54,300 >> SPEAKER 1: Nu, greve nu sunt la examen. 156 00:08:54,300 --> 00:08:55,950 Ne pare rău, întrebarea ei a fost, a fost greve la examen. 157 00:08:55,950 --> 00:08:59,530 Și nu este. 158 00:08:59,530 --> 00:09:05,780 Deci PSET 0, voi ar trebui să aibă toate implementat ceva folosind zero. 159 00:09:05,780 --> 00:09:13,100 Și am învățat ceva de programare de bază blocuri folosind zero. 160 00:09:13,100 --> 00:09:15,590 >> Deci, haideți să aruncăm o privire la unele din aceste blocuri 161 00:09:15,590 --> 00:09:18,170 care alcătuiesc un program de. 162 00:09:18,170 --> 00:09:20,570 În primul rând este expresie booleană. 163 00:09:20,570 --> 00:09:24,540 Expresii booleene sunt cele și 0 sau ceva care are 164 00:09:24,540 --> 00:09:25,700 două valori posibile. 165 00:09:25,700 --> 00:09:30,320 În acest caz, adevărat sau fals, pornit sau oprit, și da sau nu. 166 00:09:30,320 --> 00:09:35,390 Un exemplu de simplu, foarte simplu, program care utilizează un Boolean 167 00:09:35,390 --> 00:09:39,140 expresie aici. 168 00:09:39,140 --> 00:09:43,220 >> Deci, în scopul de expresii booleene la fi util, avem operatori booleeni. 169 00:09:43,220 --> 00:09:48,920 Acestea sunt operatorii care pot fi utilizate pentru a compara anumite valori. 170 00:09:48,920 --> 00:09:52,820 Deci avem și sau nu este egal cu, mai puțin mare sau egal cu, sau mai mare decât 171 00:09:52,820 --> 00:09:55,130 egal cu, și mai puțin de sau mai mare. 172 00:09:55,130 --> 00:09:59,060 Dar acești operatori nu sunt foarte utile dacă nu le putem combina în 173 00:09:59,060 --> 00:10:00,320 condiții. 174 00:10:00,320 --> 00:10:04,370 >> Deci, voi s-ar putea aminti de la zero și de la p dumneavoastră stabilește că ne-am 175 00:10:04,370 --> 00:10:05,400 avut condiții. 176 00:10:05,400 --> 00:10:09,710 Ele sunt, în esență, ca și furci în logica a programului, care 177 00:10:09,710 --> 00:10:12,670 execută funcție de faptul dacă o condiție este îndeplinită. 178 00:10:12,670 --> 00:10:18,150 Deci, una dintre condițiile pe care le-am avut folosit de multe ori în acest curs este 179 00:10:18,150 --> 00:10:21,470 în cazul în care, în altă, în cazul în care, și condițiile de altceva. 180 00:10:21,470 --> 00:10:24,060 >> Iată un exemplu de cât de s-ar putea folosi. 181 00:10:24,060 --> 00:10:28,430 Stie cineva diferenta dintre folosind doar dacă declarațiile tuturor 182 00:10:28,430 --> 00:10:32,530 drumul în jos versetele dacă, altceva, dacă, și mai combinat? 183 00:10:32,530 --> 00:10:33,013 Da? 184 00:10:33,013 --> 00:10:34,263 >> Audiența: [inaudibil]. 185 00:10:34,263 --> 00:10:40,741 186 00:10:40,741 --> 00:10:42,160 >> SPEAKER 1: Exact. 187 00:10:42,160 --> 00:10:50,210 Deci, dacă am avut, dacă tot drumul în jos această Astfel, chiar dacă această condiție se întoarce 188 00:10:50,210 --> 00:10:52,800 adevărat, acesta va continua testarea următoarele două. 189 00:10:52,800 --> 00:11:00,120 Întrucât, cu un altfel-în cazul în care, o parte declarație, în cazul în care cel returneaza true, 190 00:11:00,120 --> 00:11:02,640 ceilalți nu sunt testate. 191 00:11:02,640 --> 00:11:05,955 Orice întrebări despre asta? 192 00:11:05,955 --> 00:11:06,890 Se răcește. 193 00:11:06,890 --> 00:11:12,240 >> Deci, să utilizați un if-else de o parte declarație dacă știți că se poate doar 194 00:11:12,240 --> 00:11:14,470 fie unul din aceste cazuri. 195 00:11:14,470 --> 00:11:21,550 Deci știm dacă x este mai mic de 0, este cu siguranta nu va fi 196 00:11:21,550 --> 00:11:22,890 mai mare decât 0. 197 00:11:22,890 --> 00:11:26,940 198 00:11:26,940 --> 00:11:31,480 >> Apoi, un alt bloc că am învățat sunt bucle. 199 00:11:31,480 --> 00:11:33,310 Avem trei tipuri de bucle. 200 00:11:33,310 --> 00:11:35,830 Pentru bucle, în timp ce buclele, și de a face în timp ce buclele. 201 00:11:35,830 --> 00:11:38,730 Și, în general, atunci când stai jos pentru a scrie ceva, va trebui să decidă 202 00:11:38,730 --> 00:11:40,060 Care dintre cele trei pe care doriți să o utilizați. 203 00:11:40,060 --> 00:11:41,900 Deci, cum putem decide care unul? 204 00:11:41,900 --> 00:11:44,920 205 00:11:44,920 --> 00:11:48,790 >> Noi folosim, în general, o buclă, dacă știm de câte ori ne-o dorim pentru a repeta 206 00:11:48,790 --> 00:11:53,650 prin ceva sau de câte ori ne-o dorim pentru a efectua o sarcină. 207 00:11:53,650 --> 00:11:58,830 Noi folosim în timp ce buclele dacă avem nevoie de ceva condiție pentru a fi adevărat pentru a păstra funcționare. 208 00:11:58,830 --> 00:12:03,730 Și noi folosim face în timp ce foarte asemănătoare cu în timp ce, dar vrem codul nostru pentru a rula la 209 00:12:03,730 --> 00:12:04,880 puțin o dată. 210 00:12:04,880 --> 00:12:09,410 >> Deci în timp ce, tot ce este în a face voia se execută întotdeauna cel puțin o dată. 211 00:12:09,410 --> 00:12:13,120 Întrucât, cu acest timp, ea nu poate rula la toate, dacă 212 00:12:13,120 --> 00:12:15,490 condiție nu este îndeplinită. 213 00:12:15,490 --> 00:12:16,740 Orice întrebări cu asta? 214 00:12:16,740 --> 00:12:20,480 215 00:12:20,480 --> 00:12:22,860 >> Deci structura unei bucle de. 216 00:12:22,860 --> 00:12:23,620 Voi ați văzut toate astea. 217 00:12:23,620 --> 00:12:25,320 Ai inițializa. 218 00:12:25,320 --> 00:12:26,600 Ai un fel de stare. 219 00:12:26,600 --> 00:12:32,340 Deci, de exemplu, s-ar putea inițializa ca de i este egal cu 0. 220 00:12:32,340 --> 00:12:34,040 i este mai mic de 10. 221 00:12:34,040 --> 00:12:35,442 Și i ++. 222 00:12:35,442 --> 00:12:39,010 Unul foarte simplu, pe care le-am făcut. 223 00:12:39,010 --> 00:12:42,210 >> Pentru o buclă în timp ce, în mod similar, aveți pentru a avea un fel de initializare, 224 00:12:42,210 --> 00:12:44,980 un fel de stare, și un fel de actualizare. 225 00:12:44,980 --> 00:12:51,990 Astfel încât să putem pune în aplicare nostru de buclă, de asemenea, ca o buclă în timp ce utilizați acest lucru. 226 00:12:51,990 --> 00:12:56,000 Și în mod similar cu un do în timp ce buclă, am putea avea ceva de initializare, 227 00:12:56,000 --> 00:12:58,640 executa ceva, o actualizează, și apoi verificați starea. 228 00:12:58,640 --> 00:13:03,500 229 00:13:03,500 --> 00:13:05,140 >> Deci, acum funcții. 230 00:13:05,140 --> 00:13:06,460 Am pus totul împreună. 231 00:13:06,460 --> 00:13:10,140 S-ar putea dori să scrie unele tip de funcție. 232 00:13:10,140 --> 00:13:12,790 Funcția comun, care s-ar putea s-au văzut deja este principal. 233 00:13:12,790 --> 00:13:13,770 Principal este o funcție. 234 00:13:13,770 --> 00:13:16,160 Ea are un tip de întoarcere, int. 235 00:13:16,160 --> 00:13:18,470 Ea are un nume de funcție, principal. 236 00:13:18,470 --> 00:13:20,810 Și are argumente, argc și argv. 237 00:13:20,810 --> 00:13:24,040 Deci principal este doar o funcție. 238 00:13:24,040 --> 00:13:27,230 >> Alte funcții ce le-ar putea fi utilizate, printf printf-- este un function-- 239 00:13:27,230 --> 00:13:29,330 Getint, toupper. 240 00:13:29,330 --> 00:13:32,010 Dar acestea se întâmplă să fi fost implementat pentru noi de 241 00:13:32,010 --> 00:13:33,270 un fel de bibliotecă. 242 00:13:33,270 --> 00:13:37,400 Dacă voi aminti inclusiv această bibliotecă CS50.h sau 243 00:13:37,400 --> 00:13:38,510 I standardul / bibliotecă O. 244 00:13:38,510 --> 00:13:39,200 Da, întrebarea? 245 00:13:39,200 --> 00:13:41,610 >> Audiența: Este principal doar inerent în c? 246 00:13:41,610 --> 00:13:44,740 Are doar un fel de [inaudibil]? 247 00:13:44,740 --> 00:13:47,370 >> SPEAKER 1: Întrebarea este dacă principal este inerentă în c. 248 00:13:47,370 --> 00:13:51,460 Și da, toate funcțiile au o funcție principală. 249 00:13:51,460 --> 00:13:55,290 E un fel de necesare pentru calculator să știe de unde să înceapă 250 00:13:55,290 --> 00:13:55,993 rularea codului. 251 00:13:55,993 --> 00:13:58,108 >> Audiența: Deci nu ar fi [inaudibil]? 252 00:13:58,108 --> 00:13:59,480 >> SPEAKER 1: Nu 253 00:13:59,480 --> 00:14:00,760 Orice alte întrebări? 254 00:14:00,760 --> 00:14:03,430 255 00:14:03,430 --> 00:14:04,770 Se răcește. 256 00:14:04,770 --> 00:14:08,050 Deci, la fel ca tine se poate utiliza o funcție care este scris pentru tine, puteți, de asemenea 257 00:14:08,050 --> 00:14:10,380 scrie propria funcție. 258 00:14:10,380 --> 00:14:17,050 Aceasta este o funcție care cineva s-ar putea s-au scris pentru a calcula volumul 259 00:14:17,050 --> 00:14:18,395 unui q, de exemplu. 260 00:14:18,395 --> 00:14:21,300 261 00:14:21,300 --> 00:14:29,500 Există un tip de revenire aici, în acest caz, Int, numele nostru funcție q și noastre 262 00:14:29,500 --> 00:14:31,360 listă de parametri. 263 00:14:31,360 --> 00:14:34,550 >> Și rețineți că trebuie să scrie datele tip de parametrul pe care doriți să 264 00:14:34,550 --> 00:14:38,660 utilizați sau altfel funcția nu știu ce fel de 265 00:14:38,660 --> 00:14:41,650 parametru ar trebui să fie de acceptare. 266 00:14:41,650 --> 00:14:48,110 Deci, în acest caz, ne-o dorim un număr întreg ca intrare noastră. 267 00:14:48,110 --> 00:14:50,390 Deci, de ce s-ar putea ne-am dori să utilizați funcții? 268 00:14:50,390 --> 00:14:52,800 >> Mai întâi de toate, o mare pentru organizație. 269 00:14:52,800 --> 00:14:56,350 Ele ajuta rupe codul în mai organizat bucăți și face 270 00:14:56,350 --> 00:14:57,960 mai ușor de citit. 271 00:14:57,960 --> 00:14:59,760 Simplificare. 272 00:14:59,760 --> 00:15:01,740 Acest lucru este bun pentru proiectare. 273 00:15:01,740 --> 00:15:04,570 Când citești o bucată de cod și funcția principală este într-adevăr, 274 00:15:04,570 --> 00:15:07,750 foarte lung, ar putea fi mai greu de motiv cu privire la ceea ce se întâmplă. 275 00:15:07,750 --> 00:15:11,710 Deci, dacă se descompun în funcții, ar putea fi mai ușor de citit. 276 00:15:11,710 --> 00:15:12,750 Și de reutilizare, capacitatea. 277 00:15:12,750 --> 00:15:16,940 Dacă aveți o bucată de cod care fiind numit sau a alerga de mai multe ori, 278 00:15:16,940 --> 00:15:20,690 în loc de a rescrie codul de 10 ori în funcția principală, s-ar putea 279 00:15:20,690 --> 00:15:21,440 doriți să-l refolosi. 280 00:15:21,440 --> 00:15:25,740 Și atunci de fiecare dată când aveți nevoie pentru a utiliza ca bucată de cod, apelați funcția. 281 00:15:25,740 --> 00:15:30,550 282 00:15:30,550 --> 00:15:35,380 >> Deci, acum, dacă ne amintim din nou la zero, am vorbit, de asemenea, despre câteva concepte, 283 00:15:35,380 --> 00:15:37,680 dintre care unul este filetat. 284 00:15:37,680 --> 00:15:41,120 Subiect este conceptul de multiple secvente de cod 285 00:15:41,120 --> 00:15:43,040 executare, în același timp. 286 00:15:43,040 --> 00:15:47,490 Deci, cred că înapoi la o zi în care David a avut voi conta pe numărul de 287 00:15:47,490 --> 00:15:48,440 persoane in camera. 288 00:15:48,440 --> 00:15:50,550 >> În esență, ceea ce se întâmplă pe este tot de voi au fost 289 00:15:50,550 --> 00:15:52,370 rularea fire separate. 290 00:15:52,370 --> 00:15:55,540 Și aceste fire au venit împreună pentru a obține un fel de răspuns. 291 00:15:55,540 --> 00:15:58,890 În mod similar, în Scratch, atunci când aveți mai multe sprite, s-ar putea 292 00:15:58,890 --> 00:16:01,070 au o pisică și un câine. 293 00:16:01,070 --> 00:16:08,770 Și ei ar fi în același timp rularea script-uri proprii. 294 00:16:08,770 --> 00:16:10,020 Acesta este un exemplu de filetare. 295 00:16:10,020 --> 00:16:12,860 296 00:16:12,860 --> 00:16:18,000 >> Și un alt concept care a fost introdus în zero a fost evenimente. 297 00:16:18,000 --> 00:16:22,550 Iar evenimente sunt atunci când mai multe părți ale codul comunice unul cu celălalt. 298 00:16:22,550 --> 00:16:26,840 În Scratch, aceasta a fost atunci când ați folosit controlul de difuzare și când am 299 00:16:26,840 --> 00:16:29,500 Primiți blocuri. 300 00:16:29,500 --> 00:16:35,170 >> Și, de asemenea, în Problema Set 4, am văzut un pic de evenimente, de asemenea. 301 00:16:35,170 --> 00:16:38,250 Voi ar putea fi folosit biblioteca Gevent. 302 00:16:38,250 --> 00:16:42,450 Și acolo a fost o funcție waitForClick în care ați fost de așteptare 303 00:16:42,450 --> 00:16:44,300 pentru ca utilizatorul să faceți clic. 304 00:16:44,300 --> 00:16:47,870 Și faceți clic, în acest caz, ar fi eveniment și așteptați pentru click este dumneavoastră 305 00:16:47,870 --> 00:16:49,120 tratare a evenimentului. 306 00:16:49,120 --> 00:16:53,690 307 00:16:53,690 --> 00:16:58,630 >> Și, de asemenea, pe tot parcursul rulează psets dvs. și de lucru pe psets tale, 308 00:16:58,630 --> 00:17:01,920 ar fi putut intra în contact cu unele dintre aceste comenzi. 309 00:17:01,920 --> 00:17:05,579 Aceasta este ceea ce ați tastat în ta fereastră de terminal sau orice fereastră 310 00:17:05,579 --> 00:17:12,119 care apare pe g de editare pentru a, în esență, naviga pe computer. 311 00:17:12,119 --> 00:17:19,440 >> Deci, de exemplu, LS listează conținutul unui director. 312 00:17:19,440 --> 00:17:22,510 Fa directorul creează un nou director. 313 00:17:22,510 --> 00:17:24,819 CD, directorul schimbare. 314 00:17:24,819 --> 00:17:28,400 RM, elimina, șterge un fișier sau unele director. 315 00:17:28,400 --> 00:17:31,050 Și apoi scoateți director elimină un director. 316 00:17:31,050 --> 00:17:32,300 >> Audiența: [inaudibil]? 317 00:17:32,300 --> 00:17:36,978 318 00:17:36,978 --> 00:17:38,370 >> SPEAKER 1: Da, sigur. 319 00:17:38,370 --> 00:17:42,530 320 00:17:42,530 --> 00:17:46,040 Ne pare rău, întrebarea a fost dacă ar sugera punerea aceasta 321 00:17:46,040 --> 00:17:48,840 pe foaia de ieftin. 322 00:17:48,840 --> 00:17:49,440 S-ar putea ajuta. 323 00:17:49,440 --> 00:17:51,490 Dacă aveți cameră, îl puteți pune pe. 324 00:17:51,490 --> 00:17:56,170 Este, de asemenea, doar în general destul de bun să ne amintim că atunci când îl folosiți 325 00:17:56,170 --> 00:17:59,060 ați putea dori să doar l-au memorat. 326 00:17:59,060 --> 00:18:02,750 Asta va face viata mult mai usoara. 327 00:18:02,750 --> 00:18:04,000 V-am răspuns la întrebare? 328 00:18:04,000 --> 00:18:10,528 329 00:18:10,528 --> 00:18:14,290 >> Deci, acum, am vorbit un pic pe scurt despre biblioteci. 330 00:18:14,290 --> 00:18:18,570 Dar cele două cele mai importante pe care le-am avut folosind până în prezent în curs sunt 331 00:18:18,570 --> 00:18:20,860 I / O standard și CS50. 332 00:18:20,860 --> 00:18:25,410 Ce fel de lucruri sunt incluse în standard / biblioteca I O? 333 00:18:25,410 --> 00:18:28,410 >> Da, până acum am folosit printf. 334 00:18:28,410 --> 00:18:31,150 În CS50, am folosit getint și getString. 335 00:18:31,150 --> 00:18:37,200 Iar șirul de tip de date se întâmplă, de asemenea, să fie declarat în această bibliotecă CS50. 336 00:18:37,200 --> 00:18:40,250 Vom vorbi un pic mai mult în profunzime despre cum bibliotecile de lucru și modul în care acestea 337 00:18:40,250 --> 00:18:41,870 interacționează cu restul codului. 338 00:18:41,870 --> 00:18:46,220 Dar acestea sunt cele două cele mai importante pe care le au venit în contact cu atât de mult în 339 00:18:46,220 --> 00:18:48,430 curs. 340 00:18:48,430 --> 00:18:50,050 >> Tipuri. 341 00:18:50,050 --> 00:18:58,120 Acestea sunt bine să ne amintim cât de mult fiecare tip este reprezentat de sau cum 342 00:18:58,120 --> 00:19:02,840 de multe bytes fiecare tip de requires-- 343 00:19:02,840 --> 00:19:04,990 int, 4 octeti; char, 1 octet. 344 00:19:04,990 --> 00:19:06,550 Float este de 4 bytes. 345 00:19:06,550 --> 00:19:07,782 Ce este un dublu? 346 00:19:07,782 --> 00:19:09,032 >> Audiența: [inaudibil]. 347 00:19:09,032 --> 00:19:11,398 348 00:19:11,398 --> 00:19:16,240 >> SPEAKER 1: Da, deci un flotor dar dubla dimensiunea. 349 00:19:16,240 --> 00:19:17,150 Ce zici de un lung? 350 00:19:17,150 --> 00:19:18,400 >> Audiența: [inaudibil]. 351 00:19:18,400 --> 00:19:21,614 352 00:19:21,614 --> 00:19:24,680 >> SPEAKER 1: OK. 353 00:19:24,680 --> 00:19:25,410 Ce este un lung? 354 00:19:25,410 --> 00:19:26,660 >> Audiența: [inaudibil]. 355 00:19:26,660 --> 00:19:29,400 356 00:19:29,400 --> 00:19:31,450 >> SPEAKER 1: Da, dubla un int. 357 00:19:31,450 --> 00:19:34,240 358 00:19:34,240 --> 00:19:34,705 Da. 359 00:19:34,705 --> 00:19:36,100 >> Audiența: [inaudibil]. 360 00:19:36,100 --> 00:19:38,030 >> SPEAKER 1: lung [inaudibil]. 361 00:19:38,030 --> 00:19:41,860 Și apoi o lungă lung este dublu. 362 00:19:41,860 --> 00:19:42,814 >> Audiența: Nu, nu. 363 00:19:42,814 --> 00:19:47,107 Un lung este doar un int. 364 00:19:47,107 --> 00:19:50,910 Depinde de arhitectura înainte de [neauzit] 365 00:19:50,910 --> 00:19:52,922 și int au aceeași dimensiune. 366 00:19:52,922 --> 00:19:54,172 [Neauzit]. 367 00:19:54,172 --> 00:19:58,841 368 00:19:58,841 --> 00:20:00,920 >> SPEAKER 1: Deci, un lung și un întreg sunt aceleași. 369 00:20:00,920 --> 00:20:02,943 Și apoi un lung lung este dublu int. 370 00:20:02,943 --> 00:20:03,910 Se răcește. 371 00:20:03,910 --> 00:20:05,550 Și atunci, care este ultimul tip? 372 00:20:05,550 --> 00:20:06,510 >> Audiența: Pointer. 373 00:20:06,510 --> 00:20:10,350 >> SPEAKER 1: Da, așa că am învățat un pic despre indicii. 374 00:20:10,350 --> 00:20:14,015 Și indiferent de ceea ce un pointer este arătând sa-- ar putea fi o stea char 375 00:20:14,015 --> 00:20:15,880 sau un int star-- 376 00:20:15,880 --> 00:20:20,530 este întotdeauna 4 octeți pentru un pointer. 377 00:20:20,530 --> 00:20:21,633 Întrebări despre asta? 378 00:20:21,633 --> 00:20:22,116 Da? 379 00:20:22,116 --> 00:20:24,531 >> Audiența: [inaudibil]? 380 00:20:24,531 --> 00:20:29,530 >> SPEAKER 1: Deci, un lung și un int sunt la fel și în acest aparat CS50. 381 00:20:29,530 --> 00:20:32,302 >> Audiența: Aparatul este complet interschimbabile. 382 00:20:32,302 --> 00:20:33,510 >> SPEAKER 1: Da. 383 00:20:33,510 --> 00:20:36,610 Deci, atunci un lung lung este dublu o Int. 384 00:20:36,610 --> 00:20:39,250 >> Audiența: Aceasta este pe 32 de biți? 385 00:20:39,250 --> 00:20:40,620 >> SPEAKER 1: 32 bit, da. 386 00:20:40,620 --> 00:20:43,572 >> Audiența: Deci [inaudibil]? 387 00:20:43,572 --> 00:20:46,790 >> SPEAKER 1: Da, dacă nu spune în mod explicit, te 388 00:20:46,790 --> 00:20:47,870 ar trebui să-și asume un pic 32. 389 00:20:47,870 --> 00:20:50,040 >> Audiența: S-ar spune ceva ca presupunând o 390 00:20:50,040 --> 00:20:51,498 Arhitectura ca aparatul. 391 00:20:51,498 --> 00:20:58,800 392 00:20:58,800 --> 00:21:01,710 Pentru 64 de biți, singurele lucruri pe care schimbare sunt lungi și indicii. 393 00:21:01,710 --> 00:21:05,614 Amândoi [neauzit]. 394 00:21:05,614 --> 00:21:06,590 >> SPEAKER 1: Da? 395 00:21:06,590 --> 00:21:07,566 >> Audiența: Întrebare. 396 00:21:07,566 --> 00:21:10,982 Deci, pe una din chestionare practică, se întreabă despre un unsigned int. 397 00:21:10,982 --> 00:21:15,374 Deci, cum s-ar fi stabilit că de la un int [inaudibil]? 398 00:21:15,374 --> 00:21:18,140 >> SPEAKER 1: O nesemnat este, de asemenea, în 4 octeți. 399 00:21:18,140 --> 00:21:21,172 Dar ceea ce este diferit despre un semnat int și un unsigned int? 400 00:21:21,172 --> 00:21:22,422 >> Audiența: [inaudibil]. 401 00:21:22,422 --> 00:21:24,868 402 00:21:24,868 --> 00:21:25,630 >> SPEAKER 1: Corect. 403 00:21:25,630 --> 00:21:27,570 Se poate reprezenta valori negative. 404 00:21:27,570 --> 00:21:28,580 Dar cum se face asta? 405 00:21:28,580 --> 00:21:30,536 >> Audiența: [inaudibil]. 406 00:21:30,536 --> 00:21:36,370 >> SPEAKER 1: Da, se economisește 1 biți pentru a reprezenta semnul. 407 00:21:36,370 --> 00:21:40,910 408 00:21:40,910 --> 00:21:45,040 Semnat are un pic că reprezintă semnul. 409 00:21:45,040 --> 00:21:48,886 Și nesemnat doar este tot pozitive. 410 00:21:48,886 --> 00:21:50,365 >> Audiența: OK. 411 00:21:50,365 --> 00:21:54,230 Deci spui că o dublă este două ori mai mare de un flotor? 412 00:21:54,230 --> 00:21:58,202 >> SPEAKER 1: dublu este de două ori de mărimea unui flotor, da. 413 00:21:58,202 --> 00:22:01,639 >> Audiența: Cum poate un pointer pentru o lungă lung [inaudibil]? 414 00:22:01,639 --> 00:22:06,058 415 00:22:06,058 --> 00:22:10,870 >> SPEAKER 1: Deci, întrebarea este cum se indicatorul la o long-- lung 416 00:22:10,870 --> 00:22:13,800 cum este faptul că doar patru bytes atunci când un timp lung sale de 8 bytes. 417 00:22:13,800 --> 00:22:17,310 Deci, amintiți-vă ce este un pointer, în esență, la valoarea de bază foarte. 418 00:22:17,310 --> 00:22:19,046 >> Audiența: [inaudibil]. 419 00:22:19,046 --> 00:22:22,670 >> SPEAKER 1: Da, deci un pointer este doar o locație de memorie. 420 00:22:22,670 --> 00:22:28,040 Deci, nu contează cât de mult spațiu că indicatorul este îndreptat la. 421 00:22:28,040 --> 00:22:32,060 Este nevoie doar de 4 bytes pentru a ține evidența de ce locație de memorie. 422 00:22:32,060 --> 00:22:34,760 423 00:22:34,760 --> 00:22:36,010 Orice alte întrebări? 424 00:22:36,010 --> 00:22:39,800 425 00:22:39,800 --> 00:22:41,050 Se răcește. 426 00:22:41,050 --> 00:22:42,920 427 00:22:42,920 --> 00:22:47,460 >> Deci, ultimul lucru pe care am este de ieșire standard. 428 00:22:47,460 --> 00:22:51,020 Ar trebui să le folosească în mod frecvent suficient că vă puteți aminti. 429 00:22:51,020 --> 00:22:54,800 Dar acest lucru este atunci când vom folosi printf, de exemplu. 430 00:22:54,800 --> 00:22:59,260 Și avem aceste substituenți care au fost numite coduri de format. 431 00:22:59,260 --> 00:23:03,910 >> Deci la sută c char, procente i pentru int, și putem folosi, de asemenea, procente d. 432 00:23:03,910 --> 00:23:05,130 E același lucru. 433 00:23:05,130 --> 00:23:08,200 Dar, în general, în CS50 noi încercați să utilizați la sută i. 434 00:23:08,200 --> 00:23:09,860 Procent f pentru float. 435 00:23:09,860 --> 00:23:15,620 Ld la suta pentru mult timp lung și la sută s pentru șir. 436 00:23:15,620 --> 00:23:18,550 >> În mod similar, am fost folosind câteva dintre aceste secvențe escape. 437 00:23:18,550 --> 00:23:22,431 De exemplu, backslash n pentru noua linie. 438 00:23:22,431 --> 00:23:26,910 Acest lucru este doar pentru atunci când sunteți de formatare codul pentru imprimare f. 439 00:23:26,910 --> 00:23:27,260 Da? 440 00:23:27,260 --> 00:23:28,906 >> Audienta: Care este suta d pentru? 441 00:23:28,906 --> 00:23:31,850 >> SPEAKER 1: Deci, întrebarea este ceea ce este suta d pentru? 442 00:23:31,850 --> 00:23:33,270 Procentul d este pentru int. 443 00:23:33,270 --> 00:23:37,392 Procentul d și i la sută sunt la fel. 444 00:23:37,392 --> 00:23:41,130 >> Audienta: Care este diferența dintre backslash n și backslash r? 445 00:23:41,130 --> 00:23:45,300 >> SPEAKER 1: Deci, întrebarea este ce este diferență între reacție și n 446 00:23:45,300 --> 00:23:48,615 r reacție? 447 00:23:48,615 --> 00:23:50,906 Cred că backslash r este-- 448 00:23:50,906 --> 00:23:54,340 >> Audiența: Deci backslash r implică doar se întoarce la începutul liniei 449 00:23:54,340 --> 00:23:56,670 fără de fapt de gând să o linie nouă. 450 00:23:56,670 --> 00:24:01,000 Deci, dacă imprimați o bară oblică inversă r și tu du-te înapoi la începutul liniei 451 00:24:01,000 --> 00:24:04,005 atunci când imprimați mai multe lucruri, voi suprascrie lucrurile care-i deja pe 452 00:24:04,005 --> 00:24:04,390 [Neauzit]. 453 00:24:04,390 --> 00:24:06,725 Întrucât, n fapt duce la o nouă linie și se duce la [neauzit]. 454 00:24:06,725 --> 00:24:10,525 455 00:24:10,525 --> 00:24:13,915 >> SPEAKER 1: Ei bine, orice alte întrebări? 456 00:24:13,915 --> 00:24:15,430 În regulă. 457 00:24:15,430 --> 00:24:18,617 Am de gând să-l mana off la Dan, care va continua. 458 00:24:18,617 --> 00:24:25,078 >> [Aplauze] 459 00:24:25,078 --> 00:25:08,814 460 00:25:08,814 --> 00:25:09,720 >> DAN: În regulă. 461 00:25:09,720 --> 00:25:18,590 Așa că voi vorbi despre un alt mare Gama de idei de la clasa, care sunt 462 00:25:18,590 --> 00:25:23,220 aproximativ reprezentant de doua saptamani, si începutul săptămânii trei demarare 463 00:25:23,220 --> 00:25:28,690 cu turnare, care este doar un mod de tratarea unei valori a unui anumit tip ca 464 00:25:28,690 --> 00:25:30,830 o valoare de un tip diferit. 465 00:25:30,830 --> 00:25:34,110 Deci, putem face acest lucru cu caractere de int, float la int, și 466 00:25:34,110 --> 00:25:35,360 tânjește după lungi să se dubleze. 467 00:25:35,360 --> 00:25:38,170 468 00:25:38,170 --> 00:25:44,500 >> Toate aceste lucruri pot fi utilizate ca modalități de a trata o anumită valoare numerică 469 00:25:44,500 --> 00:25:48,370 minus char ca un alt valoare numerică. 470 00:25:48,370 --> 00:25:54,480 Deci, există unele probleme cu acest lucru, de Desigur, care vine atunci când aruncat 471 00:25:54,480 --> 00:25:57,860 lucruri cum ar fi float la int. 472 00:25:57,860 --> 00:26:00,500 Deci, acest lucru este un pic ciudat. 473 00:26:00,500 --> 00:26:03,170 Avem un flotor care este 1,31. 474 00:26:03,170 --> 00:26:05,220 Am multiplica de 10.000. 475 00:26:05,220 --> 00:26:08,380 Și apoi ne-am imprima ca un întreg. 476 00:26:08,380 --> 00:26:09,630 Ce face această ieșire? 477 00:26:09,630 --> 00:26:11,600 478 00:26:11,600 --> 00:26:14,020 10.000 de ori 1,31. 479 00:26:14,020 --> 00:26:18,761 Deci 13.000, este că ghici? 480 00:26:18,761 --> 00:26:20,685 >> Audiența: Cred că e de 10.000. 481 00:26:20,685 --> 00:26:24,234 >> DAN: Deci, eu sunt o multiplicare de 10.000 înainte eu o turnare. 482 00:26:24,234 --> 00:26:25,202 >> Audiența: Oh. 483 00:26:25,202 --> 00:26:27,622 Nu ar fi existat un 9 și niște numere 0? 484 00:26:27,622 --> 00:26:29,270 >> DAN: S-ar putea avea unele cifre ciudate. 485 00:26:29,270 --> 00:26:32,410 486 00:26:32,410 --> 00:26:37,670 Deci, chiar, este de 1,3 ori mai 10000. 487 00:26:37,670 --> 00:26:40,040 Deci, asta e 13000. 488 00:26:40,040 --> 00:26:41,313 Și acest weird-- suplimentar 489 00:26:41,313 --> 00:26:42,160 >> Audiența: 13.100. 490 00:26:42,160 --> 00:26:42,650 >> DAN: 13.100. 491 00:26:42,650 --> 00:26:44,910 Mulțumesc, Rob. 492 00:26:44,910 --> 00:26:46,610 Și acest weirdness-- suplimentar 493 00:26:46,610 --> 00:26:48,060 acest 9,9-- 494 00:26:48,060 --> 00:26:53,860 este pur și simplu pentru că acest casting sfârșit de rotunjire în jos în cazul în care 495 00:26:53,860 --> 00:26:55,394 aceasta nu ar trebui să aibă. 496 00:26:55,394 --> 00:26:55,871 Da. 497 00:26:55,871 --> 00:26:58,256 >> Audiența: turnare se întâmplă după altceva? 498 00:26:58,256 --> 00:27:03,865 >> DAN: Deci, pentru ca am aceasta în print, ea face această multiplicare înainte 499 00:27:03,865 --> 00:27:05,230 face acest lucru de turnare. 500 00:27:05,230 --> 00:27:06,140 >> Audiența: [inaudibil]. 501 00:27:06,140 --> 00:27:11,350 >> DAN: Cred că ar arunca în primul rând, da, care ar fi de 10.000. 502 00:27:11,350 --> 00:27:12,610 Altceva? 503 00:27:12,610 --> 00:27:13,330 Se răcește. 504 00:27:13,330 --> 00:27:16,344 Deci, aceasta este 13099. 505 00:27:16,344 --> 00:27:17,840 De ce se întâmplă acest lucru? 506 00:27:17,840 --> 00:27:18,900 Imprecizie. 507 00:27:18,900 --> 00:27:21,020 >> Pluteste nu sunt perfecte. 508 00:27:21,020 --> 00:27:27,550 Ele pot reprezenta doar numere la un anumit număr de cifre semnificative. 509 00:27:27,550 --> 00:27:35,120 Deci, dacă ne-am imprima 8 smochine sig pe acest float, avem un fel de 510 00:27:35,120 --> 00:27:36,800 Numărul de urât caută. 511 00:27:36,800 --> 00:27:45,580 Și asta pentru că nu se poate cu exactitate 1.31 fi reprezentat prin simpla 512 00:27:45,580 --> 00:27:49,000 puteri de două în mașină. 513 00:27:49,000 --> 00:27:53,530 Deci, se termină prin a lua cel mai apropiat ghici, care se încheie până 514 00:27:53,530 --> 00:27:55,710 fiind un pic mai jos. 515 00:27:55,710 --> 00:27:57,730 A face sens? 516 00:27:57,730 --> 00:27:59,110 OK. 517 00:27:59,110 --> 00:28:05,840 >> Acum, trecut sunt un mod diferit de face declarații condiționale în cazul în care toate 518 00:28:05,840 --> 00:28:09,900 ne pasă este o singură variabilă. 519 00:28:09,900 --> 00:28:16,570 Deci, în acest exemplu particular, suntem obtinerea un număr întreg de la utilizator. 520 00:28:16,570 --> 00:28:21,070 Și apoi ne uitam la ceea ce este că întreg. 521 00:28:21,070 --> 00:28:23,500 Probabil, acesta este numărul între unu și patru. 522 00:28:23,500 --> 00:28:24,800 Asta e ceea ce ne cere. 523 00:28:24,800 --> 00:28:28,450 >> Deci, ce faci un comutator de numele variabilei. 524 00:28:28,450 --> 00:28:34,290 Apoi înființat de cazuri de posibile valorile pe care le-ar putea fi. 525 00:28:34,290 --> 00:28:37,730 Deci un caz, spun că este scăzut. 526 00:28:37,730 --> 00:28:41,080 Și apoi pauza pentru a iesi a stării comutatorului, astfel 527 00:28:41,080 --> 00:28:43,270 tu nu mergi. 528 00:28:43,270 --> 00:28:44,830 >> În case-- următor 529 00:28:44,830 --> 00:28:46,940 așa caz două și caz three-- 530 00:28:46,940 --> 00:28:51,920 dacă este cazul doi doar scade la prima linie de cod se vede ca cu 531 00:28:51,920 --> 00:28:55,400 un caz trei până se vede o pauză. 532 00:28:55,400 --> 00:29:00,430 Deci, motivul pentru care te cazul în care una la doar de imprimare redus se datorează faptului că am 533 00:29:00,430 --> 00:29:01,890 au această pauză aici. 534 00:29:01,890 --> 00:29:05,360 Dacă eu, să zicem, a ignorat acest break-- dacă am aruncat acest breakaway-- 535 00:29:05,360 --> 00:29:09,740 ar imprima scăzută, iar apoi aceasta ar imprima mijloc, și apoi s-ar rupe. 536 00:29:09,740 --> 00:29:12,200 >> Deci, pauzele sunt o parte importantă a schimba condițiile și 537 00:29:12,200 --> 00:29:14,340 acestea ar trebui să fie acolo. 538 00:29:14,340 --> 00:29:20,070 Orice cazuri care nu sunt declarate în mod explicit sunt gestionate de către implicit 539 00:29:20,070 --> 00:29:26,645 caz în comutatorul și ar trebui să fie exprimate. 540 00:29:26,645 --> 00:29:31,363 >> Audiența: Deci 1, 2, 3, și 4 ar fi n? 541 00:29:31,363 --> 00:29:33,310 >> DAN: Valorile pe care n poate fi. 542 00:29:33,310 --> 00:29:34,654 Da. 543 00:29:34,654 --> 00:29:35,146 Da? 544 00:29:35,146 --> 00:29:37,606 >> Audiența: Deci, atunci când aveți că [inaudibil]? 545 00:29:37,606 --> 00:29:44,002 546 00:29:44,002 --> 00:29:46,830 >> DAN: Ai imprimați scăzut, și apoi s-ar imprima de mijloc, și 547 00:29:46,830 --> 00:29:47,400 atunci s-ar rupe. 548 00:29:47,400 --> 00:29:50,244 >> Audiența: De ce s-ar imprima de mijloc dacă [inaudibil]? 549 00:29:50,244 --> 00:29:54,036 550 00:29:54,036 --> 00:30:00,550 >> DAN: Deci, totul sub un caz înainte de o pauză cade sub. 551 00:30:00,550 --> 00:30:09,390 Deci caz unul de imprimare este cazul sub una ca asta urma imprimare. 552 00:30:09,390 --> 00:30:09,890 Da? 553 00:30:09,890 --> 00:30:11,140 >> Audiența: [inaudibil]? 554 00:30:11,140 --> 00:30:15,890 555 00:30:15,890 --> 00:30:22,170 >> DAN: Deci, acest număr este doar un anumit Valoarea că această variabilă 556 00:30:22,170 --> 00:30:23,420 pot lua, nu? 557 00:30:23,420 --> 00:30:26,740 558 00:30:26,740 --> 00:30:28,490 Are vreun sens? 559 00:30:28,490 --> 00:30:28,990 Da. 560 00:30:28,990 --> 00:30:31,490 >> Audiența: [inaudibil]? 561 00:30:31,490 --> 00:30:34,130 >> DAN: Da, caz doi s-ar imprima de mijloc și apoi rupe. 562 00:30:34,130 --> 00:30:35,380 >> Audiența: [inaudibil]? 563 00:30:35,380 --> 00:30:37,954 564 00:30:37,954 --> 00:30:40,050 >> DAN: Cred ca orice? 565 00:30:40,050 --> 00:30:43,855 Ce alte tipuri de date poti trece peste? 566 00:30:43,855 --> 00:30:46,320 >> Audiența: se poate trece peste orice tipuri de date. 567 00:30:46,320 --> 00:30:50,905 Dar aceasta înseamnă doar ceva peste caractere și int si chestii de genul asta, pentru că 568 00:30:50,905 --> 00:30:55,600 Dacă treceți peste un pointer că nu prea are sens, 569 00:30:55,600 --> 00:30:59,555 trecerea peste sarcini, în cazul în care chiar să să faci asta, pentru că de virgulă mobilă 570 00:30:59,555 --> 00:31:02,840 în precizie, nu ar fi într-adevăr vrei sa faci asta oricum. 571 00:31:02,840 --> 00:31:07,320 Deci, destul de mult, doar int și caractere și chestii de genul asta. 572 00:31:07,320 --> 00:31:12,360 >> DAN: Da, e atunci cand ai explicită Valorile pe care le cunosc, cred, pot fi 573 00:31:12,360 --> 00:31:14,250 că un comutator este, de fapt util. 574 00:31:14,250 --> 00:31:17,094 575 00:31:17,094 --> 00:31:18,990 Bine? 576 00:31:18,990 --> 00:31:21,370 OK. 577 00:31:21,370 --> 00:31:26,180 >> Domeniul de aplicare este intervalul pe care o declară variabila se extinde. 578 00:31:26,180 --> 00:31:32,190 Deci, în acest mic bucata de cod am, ar fi plin de erori. 579 00:31:32,190 --> 00:31:41,450 Iar motivul este am declarat acest lucru int i în domeniul de aplicare a prezentei pentru buclă. 580 00:31:41,450 --> 00:31:46,390 Și apoi am încercat de referință care i în afara de faptul că pentru domeniul de aplicare buclă. 581 00:31:46,390 --> 00:31:50,330 >> Deci, practic, vă puteți gândi despre domeniul de aplicare ca ceva ce declara 582 00:31:50,330 --> 00:31:59,750 cu interiorul unui set de acolade numai există în aceste acolade. 583 00:31:59,750 --> 00:32:04,990 Și dacă încercați și de a folosi ca variabilă in afara de aceste acolade, veți 584 00:32:04,990 --> 00:32:08,356 obține o eroare de compilator. 585 00:32:08,356 --> 00:32:08,812 Da? 586 00:32:08,812 --> 00:32:09,724 >> Audiența: Deci asta nu merge? 587 00:32:09,724 --> 00:32:11,790 >> DAN: Acest lucru nu funcționează, da. 588 00:32:11,790 --> 00:32:17,190 589 00:32:17,190 --> 00:32:18,660 Strings. 590 00:32:18,660 --> 00:32:19,780 String un char *. 591 00:32:19,780 --> 00:32:22,250 Sunt exact la fel. 592 00:32:22,250 --> 00:32:25,540 Acestea sunt doar indicii pentru a caracterelor. 593 00:32:25,540 --> 00:32:33,000 Și toate siruri de caractere pe care le au trebuie să se termine cu backslash la zero, care este doar 594 00:32:33,000 --> 00:32:34,410 o convenție c. 595 00:32:34,410 --> 00:32:36,680 >> Este numit terminator nul. 596 00:32:36,680 --> 00:32:39,050 Și NULL-- 597 00:32:39,050 --> 00:32:41,670 de capital N, capitalul U, de capital L, capitalul eu-- 598 00:32:41,670 --> 00:32:44,290 nu este la fel ca Terminator NULL. 599 00:32:44,290 --> 00:32:46,640 Acesta este un pointer. 600 00:32:46,640 --> 00:32:48,280 Acesta este un personaj. 601 00:32:48,280 --> 00:32:49,530 Ei sunt foarte distincte. 602 00:32:49,530 --> 00:32:50,200 Amintiți-vă că. 603 00:32:50,200 --> 00:32:52,320 Acesta va fi pe testul, probabil. 604 00:32:52,320 --> 00:32:54,040 Nu am văzut testul. 605 00:32:54,040 --> 00:32:57,880 606 00:32:57,880 --> 00:32:58,840 Da? 607 00:32:58,840 --> 00:33:01,232 >> Audiența: Deci NULL este, să zicem, indicatorul? 608 00:33:01,232 --> 00:33:01,995 >> DAN: Da. 609 00:33:01,995 --> 00:33:05,170 >> Audiența: Ce [inaudibil]? 610 00:33:05,170 --> 00:33:10,050 >> DAN: În cazul în care, spune, malloc se numește atunci când nu are suficientă memorie pentru a obține 611 00:33:10,050 --> 00:33:14,400 indiferent de mărimea ceri, malloc va întoarce NULL. 612 00:33:14,400 --> 00:33:19,550 Este, de fapt, de fiecare dată când o funcție este Trebuia să se întoarcă un pointer, tu 613 00:33:19,550 --> 00:33:22,600 trebuie să verificați împotriva NULL deoarece NULL este un good-- destul de 614 00:33:22,600 --> 00:33:25,260 e, un fel de, valoarea gunoi. 615 00:33:25,260 --> 00:33:27,050 E un zero în ceea ce privește indicii merge. 616 00:33:27,050 --> 00:33:29,630 617 00:33:29,630 --> 00:33:32,250 >> Ori de câte ori te sun o funcție, care returnează un pointer. 618 00:33:32,250 --> 00:33:35,960 Ai de gând să doriți să verificați pentru a fi vă că indicatorul nu este NULL 619 00:33:35,960 --> 00:33:37,760 deoarece NULL este foarte comun. 620 00:33:37,760 --> 00:33:40,160 Este un fel de întoarcere gunoi. 621 00:33:40,160 --> 00:33:44,902 Deci, dacă ceva nu merge bine, doar întoarce NULL în loc. 622 00:33:44,902 --> 00:33:45,898 >> Audiența: [inaudibil]? 623 00:33:45,898 --> 00:33:48,922 >> DAN: Da, și asta e. 624 00:33:48,922 --> 00:33:51,750 >> Audiența: [inaudibil]? 625 00:33:51,750 --> 00:33:52,800 >> DAN: Spell-l ca aceasta. 626 00:33:52,800 --> 00:33:54,150 Este terminatorul NULL. 627 00:33:54,150 --> 00:33:56,560 Este minuscule N-U-L-L, dacă tu scrii cum. 628 00:33:56,560 --> 00:33:59,860 >> Audiența: Și m-am dus înapoi și testat. 629 00:33:59,860 --> 00:34:03,010 Și dacă încerci să pui o virgulă mobilă valoare într-un comutator, va țipa la tine 630 00:34:03,010 --> 00:34:05,916 spunând, declarația necesită expresie de tip întreg. 631 00:34:05,916 --> 00:34:07,166 >> DAN: Nu te duci. 632 00:34:07,166 --> 00:34:09,639 633 00:34:09,639 --> 00:34:12,246 Dar da, care a fost din nou întrebarea? 634 00:34:12,246 --> 00:34:13,496 >> Audiența: [inaudibil]? 635 00:34:13,496 --> 00:34:16,150 636 00:34:16,150 --> 00:34:23,679 >> DAN: Deci de capital N, capitalul U, de capital L, capitalul L este un lucru real c. 637 00:34:23,679 --> 00:34:29,719 Acesta este indicatorul NULL și va fi tratate ca atare. 638 00:34:29,719 --> 00:34:33,530 Nu vei încerca vreodată și vraja Caracter NULL și vedea orice 639 00:34:33,530 --> 00:34:35,630 alt mod decât aceasta. 640 00:34:35,630 --> 00:34:36,610 Da? 641 00:34:36,610 --> 00:34:42,490 >> Audiența: Deci, revenind la char max sau ceva în note, ar fi o 642 00:34:42,490 --> 00:34:43,960 întruchipează aceeași funcție ca [inaudibil]? 643 00:34:43,960 --> 00:34:50,655 644 00:34:50,655 --> 00:34:54,949 >> Audiența: Deci, vă referiți la revenind char max de getchar, sau 645 00:34:54,949 --> 00:34:55,444 oricare ar fi ea? 646 00:34:55,444 --> 00:34:55,940 >> Audiența: Da. 647 00:34:55,940 --> 00:34:58,620 >> Audiența: Da, așa generalul pe termen lung pentru toate aceste lucruri 648 00:34:58,620 --> 00:34:59,920 sunt valori santinelă. 649 00:34:59,920 --> 00:35:03,640 Deci, cum ar fi revenirea int max de getint și char max de getchar, este 650 00:35:03,640 --> 00:35:06,010 ar trebui să fie ca, bine, dacă aceste lucruri se întorc la noi, 651 00:35:06,010 --> 00:35:07,210 ceva a mers prost. 652 00:35:07,210 --> 00:35:09,950 >> Pentru indicii, doar se întâmplă să avem această valoare santinelă care toată lumea 653 00:35:09,950 --> 00:35:10,750 este de acord. 654 00:35:10,750 --> 00:35:13,210 Și acesta este un lucru vă întoarceți atunci când lucrurile nu merg bine. 655 00:35:13,210 --> 00:35:15,910 Deci, char max este ceea ce suntem cu ajutorul pentru a reprezenta ceva 656 00:35:15,910 --> 00:35:18,100 cum ar fi NULL sau getchar. 657 00:35:18,100 --> 00:35:23,420 >> Audiența: Deci, dacă sunteți de testare getchar, doar ai putea pune NULL? 658 00:35:23,420 --> 00:35:23,910 Ar face o diferență? 659 00:35:23,910 --> 00:35:25,400 >> DAN: Nu puteai doar verifica NULL. 660 00:35:25,400 --> 00:35:30,130 Ar trebui să verificați char max deoarece valoarea returnata de functia este 661 00:35:30,130 --> 00:35:35,416 un personaj nu un pointer. 662 00:35:35,416 --> 00:35:35,888 Da? 663 00:35:35,888 --> 00:35:38,248 >> Audiența: Această întrebare cere pentru lungimea șir. 664 00:35:38,248 --> 00:35:40,136 Asta include caracterul NULL? 665 00:35:40,136 --> 00:35:41,000 >> DAN: Nu 666 00:35:41,000 --> 00:35:45,930 Și asta e de fapt modul în care lungimea șirului știe să se oprească pentru că trece prin 667 00:35:45,930 --> 00:35:49,070 matrice dvs. de caractere până se vede un caracter NULL. 668 00:35:49,070 --> 00:35:51,030 Și atunci e ca si cum, tot Bine, am terminat. 669 00:35:51,030 --> 00:35:52,130 >> Audiența: [inaudibil] cinci? 670 00:35:52,130 --> 00:35:53,990 >> DAN: Buna ziua ar fi cinci. 671 00:35:53,990 --> 00:35:55,240 Da. 672 00:35:55,240 --> 00:35:59,580 673 00:35:59,580 --> 00:36:02,880 Deci, matrice sunt continue blocuri de memorie. 674 00:36:02,880 --> 00:36:08,480 Ei au acces instant prin a spune numele de matrice și apoi, în creț 675 00:36:08,480 --> 00:36:16,720 bretele, indiferent de index vrei să mergi a, acestea sunt indexate de la zero, prin 676 00:36:16,720 --> 00:36:20,100 lungimea matrice minus 1. 677 00:36:20,100 --> 00:36:23,070 >> Și acestea sunt declarate de tipul de lucru pe care tu stocarea în 678 00:36:23,070 --> 00:36:29,750 matrice, numele de matrice, și apoi indiferent de dimensiunea este de care matrice. 679 00:36:29,750 --> 00:36:36,660 Deci, aceasta este o matrice char de lungime șase care are aceste valori. 680 00:36:36,660 --> 00:36:42,050 681 00:36:42,050 --> 00:36:42,700 Da? 682 00:36:42,700 --> 00:36:43,950 >> Audiența: [inaudibil]? 683 00:36:43,950 --> 00:36:47,980 684 00:36:47,980 --> 00:36:48,460 >> DAN: Da. 685 00:36:48,460 --> 00:36:51,340 >> Audiența: [inaudibil]? 686 00:36:51,340 --> 00:36:56,700 >> DAN: Dacă aveți ceea ce se întâmplă în tabloul deja făcut. 687 00:36:56,700 --> 00:37:02,260 Deci, ai putea specifica acest lucru în schimb ca, să zicem, char, oricare ar fi numele tău 688 00:37:02,260 --> 00:37:12,200 matrice este, paranteze goale este egal cu buclat bretele H virgulă E virgulă L virgulă L virgulă 689 00:37:12,200 --> 00:37:16,290 O virgulă caracter NULL și acoladă. 690 00:37:16,290 --> 00:37:18,180 Asta ar lucra, de asemenea, ca o declarație. 691 00:37:18,180 --> 00:37:20,886 >> Audiența: [inaudibil]? 692 00:37:20,886 --> 00:37:23,110 >> DAN: Apoi, trebuie să aveți dimensiunea deja făcut. 693 00:37:23,110 --> 00:37:23,896 >> Audiența: [inaudibil]? 694 00:37:23,896 --> 00:37:25,146 >> DAN: Da. 695 00:37:25,146 --> 00:37:30,114 696 00:37:30,114 --> 00:37:32,420 În regulă. 697 00:37:32,420 --> 00:37:36,430 Argumente în linia de comandă sunt o modalitate de obtinerea de intrare de la utilizator ca 698 00:37:36,430 --> 00:37:39,380 argumente principale. 699 00:37:39,380 --> 00:37:40,600 Principal are două argumente. 700 00:37:40,600 --> 00:37:47,680 Numărul de argumente care este în curs de a trecut de-a lungul liniei de comandă și un 701 00:37:47,680 --> 00:37:55,340 vector șir sau un tablou șir de toate argumentele. 702 00:37:55,340 --> 00:38:07,840 >> Deci, dacă eu, să zicem, denumit o funcție, cum ar fi un punct în spațiu 1, 2 spațiu, trei, 703 00:38:07,840 --> 00:38:10,110 argc ar fi 4. 704 00:38:10,110 --> 00:38:17,370 Și argv 0 ar fi un punct afară. 705 00:38:17,370 --> 00:38:19,130 Argv1 ar fi 1. 706 00:38:19,130 --> 00:38:23,030 argv2 ar fi 2 argv3 ar fi 3, în care caz particular. 707 00:38:23,030 --> 00:38:23,310 Da? 708 00:38:23,310 --> 00:38:25,400 >> Audiența: [inaudibil]? 709 00:38:25,400 --> 00:38:34,010 >> DAN: Ultimul element în matrice deoarece matricea este de lungime argc plus 710 00:38:34,010 --> 00:38:41,050 unul dintre ARGB, ultimul element este indicatorul NULL. 711 00:38:41,050 --> 00:38:42,580 Este argc plus 1. 712 00:38:42,580 --> 00:38:46,210 713 00:38:46,210 --> 00:38:52,150 Deci, în cazul în care tocmai am spus, ar fi argv 0 este un punct afară. 714 00:38:52,150 --> 00:38:56,330 argv 1 este 1 argv2 este 2 argv 3 este 3. 715 00:38:56,330 --> 00:39:03,490 argv 4, care este unul mai mare decât argc ar fi NULL. 716 00:39:03,490 --> 00:39:04,870 >> Și asta e pointer nul. 717 00:39:04,870 --> 00:39:06,590 Da. 718 00:39:06,590 --> 00:39:11,250 Si asta pentru ca șir este o stea char este un pointer. 719 00:39:11,250 --> 00:39:14,102 Deci trebuie să fie de același tip. 720 00:39:14,102 --> 00:39:14,595 Da? 721 00:39:14,595 --> 00:39:16,074 >> Audiența: Două întrebări. 722 00:39:16,074 --> 00:39:21,004 Deci unul, care-i diferența dintre aceasta și alte mult de un tip getString 723 00:39:21,004 --> 00:39:22,483 în motorul de utilizator? 724 00:39:22,483 --> 00:39:25,934 Și doi, este stocată în memoria recenta? 725 00:39:25,934 --> 00:39:28,399 Deci cum ar fi, getString ar fi [inaudibil]? 726 00:39:28,399 --> 00:39:31,357 727 00:39:31,357 --> 00:39:33,650 >> DAN: În cazul în care este stocată? 728 00:39:33,650 --> 00:39:34,905 Nu știu unde este stocat. 729 00:39:34,905 --> 00:39:40,000 >> Audiența: Deci, de fapt, tu știi cât de orice funcționeze te sun e argumente 730 00:39:40,000 --> 00:39:42,170 sunt stocate în stivă? 731 00:39:42,170 --> 00:39:46,610 Deci, argc și argv sunt argumente pentru principal și ele sunt în stivă, sau chiar 732 00:39:46,610 --> 00:39:49,131 chiar mai sus ce crezi ca începutul stivei. 733 00:39:49,131 --> 00:39:53,490 Ce a fost pe de altă parte se pune problema? 734 00:39:53,490 --> 00:39:56,821 >> Audiența: Deci, care este [neauzit]? 735 00:39:56,821 --> 00:40:00,990 >> DAN: Da, e doar un mod diferit de a obține de intrare de la utilizator. 736 00:40:00,990 --> 00:40:06,030 Puțin mai eficient și asta e este mai util pentru scripturi pentru că 737 00:40:06,030 --> 00:40:10,070 poate trece doar argumente pentru dvs. principal funcție mai degrabă decât a fi nevoie să aștepte 738 00:40:10,070 --> 00:40:13,400 pentru utilizatorii dacă nu aveți nici utilizatori. 739 00:40:13,400 --> 00:40:16,280 >> Audiența: Și da, te siruri de caractere ar fi [neauzit]. 740 00:40:16,280 --> 00:40:17,922 S-ar stoca lucrurile care aveți nevoie. 741 00:40:17,922 --> 00:40:18,834 >> DAN: Da? 742 00:40:18,834 --> 00:40:21,114 >> Audiența: [inaudibil]? 743 00:40:21,114 --> 00:40:27,545 >> DAN: Da, argv 0 include întotdeauna punct slash de apelul funcției. 744 00:40:27,545 --> 00:40:28,042 Da? 745 00:40:28,042 --> 00:40:29,292 >> Audiența: [inaudibil]? 746 00:40:29,292 --> 00:40:33,509 747 00:40:33,509 --> 00:40:37,310 >> DAN: Da, fiecare dintre argumentele sunt încheiat în caracter NULL, deoarece acestea 748 00:40:37,310 --> 00:40:38,310 sunt siruri de caractere. 749 00:40:38,310 --> 00:40:40,892 >> Audiența: [inaudibil]? 750 00:40:40,892 --> 00:40:44,116 >> DAN: Da, argv argc este un pointer NULL. 751 00:40:44,116 --> 00:40:45,112 >> Audiența: [inaudibil]? 752 00:40:45,112 --> 00:40:47,104 >> DAN: Oh, da. 753 00:40:47,104 --> 00:40:48,100 Da, îmi pare rău. 754 00:40:48,100 --> 00:40:49,594 >> Audiența: Deci [inaudibil]? 755 00:40:49,594 --> 00:41:08,518 756 00:41:08,518 --> 00:41:16,340 >> DAN: Deci, întrebarea este dacă ați avut linie de comandă punct slash un punct din 1, 2, 757 00:41:16,340 --> 00:41:20,410 ar fi numărul de linie de comandă argumente fi două sau ar fi trei? 758 00:41:20,410 --> 00:41:24,420 759 00:41:24,420 --> 00:41:28,240 >> Audiența: Cred că nu într-adevăr contează. 760 00:41:28,240 --> 00:41:31,370 Am tendința de a spune, oh, nu a trecut orice argumente în linia de comandă atunci când, 761 00:41:31,370 --> 00:41:32,730 evident, ai sunat funcția. 762 00:41:32,730 --> 00:41:37,950 Așa că am tendința de a exclude vocal funcție de linia de comandă 763 00:41:37,950 --> 00:41:40,350 argumente, chiar dacă este incluse în argv. 764 00:41:40,350 --> 00:41:42,600 >> DAN: Dar dacă ar fi fost pe test-- 765 00:41:42,600 --> 00:41:46,550 Da-- și, de asemenea, dacă vă spune ceva ca argc este egal cu 3, 766 00:41:46,550 --> 00:41:48,512 tu ești în picioare în siguranță. 767 00:41:48,512 --> 00:41:49,416 Da? 768 00:41:49,416 --> 00:41:50,666 >> Audiența: [inaudibil]? 769 00:41:50,666 --> 00:42:00,990 770 00:42:00,990 --> 00:42:09,510 >> DAN: Cred că dacă în loc de asteptare acest în argc și argv șir paranteze 771 00:42:09,510 --> 00:42:14,350 dar a păstrat aceleași tipuri și tocmai a sunat le ceva diferit ca o 772 00:42:14,350 --> 00:42:16,640 și b, ar mai merge? 773 00:42:16,640 --> 00:42:18,790 Și ar funcționa în continuare, v-ar doar-- 774 00:42:18,790 --> 00:42:21,520 în loc de a folosi argc-- v-ar folosi o și b. 775 00:42:21,520 --> 00:42:24,436 776 00:42:24,436 --> 00:42:25,408 Da? 777 00:42:25,408 --> 00:42:26,658 >> Audiența: [inaudibil]? 778 00:42:26,658 --> 00:42:34,642 779 00:42:34,642 --> 00:42:38,850 >> DAN: Deci, întrebarea este getString este va stoca memorie în memoria heap 780 00:42:38,850 --> 00:42:42,280 pentru că getString este char *. 781 00:42:42,280 --> 00:42:47,530 Se stochează memorie în heap, deoarece invită acum malloc în real 782 00:42:47,530 --> 00:42:49,258 punerea în aplicare a getString. 783 00:42:49,258 --> 00:42:53,210 784 00:42:53,210 --> 00:42:55,090 OK, se deplasează pe. 785 00:42:55,090 --> 00:42:55,950 >> Securitate. 786 00:42:55,950 --> 00:43:01,090 Deci, pentru a fi cu adevărat sigur, te bazezi pe nici o una și voi permite nici un acces la orice 787 00:43:01,090 --> 00:43:04,540 a informațiilor, care este motivul pentru care toată lumea construiește propriile mașini, 788 00:43:04,540 --> 00:43:09,580 propriile sisteme de operare, toate lor Programele de la zero, și, evident, 789 00:43:09,580 --> 00:43:13,410 Nu conectați la alte masini prin intermediul internetului. 790 00:43:13,410 --> 00:43:17,350 Deci, calculatoarele sunt nesigure. 791 00:43:17,350 --> 00:43:19,200 Ele sunt într-adevăr. 792 00:43:19,200 --> 00:43:20,940 Trebuie să avem încredere altor persoane. 793 00:43:20,940 --> 00:43:26,500 >> Iar ideea de securitate este că ești încercarea de a limita cantitatea de 794 00:43:26,500 --> 00:43:27,540 încredere de care aveți nevoie. 795 00:43:27,540 --> 00:43:32,080 Și unul dintre mijloacele să faci asta este prin criptografie. 796 00:43:32,080 --> 00:43:34,950 Criptografia este, în esență, avem secrete. 797 00:43:34,950 --> 00:43:38,880 >> Uneori trebuie să treacă secretele noastre de-a lungul prin, să zicem, pe internet sau 798 00:43:38,880 --> 00:43:39,980 alte lucruri. 799 00:43:39,980 --> 00:43:43,180 Și nu vrem oameni să cunoască aceste secrete. 800 00:43:43,180 --> 00:43:50,100 Așa că ne-am cripta secretele noastre într-un mod care sperăm că nimeni nu poate da seama. 801 00:43:50,100 --> 00:43:51,600 >> Așa că am used-- 802 00:43:51,600 --> 00:43:54,340 prin cursul acestei class-- 803 00:43:54,340 --> 00:44:00,750 lucruri cum ar fi Cezar cifru și [Inaudibil], care sunt amândoi foarte, foarte 804 00:44:00,750 --> 00:44:03,200 metode nesigure de criptare lucruri. 805 00:44:03,200 --> 00:44:07,930 Sunt ușor să dau seama ce se sunt și secretele tale. 806 00:44:07,930 --> 00:44:12,130 Lumea reală utilizează mult mai mult scheme de criptare complicate. 807 00:44:12,130 --> 00:44:13,880 Și nu vom intra în mult mai mult decât atât. 808 00:44:13,880 --> 00:44:18,280 809 00:44:18,280 --> 00:44:19,430 >> Depanare. 810 00:44:19,430 --> 00:44:20,785 GDB este cel mai bun. 811 00:44:20,785 --> 00:44:24,014 812 00:44:24,014 --> 00:44:25,810 Am de gând să sublinieze acest lucru din nou. 813 00:44:25,810 --> 00:44:30,920 Utilizați GDB tot timpul fiecare timp aveți o problemă. 814 00:44:30,920 --> 00:44:36,030 Comenzile care sunt utile în GDB sunt rupe, ceea ce treci, fie o linie 815 00:44:36,030 --> 00:44:41,330 număr, un nume de funcție, în esență, în cazul în care în codul pe care doriți să se oprească, 816 00:44:41,330 --> 00:44:45,600 și să fie capabil să preia controlul. 817 00:44:45,600 --> 00:44:54,140 >> Print ia o variabilă și tipărește indiferent de faptul că variabila este la faptul că 818 00:44:54,140 --> 00:44:55,990 punct în execuție ta. 819 00:44:55,990 --> 00:45:00,130 Înainte mișcă execuție ta de-a lungul cu un pas. 820 00:45:00,130 --> 00:45:05,050 Și pas pași în interiorul unei funcții în execuție ta. 821 00:45:05,050 --> 00:45:10,480 >> Alte lucruri sunt rulate, care este modul în care executați de fapt codul. 822 00:45:10,480 --> 00:45:16,630 Continuați ia toate măsurile necesare pentru a ajunge la următorul punct de spargere. 823 00:45:16,630 --> 00:45:18,300 Și acolo sunt multe, multe altele. 824 00:45:18,300 --> 00:45:19,040 Uite-le. 825 00:45:19,040 --> 00:45:19,901 Sunt mare. 826 00:45:19,901 --> 00:45:20,863 Da? 827 00:45:20,863 --> 00:45:22,113 >> Audiența: [inaudibil]? 828 00:45:22,113 --> 00:45:26,635 829 00:45:26,635 --> 00:45:28,200 >> DAN: Da, care este un program de depanare. 830 00:45:28,200 --> 00:45:34,230 Deci, un debugger este un program care vă permite să depanare programul tău. 831 00:45:34,230 --> 00:45:39,931 Nu este un program care găsește bug-uri pentru te, deși asta ar fi grozav. 832 00:45:39,931 --> 00:45:43,020 833 00:45:43,020 --> 00:45:46,040 >> Și nu în ultimul pentru mine este de căutare. 834 00:45:46,040 --> 00:45:51,470 Deci, tipurile de căutare care am vorbit despre în această clasă sunt căutare liniară, 835 00:45:51,470 --> 00:45:55,960 care este doar că te uiți prin fiecare element al spațiului de căutare, una 836 00:45:55,960 --> 00:46:00,410 element de la un moment dat, până când găsiți ceea ce sunteți în căutarea pentru sau până când ajunge 837 00:46:00,410 --> 00:46:03,350 la sfârșitul anului spațiu de căutare la care punctul spui că nu ai putut găsi 838 00:46:03,350 --> 00:46:06,360 elementul pe care îl căutați. 839 00:46:06,360 --> 00:46:13,450 Și acest lucru este nevoie de timp, la cel mai bun constantă, care este 0 din 1 și cel mai rău caz liniar 840 00:46:13,450 --> 00:46:16,070 timp, care este de n 0. 841 00:46:16,070 --> 00:46:19,250 >> Binar de căutare, care are nevoie de elemente sordide. 842 00:46:19,250 --> 00:46:24,230 Te duci la mijlocul elemente tale, vedea dacă elementul sunteți în căutarea pentru 843 00:46:24,230 --> 00:46:30,120 este mai mare sau mai mic decât elementul că tu ești la mijloc. 844 00:46:30,120 --> 00:46:36,510 Este e mai mare, vă spun că în partea de jos de căutare spațiul este ta 845 00:46:36,510 --> 00:46:41,550 locația curentă, la mijloc, și repornirea procesului. 846 00:46:41,550 --> 00:46:46,150 Dacă este mai mic, te uiti spune că Cel-- da, care-i treaba? 847 00:46:46,150 --> 00:46:47,400 >> Audiența: [inaudibil]? 848 00:46:47,400 --> 00:46:51,000 849 00:46:51,000 --> 00:46:54,260 >> DAN: Da. 850 00:46:54,260 --> 00:46:58,360 Orice fel de fel care a fost predat în clasa este un joc cinstit pentru testul. 851 00:46:58,360 --> 00:47:01,504 852 00:47:01,504 --> 00:47:04,920 >> [Râsete] 853 00:47:04,920 --> 00:47:10,260 >> DAN: Și faptul că nu au avut să facă acest lucru pentru un set de probleme, este corect 854 00:47:10,260 --> 00:47:12,420 joc pentru testul. 855 00:47:12,420 --> 00:47:15,186 >> Audiența: Putem trece peste asta cum sa-- 856 00:47:15,186 --> 00:47:17,052 >> DAN: Acesta va fi trecut peste. 857 00:47:17,052 --> 00:47:20,496 >> SPEAKER 2: codul actual de [Inaudibil] este pe study.cs50.net. 858 00:47:20,496 --> 00:47:25,910 859 00:47:25,910 --> 00:47:32,680 Deci, dacă te uiți la problema practică în pagina de îmbinare fel de 860 00:47:32,680 --> 00:47:35,880 study.cs50.net, există codul pentru punerea în aplicare a fuziona fel. 861 00:47:35,880 --> 00:47:38,550 Deci, nu trebuie să pună în aplicare el singur în seara asta. 862 00:47:38,550 --> 00:47:42,090 Dar asigurați-vă că înțelegeți destul de decât doar memorarea. 863 00:47:42,090 --> 00:47:45,035 >> Audiența: [inaudibil]? 864 00:47:45,035 --> 00:47:49,720 >> SPEAKER 2: Pagina de îmbinare fel pe study.cs50.net, există o practică 865 00:47:49,720 --> 00:47:53,570 problema că, dacă faceți clic prin intermediul problemă, chiar la sfârșitul există o 866 00:47:53,570 --> 00:47:56,280 soluție, care este reprezentată de fuziunea implementarea fel. 867 00:47:56,280 --> 00:47:58,510 Dar asigurați-vă că înțelegeți mai degrabă decât doar o memorare 868 00:47:58,510 --> 00:47:59,760 sau copierea jos. 869 00:47:59,760 --> 00:48:02,870 870 00:48:02,870 --> 00:48:06,340 >> Audiența: Și o perfect valabil problemă pentru examenul ar fi 871 00:48:06,340 --> 00:48:07,990 ceva de genul aici o listă. 872 00:48:07,990 --> 00:48:12,100 Ce această listă arăta după un pas de selecții fel sau 873 00:48:12,100 --> 00:48:13,330 un fel de introducere sau orice altceva. 874 00:48:13,330 --> 00:48:14,940 O iterație completă a listei. 875 00:48:14,940 --> 00:48:18,530 Deci, chiar dacă nu ajung a fi nevoie să cod pentru el, trebuie să-l înțeleagă 876 00:48:18,530 --> 00:48:20,440 suficient pentru a ști cum se întâmplă pentru a se modifica această matrice. 877 00:48:20,440 --> 00:48:24,144 878 00:48:24,144 --> 00:48:25,394 >> DAN: Asta e pentru mine. 879 00:48:25,394 --> 00:48:30,604 880 00:48:30,604 --> 00:48:32,588 >> [Aplauze] 881 00:48:32,588 --> 00:49:06,316 882 00:49:06,316 --> 00:49:07,410 >> LUCAS: Salut tuturor. 883 00:49:07,410 --> 00:49:08,390 Numele meu este Lucas. 884 00:49:08,390 --> 00:49:16,840 Am de gând să vorbesc despre recursivitate, toate soiurile pe care le-am învățat, și un 885 00:49:16,840 --> 00:49:18,050 pic de toate indicii. 886 00:49:18,050 --> 00:49:18,740 OK? 887 00:49:18,740 --> 00:49:20,340 Deci, în primul rând, recursivitate. 888 00:49:20,340 --> 00:49:22,951 Ce înseamnă să spun că o funcție este recursivă? 889 00:49:22,951 --> 00:49:24,675 >> Audiența: se solicită. 890 00:49:24,675 --> 00:49:26,500 >> LUCAS: OK, se cheamă, da. 891 00:49:26,500 --> 00:49:27,700 Deci mult de această imagine, de exemplu. 892 00:49:27,700 --> 00:49:30,280 E ca si cum imaginea interior de o imagine și așa mai departe. 893 00:49:30,280 --> 00:49:35,740 Deci, de exemplu, puteți avem-- ca Dan că a fost vorba despre binar de căutare. 894 00:49:35,740 --> 00:49:41,840 O modalitate în care binar de căutare este recursiv este faptul că tu ești 895 00:49:41,840 --> 00:49:43,130 încercarea de a găsi un număr. 896 00:49:43,130 --> 00:49:44,250 Deci, te duci la mijloc. 897 00:49:44,250 --> 00:49:47,130 Și apoi verificați dacă numerele de acolo în stânga și în dreapta. 898 00:49:47,130 --> 00:49:49,650 >> Și apoi, dacă afli numărul este va fi pe stânga, e la fel 899 00:49:49,650 --> 00:49:53,340 lucru ca a face căutarea din nou, dar doar pe partea stângă a listei. 900 00:49:53,340 --> 00:49:57,350 Deci așa sună ca e recursiv. 901 00:49:57,350 --> 00:50:01,870 De aceea voi avea recursiv soluție pentru îmbinare fel. 902 00:50:01,870 --> 00:50:04,270 >> OK, deci aici este un exemplu. 903 00:50:04,270 --> 00:50:07,280 Să zicem că vreau să aleagă toate numerele de la 1 la n. 904 00:50:07,280 --> 00:50:13,790 Pot să dau seama că suma de n număr este n plus n minus 1 pana la 1. 905 00:50:13,790 --> 00:50:17,810 Dar, apoi, dacă mă uit la n minus 1 plus n minus 2 plus 1, care e la fel 906 00:50:17,810 --> 00:50:20,680 lucru ca numere însumând până la n minus 1. 907 00:50:20,680 --> 00:50:25,890 Deci, eu pot spune suma de o sumă egală cu este egal cu n plus suma n minus 1. 908 00:50:25,890 --> 00:50:28,010 Are vreun sens? 909 00:50:28,010 --> 00:50:32,630 >> Și eu, de asemenea, ar fi altceva denumit cazul de bază, și anume că 910 00:50:32,630 --> 00:50:37,440 suma numerelor până la zero ar fi zero. 911 00:50:37,440 --> 00:50:42,770 Deci, de îndată ce ajung la numărul la zero, am opri numărare. 912 00:50:42,770 --> 00:50:45,330 Are vreun sens? 913 00:50:45,330 --> 00:50:48,120 >> Deci, aici e un exemplu de cum Pot pune în aplicare acest lucru. 914 00:50:48,120 --> 00:50:49,860 Așa că am această funcție în unele. 915 00:50:49,860 --> 00:50:51,700 Aceasta are un număr întreg n. 916 00:50:51,700 --> 00:50:56,300 Deci, aici am verificați mai întâi dacă n este mai puțin sau egal cu zero. 917 00:50:56,300 --> 00:51:00,310 Deci, dacă este mai mică sau egală cu zero, am a reveni la zero, ceea ce este cazul nostru de bază. 918 00:51:00,310 --> 00:51:05,690 În caz contrar, mă pot întoarce doar n plus suma numerelor din 919 00:51:05,690 --> 00:51:07,190 una la n minus unu. 920 00:51:07,190 --> 00:51:09,360 A face sens? 921 00:51:09,360 --> 00:51:10,100 OK. 922 00:51:10,100 --> 00:51:11,610 >> Deci, aici e ceea ce pare. 923 00:51:11,610 --> 00:51:15,260 Ai sumă de 2 egali 2 plus suma de 1. 924 00:51:15,260 --> 00:51:18,930 Iar unii din 1 este 1 plus sumă de 0, care este 0. 925 00:51:18,930 --> 00:51:20,216 A face sens? 926 00:51:20,216 --> 00:51:25,342 Deci, dacă ne uităm la stiva de dvs. Programul, aceasta este ceea ce pare. 927 00:51:25,342 --> 00:51:26,820 >> În primul rând, avem funcția principală. 928 00:51:26,820 --> 00:51:30,320 Și apoi funcția principală numit sumă 2. 929 00:51:30,320 --> 00:51:36,690 Și apoi suma 2 se va spune, oh, suma 2 este egal cu 2, plus suma una. 930 00:51:36,690 --> 00:51:39,460 Așa că am adăuga suma de 1 la stiva. 931 00:51:39,460 --> 00:51:43,860 Și suma de 1 se va numi suma de 0, care este, de asemenea, va fi adăugată 932 00:51:43,860 --> 00:51:44,630 în stivă. 933 00:51:44,630 --> 00:51:49,240 Și apoi fiecare dintre acestia, care sunt peste alta trebuie să se întoarcă 934 00:51:49,240 --> 00:51:52,020 înainte de celelalte pot continua. 935 00:51:52,020 --> 00:51:56,240 >> Deci, de exemplu, aici, suma de 0, În primul rând, este de gând să se întoarcă la 0. 936 00:51:56,240 --> 00:51:58,320 Și apoi alege suma de 1. 937 00:51:58,320 --> 00:52:00,850 Apoi, suma de 1 se va a reveni de la 1 la sumei de 2. 938 00:52:00,850 --> 00:52:03,900 Și, în cele din urmă, suma de 2 se va pentru a reveni la 3 principal. 939 00:52:03,900 --> 00:52:05,320 Are vreun sens? 940 00:52:05,320 --> 00:52:09,496 >> Este foarte important să se înțeleagă modul în care stiva este de lucru și să încerce să 941 00:52:09,496 --> 00:52:11,980 a se vedea dacă are sens. 942 00:52:11,980 --> 00:52:13,260 OK, deci de sortare. 943 00:52:13,260 --> 00:52:16,170 Deci, de ce este importantă sortarea, în primul rând? 944 00:52:16,170 --> 00:52:18,260 De ce ar trebui să ne pese? 945 00:52:18,260 --> 00:52:20,310 Oricine? 946 00:52:20,310 --> 00:52:20,695 Dă-mi un exemplu? 947 00:52:20,695 --> 00:52:21,040 Da? 948 00:52:21,040 --> 00:52:22,968 >> Audiența: [inaudibil]. 949 00:52:22,968 --> 00:52:24,700 >> LUCAS: Da, OK. 950 00:52:24,700 --> 00:52:26,090 Astfel, puteți căuta mai eficient. 951 00:52:26,090 --> 00:52:28,580 Asta e un mod bun. 952 00:52:28,580 --> 00:52:32,462 Deci, de exemplu, avem o mulțime de lucruri, de fapt, în viața noastră, care 953 00:52:32,462 --> 00:52:32,920 sunt clasificate în funcție. 954 00:52:32,920 --> 00:52:34,830 De exemplu, dicționare. 955 00:52:34,830 --> 00:52:39,210 >> Este foarte important să ai toate cuvinte în vreun fel de ordine pe care le 956 00:52:39,210 --> 00:52:41,970 pot accesa cu ușurință. 957 00:52:41,970 --> 00:52:43,280 Deci, asta e ceea ce spunea. 958 00:52:43,280 --> 00:52:45,530 Puteți căuta mai eficient. 959 00:52:45,530 --> 00:52:48,740 Gândiți-vă cât de greu ar fi să avem o dicționar în care cuvintele sunt în 960 00:52:48,740 --> 00:52:49,500 ordine aleatorie. 961 00:52:49,500 --> 00:52:53,120 Va trebui să se uite la, destul de mult, fiecare cuvânt până când găsiți 962 00:52:53,120 --> 00:52:54,720 cuvânt că sunteți în căutarea pentru. 963 00:52:54,720 --> 00:52:58,710 >> Dacă sunteți folosind Facebook, de asemenea, atunci când te uiți la prietenii tăi, tu ești 964 00:52:58,710 --> 00:53:03,540 O să vezi că Facebook a pus tău prieten apropiat este pe partea de sus a celor 965 00:53:03,540 --> 00:53:05,470 că tu nu vorbești cu atât de mult. 966 00:53:05,470 --> 00:53:08,080 Dacă merge tot drumul la partea de jos a lista ta de prieteni, veti vedea 967 00:53:08,080 --> 00:53:11,250 oameni care, probabil, nici nu amintiți-vă că sunteți prieteni cu. 968 00:53:11,250 --> 00:53:14,590 Și asta pentru că felul Facebook prietenii bazate pe modul în care 969 00:53:14,590 --> 00:53:16,472 de aproape ești de ele. 970 00:53:16,472 --> 00:53:17,930 >> Deci, organizarea datelor. 971 00:53:17,930 --> 00:53:18,450 De asemenea, Pokemon. 972 00:53:18,450 --> 00:53:21,400 Deci, vedeți că toate pokemoni au numere. 973 00:53:21,400 --> 00:53:27,210 Și asta e ca un simplu mod de accesare a datelor. 974 00:53:27,210 --> 00:53:29,050 >> Audiența: Accesarea Pokemon. 975 00:53:29,050 --> 00:53:29,890 >> LUCAS: Da. 976 00:53:29,890 --> 00:53:32,395 >> Audiența: [inaudibil]. 977 00:53:32,395 --> 00:53:33,460 >> LUCAS: Da. 978 00:53:33,460 --> 00:53:35,140 OK, deci un fel de selecție. 979 00:53:35,140 --> 00:53:41,610 Un fel de selecție se va selecta cea mai mică valoare a unei liste nesortate fiecare 980 00:53:41,610 --> 00:53:43,300 timp în fiecare iterație. 981 00:53:43,300 --> 00:53:46,800 E un fel de genul pe care le faci în capul tău atunci când sunteți încercarea de a 982 00:53:46,800 --> 00:53:48,430 sorta o listă pe mână. 983 00:53:48,430 --> 00:53:51,990 >> Practic, tot ce faci este arăți pentru cel mai mic număr. 984 00:53:51,990 --> 00:53:54,280 Ai pus-o în lista sortată. 985 00:53:54,280 --> 00:53:56,230 Și apoi te uiți pentru următor cel mai mic număr. 986 00:53:56,230 --> 00:54:00,080 Și atunci când continui să faci care și așa mai departe. 987 00:54:00,080 --> 00:54:04,600 >> Deci selecție fel este, în principiu tu selectați de fiecare dată cel mai mic 988 00:54:04,600 --> 00:54:05,750 valoare nesortate. 989 00:54:05,750 --> 00:54:10,840 Pune la sfârșitul sortate parte din lista. 990 00:54:10,840 --> 00:54:12,370 Și continui să faci asta. 991 00:54:12,370 --> 00:54:15,890 Deci, haideți să vedem rapid ce acest lucru arata ca. 992 00:54:15,890 --> 00:54:19,340 Deci, aici e sortate și lista nesortate. 993 00:54:19,340 --> 00:54:23,350 >> Deci, pentru extrase din lista, este inițial gol. 994 00:54:23,350 --> 00:54:26,760 Și apoi am de gând pentru a selecta mai mic număr aici, care este de 2. 995 00:54:26,760 --> 00:54:30,650 Așa că am obține numărul 2 și am pus în partea din față a listei. 996 00:54:30,650 --> 00:54:34,910 Și apoi mă uit pentru următoarea cea mai mică Element, care este 3. 997 00:54:34,910 --> 00:54:37,050 Așa că am pus-o la sfârșitul anului din lista sortată. 998 00:54:37,050 --> 00:54:38,140 Și apoi am continua să faci asta. 999 00:54:38,140 --> 00:54:40,040 Mi se pare 4 și a pus-o la sfârșitul anului. 1000 00:54:40,040 --> 00:54:41,360 Găsiți 5 și a pus-o la sfârșitul anului. 1001 00:54:41,360 --> 00:54:44,830 >> Si uita-te la modul în care toate aceste ori Spun pus-o la sfârșitul anului este, 1002 00:54:44,830 --> 00:54:46,850 în esență, schimbarea două valori. 1003 00:54:46,850 --> 00:54:48,100 OK? 1004 00:54:48,100 --> 00:54:50,140 1005 00:54:50,140 --> 00:54:52,825 Și apoi ultima, tu doar au mai un element. 1006 00:54:52,825 --> 00:54:55,870 Deci, este deja sortate. 1007 00:54:55,870 --> 00:54:57,800 >> OK, deci un fel de introducere. 1008 00:54:57,800 --> 00:55:03,180 Fel de inserție ai de gând să aibă, de asemenea, chestia aia de a fi un sortate și 1009 00:55:03,180 --> 00:55:04,690 o listă nesortate. 1010 00:55:04,690 --> 00:55:14,540 Singurul lucru este că de fiecare dată că adăugați un element la sortate 1011 00:55:14,540 --> 00:55:18,170 Lista, tu alege doar elementul care este în fața listei nesortate. 1012 00:55:18,170 --> 00:55:20,880 Și atunci vei găsi ceea ce poziție ar trebui să fie în Sortate 1013 00:55:20,880 --> 00:55:22,300 parte din lista. 1014 00:55:22,300 --> 00:55:25,840 >> Să vedem ce este acest lucru acest lucru face mai mult sens. 1015 00:55:25,840 --> 00:55:29,360 Deci, inițial, de exemplu, am încercat pentru a introduce numărul trei în 1016 00:55:29,360 --> 00:55:30,680 parte sortat din lista. 1017 00:55:30,680 --> 00:55:31,800 Deci, lista nu are nimic. 1018 00:55:31,800 --> 00:55:34,160 Deci, eu pot pune doar numărul 3. 1019 00:55:34,160 --> 00:55:37,480 >> Acum, vreau să adăugați numărul 5 a partea extrase din listă. 1020 00:55:37,480 --> 00:55:38,900 Așa că mă uit la numărul 5. 1021 00:55:38,900 --> 00:55:40,450 Am observat că este mai mare decât 3. 1022 00:55:40,450 --> 00:55:41,980 Deci, eu știu că trebuie să fie după 3. 1023 00:55:41,980 --> 00:55:44,100 Așa că am pus 3 și 5. 1024 00:55:44,100 --> 00:55:45,940 >> Apoi m-am dori pentru a introduce numărul 2. 1025 00:55:45,940 --> 00:55:51,630 Am observat că numărul 2 este de fapt dura apoi atât de 3 și 5. 1026 00:55:51,630 --> 00:55:54,580 Deci, am de fapt, a pus totul mod în începutul listei. 1027 00:55:54,580 --> 00:55:59,030 Așa că trebuie să, un fel de, Shift toate elemente în lista sortată, așa că am putea 1028 00:55:59,030 --> 00:56:01,970 face loc pentru numărul 2. 1029 00:56:01,970 --> 00:56:03,160 >> Apoi am vedea numărul 6. 1030 00:56:03,160 --> 00:56:05,450 Văd că ar trebui să fie după 5. 1031 00:56:05,450 --> 00:56:06,240 Așa că am pus-o acolo. 1032 00:56:06,240 --> 00:56:07,965 Și, în sfârșit, mă uit la numărul 4. 1033 00:56:07,965 --> 00:56:11,030 Și am observat cum ar trebui fie între 3 și 5. 1034 00:56:11,030 --> 00:56:14,870 Și apoi l-am pus acolo și schimbare toate celelalte elemente. 1035 00:56:14,870 --> 00:56:16,120 A face sens? 1036 00:56:16,120 --> 00:56:17,880 1037 00:56:17,880 --> 00:56:19,150 >> Bubble Sort. 1038 00:56:19,150 --> 00:56:25,730 Deci, cu bule fel este de fapt ceea ce esti O să facut-- o numim cu bule 1039 00:56:25,730 --> 00:56:30,113 fel pentru că te duci prin list-- este de fapt mai bine dacă am arăta 1040 00:56:30,113 --> 00:56:32,300 iti place asta-- 1041 00:56:32,300 --> 00:56:35,030 și vei compara numere alăturate. 1042 00:56:35,030 --> 00:56:38,410 Și ai de gând să schimbe lor poziții dacă nu sunt 1043 00:56:38,410 --> 00:56:39,190 în ordinea corectă. 1044 00:56:39,190 --> 00:56:42,570 >> Deci, practic, ceea ce se întâmplă la întâmpla este aici, de exemplu, 1045 00:56:42,570 --> 00:56:44,160 aveți 8 și 6. 1046 00:56:44,160 --> 00:56:47,270 Știi că ordinul de sortat va fi de fapt 6 și 5, nu? 1047 00:56:47,270 --> 00:56:49,540 Deci, ai de gând să schimbe ordinele. 1048 00:56:49,540 --> 00:56:51,370 Apoi m-am vedea 8 și 4 aici. 1049 00:56:51,370 --> 00:56:52,250 Și eu fac același lucru. 1050 00:56:52,250 --> 00:56:53,400 Am schimba din nou. 1051 00:56:53,400 --> 00:56:55,070 Și, în sfârșit, 2 și 8. 1052 00:56:55,070 --> 00:56:56,670 Am, de asemenea, le schimba. 1053 00:56:56,670 --> 00:57:01,690 >> Se numește Bubble Sort pentru că, după fiecare dintre aceste iterații, de fapt, 1054 00:57:01,690 --> 00:57:05,910 cel mai mare număr din lista devine tot drumul spre sfârșitul listei. 1055 00:57:05,910 --> 00:57:06,940 Are vreun sens? 1056 00:57:06,940 --> 00:57:11,880 Pentru că păstrează schimbarea aceasta și se deplasează spre dreapta. 1057 00:57:11,880 --> 00:57:14,440 >> OK, deci aceasta este a doua iterație. 1058 00:57:14,440 --> 00:57:17,200 Ar fi același lucru. 1059 00:57:17,200 --> 00:57:20,190 Voi face un schimb și apoi ultima. 1060 00:57:20,190 --> 00:57:23,290 Am că nu există swap-uri iar lista este sortată. 1061 00:57:23,290 --> 00:57:27,460 Deci, în Bubble Sort, păstrăm practic trece prin listă și schimbarea 1062 00:57:27,460 --> 00:57:32,310 lucruri, până când am observat că nu am făcut orice swap-uri care fac ca repetare, ceea ce 1063 00:57:32,310 --> 00:57:34,270 înseamnă că lista este deja sortat. 1064 00:57:34,270 --> 00:57:35,520 A face sens? 1065 00:57:35,520 --> 00:57:38,400 1066 00:57:38,400 --> 00:57:40,870 >> Hai sa vorbim un pic despre timpul de funcționare. 1067 00:57:40,870 --> 00:57:45,165 Deci, nu voi aminti Big O, Omega, și Theta? 1068 00:57:45,165 --> 00:57:49,290 1069 00:57:49,290 --> 00:57:50,990 Da? 1070 00:57:50,990 --> 00:57:53,070 OK, ceea ce este Big O, în primul rând? 1071 00:57:53,070 --> 00:57:54,315 >> Audiența: [inaudibil]. 1072 00:57:54,315 --> 00:57:59,070 >> LUCAS: Da, se numește o cel mai rău caz rulare, ceea ce înseamnă doar că este 1073 00:57:59,070 --> 00:58:03,470 cât de mult vă așteptați programul pentru a lua pentru a rula. 1074 00:58:03,470 --> 00:58:04,910 Cum ar fi, din punct de vedere de-- 1075 00:58:04,910 --> 00:58:06,660 în acest case-- n. 1076 00:58:06,660 --> 00:58:09,150 Numărul de elemente din Lista în cel mai rău caz. 1077 00:58:09,150 --> 00:58:12,520 Cum ar fi, în cel mai rău caz posibil. 1078 00:58:12,520 --> 00:58:17,100 >> Deci, pentru Bubble Sort, de exemplu, Avem O mare de n pătrat. 1079 00:58:17,100 --> 00:58:20,580 De ce avem asta? 1080 00:58:20,580 --> 00:58:24,716 De ce este Bubble Sort Big O n pătrat? 1081 00:58:24,716 --> 00:58:27,614 >> Audiența: [inaudibil]. 1082 00:58:27,614 --> 00:58:35,670 >> LUCAS: Da, deci cel mai rau caz va fi că va trebui să fac n iterații. 1083 00:58:35,670 --> 00:58:39,260 Deci, fiecare dintre iterații se va aduce cel mai mare element de capăt 1084 00:58:39,260 --> 00:58:40,290 listei. 1085 00:58:40,290 --> 00:58:44,230 Deci, cel mai rău caz este faptul că am pentru a face acest lucru de n ori. 1086 00:58:44,230 --> 00:58:48,550 Și pentru fiecare dintre aceste momente, trebuie să face n swap-uri pentru că am să compare 1087 00:58:48,550 --> 00:58:49,870 fiecare două elemente. 1088 00:58:49,870 --> 00:58:53,730 De aceea este n pătrat pentru că este de n ori n. 1089 00:58:53,730 --> 00:59:00,120 >> Apoi, selecție fel este, de asemenea, n pătrat pentru că, pentru fiecare iterație, trebuie să 1090 00:59:00,120 --> 00:59:02,650 uita-te la fiecare element de în listă. 1091 00:59:02,650 --> 00:59:04,980 Și apoi a găsi cel mai mic, ceea ce înseamnă că trebuie să 1092 00:59:04,980 --> 00:59:06,130 uita-te prin n elemente. 1093 00:59:06,130 --> 00:59:11,750 Și eu trebuie să fac asta de n ori, deoarece Eu am pentru a selecta toate n elemente. 1094 00:59:11,750 --> 00:59:18,273 >> Un fel de inserare este, de asemenea, n pătrat pentru că cel mai rău caz se va 1095 00:59:18,273 --> 00:59:20,950 fi, o, trebuie să introduceți N numere, nu? 1096 00:59:20,950 --> 00:59:22,765 Deci, eu deja știu că am de gând de a avea n iterații. 1097 00:59:22,765 --> 00:59:25,466 1098 00:59:25,466 --> 00:59:29,840 Dar, pentru fiecare dintre aceste numere, dacă am avut să se uite la toate numerele din 1099 00:59:29,840 --> 00:59:34,380 lista sortată și a pus-o la capăt în partea din față, care va fi n pătrat 1100 00:59:34,380 --> 00:59:36,230 deoarece va fi de n ori n din nou. 1101 00:59:36,230 --> 00:59:38,280 A face sens? 1102 00:59:38,280 --> 00:59:41,512 Ce zici de omega? 1103 00:59:41,512 --> 00:59:42,886 >> Audiența: [inaudibil]. 1104 00:59:42,886 --> 00:59:44,620 >> LUCAS: Este cel mai bun caz. 1105 00:59:44,620 --> 00:59:48,810 Deci e ca, într-o mulțime de ori pentru sortarea, cel mai bun caz este 1106 00:59:48,810 --> 00:59:50,660 atunci când lista este deja sortat. 1107 00:59:50,660 --> 00:59:52,670 Deci, nu aveți cu adevărat de a face ceva. 1108 00:59:52,670 --> 00:59:56,290 Bubble Sort are cel mai bun scenariu caz de n. 1109 00:59:56,290 --> 00:59:58,820 Nu voi stiti de ce? 1110 00:59:58,820 --> 01:00:00,620 >> Audiența: [inaudibil]. 1111 01:00:00,620 --> 01:00:05,640 >> LUCAS: Da, dacă vă țineți evidența dacă rația de date a avut nici un swap-uri sau 1112 01:00:05,640 --> 01:00:10,533 nu, dacă aveți ceva de genul setat la true dacă a existat o repetare, dacă este 1113 01:00:10,533 --> 01:00:15,140 Lista este deja sortate, de fapt, ce se va întâmpla este am de gând să 1114 01:00:15,140 --> 01:00:17,890 încercați să schimbați fiecare două elementele adiacente. 1115 01:00:17,890 --> 01:00:19,920 Mă duc să văd că nu sunt swap-uri. 1116 01:00:19,920 --> 01:00:21,230 Și mă voi întoarce imediat. 1117 01:00:21,230 --> 01:00:24,240 >> Deci, asta înseamnă că am avut de a du-te prin lista singură dată. 1118 01:00:24,240 --> 01:00:28,990 Deci, este n pentru că mă uit la n elemente. 1119 01:00:28,990 --> 01:00:30,930 De ce fel de selecție n pătrat? 1120 01:00:30,930 --> 01:00:35,150 1121 01:00:35,150 --> 01:00:45,520 >> Da, chiar dacă lista este sortată, pentru fiecare iterație de selecție fel, am 1122 01:00:45,520 --> 01:00:47,590 trebuie să selectați elementul minim. 1123 01:00:47,590 --> 01:00:49,980 Asta înseamnă că trebuie să te uiți afară la toate elementele din nesortate 1124 01:00:49,980 --> 01:00:53,350 lista și pentru a găsi minimul pentru fiecare iterație. 1125 01:00:53,350 --> 01:00:54,600 Are vreun sens? 1126 01:00:54,600 --> 01:00:56,880 1127 01:00:56,880 --> 01:01:04,690 >> Și sabia inserare este N, deoarece în cazul în care am încercat să introduceți 1128 01:01:04,690 --> 01:01:09,320 numere și toate numerele, când am încercați să le introduceți, văd că ei 1129 01:01:09,320 --> 01:01:10,510 sunt în poziția corectă. 1130 01:01:10,510 --> 01:01:15,120 Nu am sa verific toate celelalte numerele din lista nesortat. 1131 01:01:15,120 --> 01:01:17,170 Deci, de aceea va fi n. 1132 01:01:17,170 --> 01:01:19,480 A face sens? 1133 01:01:19,480 --> 01:01:21,035 Și ceea ce este theta? 1134 01:01:21,035 --> 01:01:23,410 >> Audiența: [inaudibil]. 1135 01:01:23,410 --> 01:01:24,380 >> LUCAS: Ce, îmi pare rău? 1136 01:01:24,380 --> 01:01:24,960 Spune-o din nou. 1137 01:01:24,960 --> 01:01:25,666 >> Audiența: [inaudibil]. 1138 01:01:25,666 --> 01:01:26,490 >> LUCAS: Exact. 1139 01:01:26,490 --> 01:01:31,280 Deci, puteți vedea că numai selecție stocate în Merge avea un fel thetas. 1140 01:01:31,280 --> 01:01:39,920 Și asta pentru că ai doar theta dacă ambele Big O și Omega sunt aceleași. 1141 01:01:39,920 --> 01:01:41,520 OK. 1142 01:01:41,520 --> 01:01:44,210 Și, în sfârșit, fuziona fel este în log n. 1143 01:01:44,210 --> 01:01:48,910 >> Și apoi, cum spunea Dan, Merge fel este un fel de același fel în care 1144 01:01:48,910 --> 01:01:50,320 ce faci binar de căutare. 1145 01:01:50,320 --> 01:01:53,530 Astfel încât să obțineți lista. 1146 01:01:53,530 --> 01:01:55,170 Și ai de gând să taie în jumătate. 1147 01:01:55,170 --> 01:02:00,580 Și apoi le taie în reprize mai mici. 1148 01:02:00,580 --> 01:02:01,730 Și apoi le îmbinați. 1149 01:02:01,730 --> 01:02:02,960 Voi aminti asta, nu? 1150 01:02:02,960 --> 01:02:04,960 OK, așa cum spunea el. 1151 01:02:04,960 --> 01:02:08,330 >> OK, indicii. 1152 01:02:08,330 --> 01:02:11,078 Deci, ceea ce este un indicator? 1153 01:02:11,078 --> 01:02:12,050 >> Audiența: [inaudibil]. 1154 01:02:12,050 --> 01:02:12,820 >> LUCAS: O adresă. 1155 01:02:12,820 --> 01:02:13,720 OK. 1156 01:02:13,720 --> 01:02:18,530 Știu că David arată o grămadă de videoclipuri binky și lucruri de indicare 1157 01:02:18,530 --> 01:02:19,080 reciproc. 1158 01:02:19,080 --> 01:02:22,960 Dar mie îmi place să mă gândesc la indicii ca doar o adresă. 1159 01:02:22,960 --> 01:02:26,110 Deci, este o variabilă care se întâmplă pentru a stoca o adresă. 1160 01:02:26,110 --> 01:02:31,940 >> Deci, e doar această variabilă special care este de patru bytes lung. 1161 01:02:31,940 --> 01:02:36,550 Amintiți-vă, că pointer la orice este întotdeauna patru bytes lung pentru noastre pe 32 de biți 1162 01:02:36,550 --> 01:02:39,370 mașină așa cazul cu aparatul. 1163 01:02:39,370 --> 01:02:41,920 1164 01:02:41,920 --> 01:02:47,050 Și are doar locația unei variabile în interiorul acestuia. 1165 01:02:47,050 --> 01:02:50,240 >> OK, deci nu e de memorie, de fapt. 1166 01:02:50,240 --> 01:02:57,420 Deci, fiecare bloc de memorie este de fapt o etichetă, care este adresa 1167 01:02:57,420 --> 01:02:58,890 memorie slotty. 1168 01:02:58,890 --> 01:03:02,370 Deci asta înseamnă că eu pot avea o indicare pointer la 1169 01:03:02,370 --> 01:03:03,380 oricare dintre aceste adrese. 1170 01:03:03,380 --> 01:03:09,930 Deci, motivul pentru care vom folosi indicii este dacă am să-mi amintesc locul 1171 01:03:09,930 --> 01:03:12,300 că o anumită variabilă este o memorie. 1172 01:03:12,300 --> 01:03:16,560 >> Și voi aminti că unul dintre cei cazuri a fost dacă am o funcție 1173 01:03:16,560 --> 01:03:20,820 daca am de fapt, doresc să de swap pentru reali, eu de fapt 1174 01:03:20,820 --> 01:03:22,110 trebuie să trimită un pointer. 1175 01:03:22,110 --> 01:03:23,460 Nu este variabila. 1176 01:03:23,460 --> 01:03:25,200 Nu voi aminti asta? 1177 01:03:25,200 --> 01:03:26,450 Diferență dintre-- 1178 01:03:26,450 --> 01:03:33,350 1179 01:03:33,350 --> 01:03:34,120 ceea ce este numele? 1180 01:03:34,120 --> 01:03:36,010 Apelarea prin valoare și apel de referință, nu? 1181 01:03:36,010 --> 01:03:36,840 >> OK, da. 1182 01:03:36,840 --> 01:03:38,330 Sună de valoare. 1183 01:03:38,330 --> 01:03:43,570 Când trimiteți doar o variabilă de funcționeze tu doar trimite o valoare. 1184 01:03:43,570 --> 01:03:45,610 Deci de fapt trimiterea o copie a variabilei. 1185 01:03:45,610 --> 01:03:49,720 Iar programul nu ar putea pasa mai puțin despre cazul în care aceeași variabila de fapt 1186 01:03:49,720 --> 01:03:51,650 face o copie. 1187 01:03:51,650 --> 01:03:56,330 >> Și de asteptare de referință înseamnă că Sunt de fapt trimit o copie a 1188 01:03:56,330 --> 01:03:57,550 pointer la variabila. 1189 01:03:57,550 --> 01:04:00,970 Deci, asta înseamnă că eu sunt trimiterea Locul de amplasare a acelei variabile. 1190 01:04:00,970 --> 01:04:04,440 Așa simt eu am localizarea variabilă, atunci când am apela funcția 1191 01:04:04,440 --> 01:04:09,700 cu indicii, eu sunt în măsură să efectiv schimba datele care a fost în principal. 1192 01:04:09,700 --> 01:04:12,050 A face sens? 1193 01:04:12,050 --> 01:04:17,560 >> Deși, indicatorul este o copie, pointer are încă adresa reală de 1194 01:04:17,560 --> 01:04:20,090 variabila care doresc să se schimbe. 1195 01:04:20,090 --> 01:04:21,920 A face sens? 1196 01:04:21,920 --> 01:04:24,290 >> Deci, crearea de indicii. 1197 01:04:24,290 --> 01:04:28,410 Amintiți-vă, indicatorul avea întotdeauna tipul care se indică 1198 01:04:28,410 --> 01:04:29,890 și apoi la o stea. 1199 01:04:29,890 --> 01:04:31,030 Și apoi ai pus numele. 1200 01:04:31,030 --> 01:04:35,765 Deci, amintiți-vă că ori de câte ori aveți orice stea, e ca un pointer la 1201 01:04:35,765 --> 01:04:38,990 că orice variabilă tip pe care le avea. 1202 01:04:38,990 --> 01:04:42,850 >> Deci, aici în stea, de exemplu, este un pointer și un întreg. 1203 01:04:42,850 --> 01:04:47,680 Și atunci stele char este un pointer stele char și așa mai departe. 1204 01:04:47,680 --> 01:04:47,960 Da? 1205 01:04:47,960 --> 01:04:52,710 >> Audiența: Ce se întâmplă dacă avem o pointer la n pentru a juca x. 1206 01:04:52,710 --> 01:04:55,255 Știu că creează un pointer la x. 1207 01:04:55,255 --> 01:04:59,432 Are, de asemenea, să declare x un număr întreg? 1208 01:04:59,432 --> 01:05:05,170 >> LUCAS: OK, asa ca atunci cand spui n stele x, tu nu creați un pointer la un 1209 01:05:05,170 --> 01:05:06,000 x variabil. 1210 01:05:06,000 --> 01:05:08,170 Creezi un pointer numit x. 1211 01:05:08,170 --> 01:05:09,396 >> Audiența: [inaudibil]. 1212 01:05:09,396 --> 01:05:14,250 >> LUCAS: Așa că atunci când am spus n stea x, eu sunt zis, hei, în memorie, am de gând să 1213 01:05:14,250 --> 01:05:16,390 a obține unul dintre aceste trei cutii. 1214 01:05:16,390 --> 01:05:20,750 Și am de gând să spun că va fi x, care este 1215 01:05:20,750 --> 01:05:22,000 O să fie un pointer. 1216 01:05:22,000 --> 01:05:26,860 1217 01:05:26,860 --> 01:05:30,640 Si ceva interesant despre indicii este că noi spunem că ei au 1218 01:05:30,640 --> 01:05:32,620 4 octeți pentru o mașină de 32 de biți. 1219 01:05:32,620 --> 01:05:36,320 Iar motivul pentru care se datorează faptului că 4 octeți sunt de 32-biți. 1220 01:05:36,320 --> 01:05:40,490 >> Și mașini care sunt de fapt 64 de biți au indicii adrese 1221 01:05:40,490 --> 01:05:43,480 care sunt 64 de biti. 1222 01:05:43,480 --> 01:05:49,820 Deci, aceasta înseamnă doar că mărimea adrese în aparatul este diferit. 1223 01:05:49,820 --> 01:05:52,270 >> Deci, de referință și dereferencing. 1224 01:05:52,270 --> 01:05:54,310 Există doi operatori care voi ar trebui sa ne amintim. 1225 01:05:54,310 --> 01:05:55,450 Primul este ampersand. 1226 01:05:55,450 --> 01:05:56,810 Al doilea este stea. 1227 01:05:56,810 --> 01:06:05,060 Nu te confuz de care stea și aceasta star amintiți-vă, pentru că, în 1228 01:06:05,060 --> 01:06:06,950 acest caz, ai n stele. 1229 01:06:06,950 --> 01:06:08,700 >> E ca o chestie împreună. 1230 01:06:08,700 --> 01:06:10,720 Nu există nici o stea n spațiu. 1231 01:06:10,720 --> 01:06:12,070 Deci, asta înseamnă că e tipul. 1232 01:06:12,070 --> 01:06:14,870 Amintiți-vă, că atunci când aveți steaua variabilă, tu ești 1233 01:06:14,870 --> 01:06:16,230 vorbind despre tipul. 1234 01:06:16,230 --> 01:06:20,540 >> Când ai doar stea și apoi Numele variabilei, aceasta înseamnă că 1235 01:06:20,540 --> 01:06:24,100 te dereferencing indicatorul, care înseamnă că te uiți la 1236 01:06:24,100 --> 01:06:28,290 pointer, pentru aflarea adresei e arătând spre, merge la acea adresă, 1237 01:06:28,290 --> 01:06:30,850 și ori de câte ori se uită la aveți acolo. 1238 01:06:30,850 --> 01:06:34,310 Așa că am spus elevilor mei că, atunci când aveți stele, trebuie sa te gandesti ca este 1239 01:06:34,310 --> 01:06:36,850 abrevierea de conținut de. 1240 01:06:36,850 --> 01:06:39,770 >> Deci, dacă aveți un pointer și tu face pointer stele, este 1241 01:06:39,770 --> 01:06:41,720 conținut de indicatorul. 1242 01:06:41,720 --> 01:06:44,580 Deci, te duci la orice se indică la si uita-te la conținut constant. 1243 01:06:44,580 --> 01:06:47,730 Și ampersand este aceeași lucru ca adresa de. 1244 01:06:47,730 --> 01:06:52,560 >> Deci, dacă am o variabilă un-- ca, hai sa spune că am făcut int un egal 3-- 1245 01:06:52,560 --> 01:06:56,900 dacă vreau să găsesc adresa de care variabilă o memorie, pot face doar 1246 01:06:56,900 --> 01:06:58,240 ampersand o. 1247 01:06:58,240 --> 01:07:00,280 Deci, este adresa o. 1248 01:07:00,280 --> 01:07:01,530 A face sens? 1249 01:07:01,530 --> 01:07:03,790 1250 01:07:03,790 --> 01:07:05,040 >> Deci, aici este un exemplu. 1251 01:07:05,040 --> 01:07:08,370 1252 01:07:08,370 --> 01:07:11,530 Acest lucru lipsește int b și c Int. 1253 01:07:11,530 --> 01:07:16,520 Deci, int-o este egal cu 3 mijloc care Am de gând să merg la memorie. 1254 01:07:16,520 --> 01:07:19,870 Și am de gând să găsească un slot și a pus numărul 3 aici. 1255 01:07:19,870 --> 01:07:22,200 >> Și apoi int b este egal cu 4. 1256 01:07:22,200 --> 01:07:23,100 Am de gând să facă același lucru. 1257 01:07:23,100 --> 01:07:25,840 Du-te la memorie și a pus un număr 4 într-una dintre casetele. 1258 01:07:25,840 --> 01:07:27,100 Și int este egal cu 5. 1259 01:07:27,100 --> 01:07:29,740 Găsește-o altă cutie și a pus un număr de 5. 1260 01:07:29,740 --> 01:07:36,160 >> Deci, ce este această linie faci? pa n stele este egal cu ampersand o. 1261 01:07:36,160 --> 01:07:37,800 Deci, în primul rând, n pa stea. 1262 01:07:37,800 --> 01:07:39,050 Ce o face? 1263 01:07:39,050 --> 01:07:40,930 1264 01:07:40,930 --> 01:07:42,298 >> Audiența: [inaudibil]. 1265 01:07:42,298 --> 01:07:47,890 >> LUCAS: Da, deci n pa stele, în primul rând, declară un pointer numit pa. 1266 01:07:47,890 --> 01:07:53,720 Și apoi se atribuirea valoarea de că indicatorul să fie adresa unui. 1267 01:07:53,720 --> 01:07:55,790 Deci ampersand o. 1268 01:07:55,790 --> 01:07:58,510 Apoi, dacă am face pb stele, ceea ce este o pb stea? 1269 01:07:58,510 --> 01:08:02,418 1270 01:08:02,418 --> 01:08:03,150 >> Oh, îmi pare rău. 1271 01:08:03,150 --> 01:08:06,330 Acest lucru este, de asemenea, lipsește. n pb stele. 1272 01:08:06,330 --> 01:08:07,905 Adică buc stele. 1273 01:08:07,905 --> 01:08:11,200 Îmi pare foarte rău. 1274 01:08:11,200 --> 01:08:11,940 E același lucru. 1275 01:08:11,940 --> 01:08:16,408 Dar acum sunt bine ar crea un pointer la B și apoi un pointer la c. 1276 01:08:16,408 --> 01:08:16,886 Da? 1277 01:08:16,886 --> 01:08:18,136 >> Audiența: [inaudibil]? 1278 01:08:18,136 --> 01:08:25,490 1279 01:08:25,490 --> 01:08:26,670 >> LUCAS: Da. 1280 01:08:26,670 --> 01:08:32,630 Deci, dacă te duci la memorie și te duci la caseta care este indicator pentru pa, 1281 01:08:32,630 --> 01:08:37,149 tu esti de fapt de gând să vedea o adresă de o. 1282 01:08:37,149 --> 01:08:38,399 OK? 1283 01:08:38,399 --> 01:08:42,970 1284 01:08:42,970 --> 01:08:43,300 Da? 1285 01:08:43,300 --> 01:08:45,605 >> Audiența: [inaudibil]? 1286 01:08:45,605 --> 01:08:49,260 >> LUCAS: Da, pointer este o adresă. 1287 01:08:49,260 --> 01:08:50,120 Nu uita niciodată că. 1288 01:08:50,120 --> 01:08:52,800 E ca si cum cel mai important parte despre indicii. 1289 01:08:52,800 --> 01:08:56,180 Există stocarea și adresa într-o anumită variabilă. 1290 01:08:56,180 --> 01:08:56,890 Altceva? 1291 01:08:56,890 --> 01:08:58,370 Orice alte întrebări? 1292 01:08:58,370 --> 01:08:59,189 OK. 1293 01:08:59,189 --> 01:09:00,399 >> Deci Pointeri și Arrays. 1294 01:09:00,399 --> 01:09:08,189 Amintiți-vă că atunci când fac int matrice 3, de fapt, ceea ce fac este că sunt, un fel 1295 01:09:08,189 --> 01:09:12,779 de, declarând într-un pointer. 1296 01:09:12,779 --> 01:09:18,960 Deci, matrice este un fel de un pointer la un loc specific în memorie, în care am 1297 01:09:18,960 --> 01:09:21,999 alocate trei sloturi pentru numere întregi. 1298 01:09:21,999 --> 01:09:23,430 Are vreun sens? 1299 01:09:23,430 --> 01:09:30,250 >> Așa că, atunci când fac int matrice 3, ceea ce am face, în principiu, este de a crea trei 1300 01:09:30,250 --> 01:09:31,479 sloturi în memorie. 1301 01:09:31,479 --> 01:09:33,899 Așa că am găsit doar trei sloturi în memorie. 1302 01:09:33,899 --> 01:09:38,810 Deci, dacă o fac, atunci, o matrice stea, ea înseamnă, în esență conținutul de matrice, 1303 01:09:38,810 --> 01:09:46,180 ceea ce înseamnă că șterge indicatorul, mă duc pentru că locul pe care este îndreptat la, 1304 01:09:46,180 --> 01:09:47,939 și am pus numărul unu. 1305 01:09:47,939 --> 01:09:53,729 >> Și apoi, dacă am face matrice stele plus 1, că e același lucru ca a face matrice 1306 01:09:53,729 --> 01:09:59,690 paranteze unul, ceea ce înseamnă că mă duc la locul pe care este îndreptat la. 1307 01:09:59,690 --> 01:10:03,000 Și apoi plus 1 mărci mi schimba o poziție. 1308 01:10:03,000 --> 01:10:06,510 Așa că mă duc la această poziție, de fapt, și a pus numărul doi. 1309 01:10:06,510 --> 01:10:10,900 >> Și apoi, în cele din urmă, atunci când fac matrice plus 2, merg acolo unde 1310 01:10:10,900 --> 01:10:11,825 îndreptat matrice de la. 1311 01:10:11,825 --> 01:10:14,690 Și apoi m-am muta la blocuri de memorie. 1312 01:10:14,690 --> 01:10:16,240 Și apoi am pus numărul trei aici. 1313 01:10:16,240 --> 01:10:16,600 Da? 1314 01:10:16,600 --> 01:10:21,400 >> Audiența: array Deci stea este pur și simplu spune foarte primul punct. 1315 01:10:21,400 --> 01:10:25,090 Și puteți adăuga 1, doar pentru că suntem doar într-adevăr 1316 01:10:25,090 --> 01:10:27,295 referire la prima adresa. 1317 01:10:27,295 --> 01:10:28,545 >> LUCAS: Da. 1318 01:10:28,545 --> 01:10:32,720 1319 01:10:32,720 --> 01:10:36,020 De ce avem, de exemplu, spune matrice 0, 1 matrice, matrice și 2? 1320 01:10:36,020 --> 01:10:38,970 1321 01:10:38,970 --> 01:10:42,790 Spun, de ce faci 0, 1, 2, 3 în loc de 1, 2, 3? 1322 01:10:42,790 --> 01:10:46,550 Unul dintre motive este, unul, calculator programatori preferă să înceapă 1323 01:10:46,550 --> 01:10:47,750 numărare de la 0. 1324 01:10:47,750 --> 01:10:52,370 Doi este că atunci când faci matrice 0, E același lucru ca a face matrice 1325 01:10:52,370 --> 01:10:56,330 plus 0, ceea ce înseamnă că mă duc la această poziție, și eu nu fac 1326 01:10:56,330 --> 01:10:59,320 sări peste orice blocuri de memorie. 1327 01:10:59,320 --> 01:11:01,750 Așa că nu se mișcă nici blocuri de memorie. 1328 01:11:01,750 --> 01:11:02,015 Da? 1329 01:11:02,015 --> 01:11:03,265 >> Audiența: [inaudibil]? 1330 01:11:03,265 --> 01:11:05,928 1331 01:11:05,928 --> 01:11:12,670 >> LUCAS: Deci, ea cere ceea ce este diferența între a face 1332 01:11:12,670 --> 01:11:14,000 aceasta sau de a face malloc. 1333 01:11:14,000 --> 01:11:17,550 Una dintre diferențele este că int matrice 3 este crearea unui 1334 01:11:17,550 --> 01:11:19,260 matrice pe stiva. 1335 01:11:19,260 --> 01:11:23,080 Și când o voi face malloc el, creează pe heap. 1336 01:11:23,080 --> 01:11:25,250 Are vreun sens? 1337 01:11:25,250 --> 01:11:28,870 >> Deci, cum malloc lucru de fapt? 1338 01:11:28,870 --> 01:11:32,245 Deci, de ce nu, chiar avem nevoie pentru a folosi malloc? 1339 01:11:32,245 --> 01:11:35,730 1340 01:11:35,730 --> 01:11:39,700 Fel compilator de figuri tot variabilele pe care le declarate. 1341 01:11:39,700 --> 01:11:44,040 Și el creează spațiu pentru toți Dintre acestea în stivă. 1342 01:11:44,040 --> 01:11:47,180 Deci, toate variabilele sunt de gând să fie undeva în stivă. 1343 01:11:47,180 --> 01:11:49,460 Deci, aici este variabilele de mediu. 1344 01:11:49,460 --> 01:11:53,850 >> Deci, practic, spațiu pentru acele variabile în memorie este alocată la 1345 01:11:53,850 --> 01:11:55,080 compila timp. 1346 01:11:55,080 --> 01:11:58,790 Deci, asta înseamnă că computerul are să cunoască toate aceste variabile 1347 01:11:58,790 --> 01:11:59,790 în prealabil. 1348 01:11:59,790 --> 01:12:02,500 Ea nu are nevoie să știe ce valoare ai de gând să pună în ele. 1349 01:12:02,500 --> 01:12:05,490 Dar trebuie să știe cum memorie de mult ai nevoie. 1350 01:12:05,490 --> 01:12:09,380 >> Dar acum, hai să spunem că, de exemplu, creați un tablou sau de a lua o 1351 01:12:09,380 --> 01:12:13,430 șir pe care le iei de la utilizator. 1352 01:12:13,430 --> 01:12:17,300 Nu știu cât de mult sirul va fi, de exemplu. 1353 01:12:17,300 --> 01:12:20,600 Deci, nu știi exact câți blocuri de memorie va aloca, corect? 1354 01:12:20,600 --> 01:12:24,120 >> Deci, nu prea are sens pentru să spui pune 100 de caractere. 1355 01:12:24,120 --> 01:12:26,420 Și apoi ce se întâmplă dacă utilizatorul scrie 150? 1356 01:12:26,420 --> 01:12:27,670 Vei fi înșurubat. 1357 01:12:27,670 --> 01:12:30,160 1358 01:12:30,160 --> 01:12:34,620 >> Deci, practic, nu poți fi sigur de cum de mult de memorie ai nevoie pentru a aloca 1359 01:12:34,620 --> 01:12:35,960 atunci când compilați programul. 1360 01:12:35,960 --> 01:12:38,240 Trebuie doar știi că în timp a alerga. 1361 01:12:38,240 --> 01:12:39,950 De aceea ai heap. 1362 01:12:39,950 --> 01:12:47,610 Deci, heap va avea memorie că tu alocarea în timpul 1363 01:12:47,610 --> 01:12:50,810 Durata de funcționare a programului. 1364 01:12:50,810 --> 01:12:55,780 >> Deci, practic, atunci când faci malloc, ceea ce ce faci este alocarea de memorie la 1365 01:12:55,780 --> 01:13:00,160 rulare, ceea ce înseamnă că ești decide chiar în acel moment că voi 1366 01:13:00,160 --> 01:13:02,670 ar trebui să aibă ca memorie. 1367 01:13:02,670 --> 01:13:04,210 Deci, asta e atunci când o alocare. 1368 01:13:04,210 --> 01:13:06,430 Are vreun sens? 1369 01:13:06,430 --> 01:13:11,690 >> Deci, amintiți-vă, stiva are variabile care sunt create pe timpul compilării. 1370 01:13:11,690 --> 01:13:14,560 Și apoi heap are variabile care sunt create ca te duci 1371 01:13:14,560 --> 01:13:15,600 cu malloc, de exemplu. 1372 01:13:15,600 --> 01:13:16,850 >> Audiența: [inaudibil]? 1373 01:13:16,850 --> 01:13:19,179 1374 01:13:19,179 --> 01:13:24,340 >> LUCAS: Deci getString este va suna malloc. 1375 01:13:24,340 --> 01:13:26,710 Permiteți-mi să vorbesc despre malloc, și Voi explica getString. 1376 01:13:26,710 --> 01:13:32,000 Deci, malloc este același lucru ca alocare de memorie. 1377 01:13:32,000 --> 01:13:34,600 Deci, o să aloce memorie pe heap. 1378 01:13:34,600 --> 01:13:40,010 Și o să se întoarcă un pointer la unde memorie a fost alocată la. 1379 01:13:40,010 --> 01:13:43,090 >> Deci, atunci când facut-- 1380 01:13:43,090 --> 01:13:44,910 aici pentru exemplu-- 1381 01:13:44,910 --> 01:13:45,830 n pointer stele. 1382 01:13:45,830 --> 01:13:50,520 Și apoi pointer este egal cu malloc Dimensiunea de ori inch 10. 1383 01:13:50,520 --> 01:13:52,110 Creez un pointer. 1384 01:13:52,110 --> 01:13:59,020 Și apoi voi atribuirea că indicatorul de valoarea indicatorului care malloc 1385 01:13:59,020 --> 01:13:59,680 este să-mi dea. 1386 01:13:59,680 --> 01:14:04,150 >> Deci, eu cer malloc se poate aloca spațiu pentru 10 de numere întregi. 1387 01:14:04,150 --> 01:14:05,390 Asta e ceea ce se spune. 1388 01:14:05,390 --> 01:14:09,020 Și malloc îmi dă înapoi o pointer la acel loc. 1389 01:14:09,020 --> 01:14:11,460 A face sens? 1390 01:14:11,460 --> 01:14:12,270 OK. 1391 01:14:12,270 --> 01:14:17,940 Am Si getString este, de fapt, a face o apela la malloc astfel încât să puteți aloca 1392 01:14:17,940 --> 01:14:21,680 memorie în timpul rulării. 1393 01:14:21,680 --> 01:14:26,460 >> Întotdeauna amintiți-vă pentru a verifica null pentru că malloc va intoarce null 1394 01:14:26,460 --> 01:14:28,200 în cazul în care aceasta nu poate aloca memorie. 1395 01:14:28,200 --> 01:14:31,660 Să spunem că vă întreb pentru un ridicol cantitate de memorie. 1396 01:14:31,660 --> 01:14:33,950 Computerul nu va fi posibilitatea de a aloca atât de mult. 1397 01:14:33,950 --> 01:14:36,410 >> Deci, malloc este doar de gând pentru a reveni null. 1398 01:14:36,410 --> 01:14:42,210 Deci, amintiți-vă mereu pentru a verifica dacă pointer că ai de la malloc este 1399 01:14:42,210 --> 01:14:45,640 nul sau nu, deoarece, în cazul în care acesta este, s-ar putea se dereferencing un pointer și 1400 01:14:45,640 --> 01:14:48,340 cauzând defecte secundare. 1401 01:14:48,340 --> 01:14:50,930 Și, în sfârșit, nu uitați memorie gratuit. 1402 01:14:50,930 --> 01:14:57,800 1403 01:14:57,800 --> 01:15:00,560 >> Malloc este de a crea memorie în heap. 1404 01:15:00,560 --> 01:15:03,436 Și trebuie să elibereze memoria înainte de terminarea programului. 1405 01:15:03,436 --> 01:15:05,370 OK, asta e tot pentru mine. 1406 01:15:05,370 --> 01:15:07,900 Îmi pare rău, Rob. 1407 01:15:07,900 --> 01:15:07,950 Multumesc. 1408 01:15:07,950 --> 01:15:09,878 >> [Aplauze] 1409 01:15:09,878 --> 01:15:12,679 >> LUCAS: Orice ultimele întrebări înainte de Rob vine? 1410 01:15:12,679 --> 01:15:13,138 Nu? 1411 01:15:13,138 --> 01:15:13,597 Da? 1412 01:15:13,597 --> 01:15:15,892 >> Audiența: N-am văzut asta on-line. 1413 01:15:15,892 --> 01:15:17,269 L-ai încărcat încă? 1414 01:15:17,269 --> 01:15:19,106 >> LUCAS: Cred că Dave este încărcarea în curând. 1415 01:15:19,106 --> 01:15:19,880 >> DAVE: Va fi postate. 1416 01:15:19,880 --> 01:15:20,310 >> LUCAS: Va fi on-line. 1417 01:15:20,310 --> 01:15:21,175 >> Audiența: Depinde. 1418 01:15:21,175 --> 01:15:22,090 >> LUCAS: Depinde? 1419 01:15:22,090 --> 01:15:23,157 OK. 1420 01:15:23,157 --> 01:15:23,644 Da? 1421 01:15:23,644 --> 01:15:27,053 >> Audiența: [inaudibil]? 1422 01:15:27,053 --> 01:15:30,285 >> LUCAS: Da, ar trebui să elibereze toți memorie care este pus în grămadă. 1423 01:15:30,285 --> 01:15:31,535 >> Audiența: [inaudibil]? 1424 01:15:31,535 --> 01:15:34,518 1425 01:15:34,518 --> 01:15:36,160 >> LUCAS: Da. 1426 01:15:36,160 --> 01:15:39,980 De fiecare dată că aveți o malloc cultură, ar trebui să aveți o cultură liberă 1427 01:15:39,980 --> 01:15:42,640 după ce încetați să mai folosiți variabile. 1428 01:15:42,640 --> 01:15:44,800 Deci, malloc și gratuit sunt mereu împreună. 1429 01:15:44,800 --> 01:15:45,410 Cei mai buni prieteni. 1430 01:15:45,410 --> 01:15:46,720 Da. 1431 01:15:46,720 --> 01:15:47,970 Rob? 1432 01:15:47,970 --> 01:15:55,595 1433 01:15:55,595 --> 01:15:56,850 >> ROB: Mă duc repede. 1434 01:15:56,850 --> 01:16:00,466 Și, de asemenea, videoclipul va fi pus. 1435 01:16:00,466 --> 01:16:01,716 Am microfonul pe. 1436 01:16:01,716 --> 01:16:24,060 1437 01:16:24,060 --> 01:16:26,230 >> OK, deci săptămână cinci lucruri. 1438 01:16:26,230 --> 01:16:27,970 Primul lucru pe care îl avem este stiva. 1439 01:16:27,970 --> 01:16:33,390 Deci, amintiți-vă că există o singură stivă cadru pe apel funcție activă. 1440 01:16:33,390 --> 01:16:34,710 Vom vedea că într-o secundă. 1441 01:16:34,710 --> 01:16:37,850 Și, de asemenea, amintiți-vă ce se întâmplă de fapt în fiecare cadru stivă vor fi 1442 01:16:37,850 --> 01:16:41,880 variabilele locale ale functiilor noastre, argumentele care sunt trecute în nostru 1443 01:16:41,880 --> 01:16:43,880 funcții, împreună cu un cuplu alte lucruri pe care nu prea 1444 01:16:43,880 --> 01:16:45,260 trebuie să vă faceți griji. 1445 01:16:45,260 --> 01:16:50,950 >> Deci, aici e un program de exemplu în cazul în care, notificare, principal este printfing revenirea 1446 01:16:50,950 --> 01:16:52,830 Valoarea de foo 4. 1447 01:16:52,830 --> 01:16:57,930 foo este doar de gând să se întoarcă Valoarea de bar 4 virgulă 6. 1448 01:16:57,930 --> 01:17:02,380 Și bar se va stabili unele locale n variabilă egală cu de 4 ori 6. 1449 01:17:02,380 --> 01:17:03,920 Și apoi să se întoarcă n. 1450 01:17:03,920 --> 01:17:09,130 >> Deci, să ne uităm la stiva pe tot parcursul repetare efectivă a acestui program. 1451 01:17:09,130 --> 01:17:10,500 Deci, există în partea de jos a stivei noastre. 1452 01:17:10,500 --> 01:17:12,620 Amintiți-vă că stiva crește. 1453 01:17:12,620 --> 01:17:15,370 Deci, la partea de jos a stivei noastre, am au un cadru stivă de principal. 1454 01:17:15,370 --> 01:17:17,000 Când începe programul, principal este întotdeauna o să fie la 1455 01:17:17,000 --> 01:17:18,560 partea de jos a stivei noastre. 1456 01:17:18,560 --> 01:17:20,880 >> Și ceea ce este în interiorul nostru stiva cadru pentru principal? 1457 01:17:20,880 --> 01:17:23,810 Deci, chiar dacă nu există locale variabile de principal, cum am spus înainte, 1458 01:17:23,810 --> 01:17:29,670 am argc și RGV să ocupe spațiu în interiorul cadrului pachetul principal. 1459 01:17:29,670 --> 01:17:33,260 Deci principal este acum de gând să apeleaza functia foo. 1460 01:17:33,260 --> 01:17:35,125 Și asta înseamnă foo va obține propriul cadru stivă. 1461 01:17:35,125 --> 01:17:36,970 >> Deci, acum suntem în interiorul foo funcție. 1462 01:17:36,970 --> 01:17:38,610 Și ce trebuie să meargă în cadru stiva foo lui? 1463 01:17:38,610 --> 01:17:41,100 Ei bine, foo are un argument n. 1464 01:17:41,100 --> 01:17:45,440 Și n este egal cu 4, deoarece asta e ceea ce principal trece ca argument foo lui. 1465 01:17:45,440 --> 01:17:48,490 >> Deci, acum foo se va numi bar. 1466 01:17:48,490 --> 01:17:52,070 Ce este bara va avea în interior de "cadru de stivă? 1467 01:17:52,070 --> 01:17:55,610 Are x egal cu 4 y egal cu șase. 1468 01:17:55,610 --> 01:17:58,540 Asta nu e tot ce vom avea în cadrul stivei deoarece bar 1469 01:17:58,540 --> 01:18:00,580 are, de asemenea, o variabilă n locală. 1470 01:18:00,580 --> 01:18:03,370 Și n-am de gând să se stabilească egal cu 24. 1471 01:18:03,370 --> 01:18:05,750 >> Deci, acum, bar se va reveni n. 1472 01:18:05,750 --> 01:18:09,300 Deci, bar se întoarce la 24 alim cadru stivă. 1473 01:18:09,300 --> 01:18:12,560 Și pentru că bar se întoarce acum, că înseamnă că vom popping cadrul stivă 1474 01:18:12,560 --> 01:18:14,250 pentru bar de pe stivă. 1475 01:18:14,250 --> 01:18:18,430 Deci, toate de memorie care bara a fost utilizarea este acum de pe stiva. 1476 01:18:18,430 --> 01:18:21,550 >> Acum, foo este, de asemenea, va pentru a reveni la 24 la principal. 1477 01:18:21,550 --> 01:18:25,470 Deci, acum că foo se întoarce, memoria că foo folosea în "sale 1478 01:18:25,470 --> 01:18:27,550 cadru stivă este, de asemenea, a dispărut. 1479 01:18:27,550 --> 01:18:29,660 Și acum, principal se va numi printf. 1480 01:18:29,660 --> 01:18:31,660 Deci printf este doar o altă funcție. 1481 01:18:31,660 --> 01:18:35,320 Când numim printf, aceasta va fi un alt cadru stivă pentru printf 1482 01:18:35,320 --> 01:18:36,470 apel de functie. 1483 01:18:36,470 --> 01:18:37,990 >> Ce ne trece printf? 1484 01:18:37,990 --> 01:18:40,090 Asta e ceea ce se întâmplă pentru a merge pe cadru de stivă. 1485 01:18:40,090 --> 01:18:44,970 Cel puțin, vom trece că la sută i backslash n și 1486 01:18:44,970 --> 01:18:47,180 argumentul 24. 1487 01:18:47,180 --> 01:18:50,370 S-ar putea să aibă mai mult în ea este cadru stivă dacă printf se întâmplă să fie folosind unele 1488 01:18:50,370 --> 01:18:51,200 variabile locale. 1489 01:18:51,200 --> 01:18:51,920 Nu știm. 1490 01:18:51,920 --> 01:18:53,810 >> Dar toate acestea se în lui printf stiva cadru. 1491 01:18:53,810 --> 01:18:55,740 Se va executa printf. 1492 01:18:55,740 --> 01:18:56,830 Apoi printf făcut. 1493 01:18:56,830 --> 01:18:57,820 Acesta va reveni. 1494 01:18:57,820 --> 01:18:58,960 În final, se face principal. 1495 01:18:58,960 --> 01:18:59,860 Principal va reveni. 1496 01:18:59,860 --> 01:19:02,020 Și apoi programul nostru se face. 1497 01:19:02,020 --> 01:19:02,480 Da? 1498 01:19:02,480 --> 01:19:04,505 >> Audiența: Te vezi [inaudibil] 1499 01:19:04,505 --> 01:19:05,900 argumente [inaudibil] 1500 01:19:05,900 --> 01:19:06,830 parametri? 1501 01:19:06,830 --> 01:19:09,970 >> ROB: Deci, există o diferență subtilă între argumente și parametri. 1502 01:19:09,970 --> 01:19:14,400 Și într-adevăr, în vorbesc comun, oamenii tind pentru a amesteca doar le tot timpul. 1503 01:19:14,400 --> 01:19:17,550 Dar parametrii sunt formale Numele lucrurile. 1504 01:19:17,550 --> 01:19:20,180 >> Deci, argc și argv sunt parametri principal. 1505 01:19:20,180 --> 01:19:23,440 Argumentele sunt ceea ce de fapt trece în care acești parametri. 1506 01:19:23,440 --> 01:19:28,340 Așa că, atunci când eu numesc foo de 4, 4 este argumentul Trec în. 1507 01:19:28,340 --> 01:19:31,460 Și parametrul n, în interiorul foo, ia valoarea 4 1508 01:19:31,460 --> 01:19:32,880 de la 4 a fost argumentul. 1509 01:19:32,880 --> 01:19:35,826 >> Audiența: [inaudibil]? 1510 01:19:35,826 --> 01:19:37,880 >> ROB: n este o variabila locala la bar. 1511 01:19:37,880 --> 01:19:41,420 1512 01:19:41,420 --> 01:19:44,960 n este încă locală a foo, dar este un parametru de foo. 1513 01:19:44,960 --> 01:19:48,190 Nu este o variabilă locală. 1514 01:19:48,190 --> 01:19:48,546 Da? 1515 01:19:48,546 --> 01:19:51,180 >> Audiența: [inaudibil]? 1516 01:19:51,180 --> 01:19:55,400 >> ROB: bar foo este sunat și revenind orice bar întoarce. 1517 01:19:55,400 --> 01:19:56,786 >> Audiența: [inaudibil]? 1518 01:19:56,786 --> 01:19:59,591 >> ROB: Da, doar pentru a vedea mai multe stiva de cadre. 1519 01:19:59,591 --> 01:20:00,082 Da? 1520 01:20:00,082 --> 01:20:03,519 >> Audiența: De ce a fost numit foo înainte printf? 1521 01:20:03,519 --> 01:20:05,920 >> ROB: De ce a fost numit foo înainte printf? 1522 01:20:05,920 --> 01:20:10,740 Deci, am putea avea, în schimb, face ceva ca int x este egal cu foo din 4 1523 01:20:10,740 --> 01:20:12,980 și apoi imprimate x. 1524 01:20:12,980 --> 01:20:17,900 Dar, în loc, am combinat funcția pune în argumentul printf. 1525 01:20:17,900 --> 01:20:23,670 >> Dar observați că nu putem de fapt executa apelul la printf până când vom 1526 01:20:23,670 --> 01:20:25,610 dau seama ce este foo de 4. 1527 01:20:25,610 --> 01:20:27,480 Deci, vom evalua acest lucru. 1528 01:20:27,480 --> 01:20:32,504 Și doar o singură dată, care a făcut merg să se întoarcă și să evalueze acest lucru. 1529 01:20:32,504 --> 01:20:32,990 Da? 1530 01:20:32,990 --> 01:20:37,364 >> Audiența: Din moment ce ambele bar [inaudibil] 1531 01:20:37,364 --> 01:20:41,738 valoare, de ce nu ne-am [inaudibil]? 1532 01:20:41,738 --> 01:20:44,400 >> ROB: Ei total ar trebui să fie int. 1533 01:20:44,400 --> 01:20:46,260 Asta nu a fost prins peste mai multe treceri. 1534 01:20:46,260 --> 01:20:49,010 Deci, ar trebui să fie bar int și int foo deoarece atât a celor 1535 01:20:49,010 --> 01:20:50,460 se întorc întregi. 1536 01:20:50,460 --> 01:20:54,214 Void este doar în cazul în care ei nu vor să se întoarcă valorile reale. 1537 01:20:54,214 --> 01:20:54,692 Da? 1538 01:20:54,692 --> 01:20:58,038 >> Audiența: Dacă ați avea o linie mai sus întoarcerea, [neauzit]? 1539 01:20:58,038 --> 01:21:01,862 1540 01:21:01,862 --> 01:21:03,730 >> ROB: O linie de mai sus întoarcerea? 1541 01:21:03,730 --> 01:21:04,410 >> Audiența: Da. 1542 01:21:04,410 --> 01:21:10,780 Ca și în cazul în care ai făcut printf și [neauzit], s-ar imprima de doua ori? 1543 01:21:10,780 --> 01:21:12,992 >> ROB: Deci, în interiorul foo? 1544 01:21:12,992 --> 01:21:15,945 Dacă am avea un printf aici? 1545 01:21:15,945 --> 01:21:16,750 >> Audiența: Da. 1546 01:21:16,750 --> 01:21:19,510 >> ROB: Deci, dacă am fi avut un drept printf aici, ar fi afișat o dată. 1547 01:21:19,510 --> 01:21:23,400 Din moment ce sunt de asteptare foo dată drept aici, atunci vom lovi printf. 1548 01:21:23,400 --> 01:21:24,620 Apoi vom suna bar. 1549 01:21:24,620 --> 01:21:25,710 Și apoi foo va reveni. 1550 01:21:25,710 --> 01:21:26,275 Și asta e tot. 1551 01:21:26,275 --> 01:21:30,985 Ne întâlnim doar vreodată printf dată. 1552 01:21:30,985 --> 01:21:31,482 Da? 1553 01:21:31,482 --> 01:21:32,973 >> Audiența: [inaudibil] 1554 01:21:32,973 --> 01:21:37,950 printf apel foo pentru că suntem primul apel printf și apoi vom trece 1555 01:21:37,950 --> 01:21:38,580 argumentele. 1556 01:21:38,580 --> 01:21:40,960 >> ROB: Deci, în teorie, nu este printf apel foo? 1557 01:21:40,960 --> 01:21:42,220 Deci, nu. 1558 01:21:42,220 --> 01:21:47,360 Doar ordinea în care c este de gând să executa aceste lucruri este, înainte de a putea 1559 01:21:47,360 --> 01:21:49,800 apela o funcție, toate argumentele la funcția trebui să 1560 01:21:49,800 --> 01:21:51,600 fi evaluate complet. 1561 01:21:51,600 --> 01:21:53,540 Deci, este acest evaluat complet? 1562 01:21:53,540 --> 01:21:54,610 Da, e doar un șir. 1563 01:21:54,610 --> 01:21:55,480 E doar o valoare. 1564 01:21:55,480 --> 01:21:57,200 >> Apoi, trebuie să complet evalua acest lucru. 1565 01:21:57,200 --> 01:21:59,720 Odată ce se face acest lucru, acum toate argumentele sale sunt evaluate. 1566 01:21:59,720 --> 01:22:01,982 Și acum putem face apela la printf. 1567 01:22:01,982 --> 01:22:02,478 Da? 1568 01:22:02,478 --> 01:22:03,966 >> Audiența: O întrebare. 1569 01:22:03,966 --> 01:22:06,942 Dacă aveți o funcție gol, trebuie să Ai virgulă schimb? 1570 01:22:06,942 --> 01:22:09,910 >> ROB: Nu face un punct și virgulă revenire dacă aveți o funcție gol. 1571 01:22:09,910 --> 01:22:13,370 1572 01:22:13,370 --> 01:22:14,780 OK. 1573 01:22:14,780 --> 01:22:15,830 Deci, acum niște chestii grămadă. 1574 01:22:15,830 --> 01:22:19,640 Deci, heap este cum vom face cu memorie de management dinamic. 1575 01:22:19,640 --> 01:22:23,100 Și acest contrast direct cu stiva pe care am numi automat 1576 01:22:23,100 --> 01:22:24,100 de gestionare a memoriei. 1577 01:22:24,100 --> 01:22:27,140 >> Deci, pe stiva, nu aveți cu adevărat de a face cu modul în care variabilele locale 1578 01:22:27,140 --> 01:22:30,400 sunt împinse și mi-a venit de pe toate aceste cadre stiva și toate chestiile astea. 1579 01:22:30,400 --> 01:22:31,070 Nu trebuie să vă faceți griji despre asta. 1580 01:22:31,070 --> 01:22:32,070 Este automat. 1581 01:22:32,070 --> 01:22:36,990 Deci, heap este manual. 1582 01:22:36,990 --> 01:22:38,070 Și [neauzit] 1583 01:22:38,070 --> 01:22:41,260 vine de la aceste funcții malloc și gratuit. 1584 01:22:41,260 --> 01:22:43,550 >> Deci, aici este un alt program. 1585 01:22:43,550 --> 01:22:47,145 Tot ce facem este mallocing un număr întreg. 1586 01:22:47,145 --> 01:22:49,360 Suntem o depozitați în stea x. 1587 01:22:49,360 --> 01:22:52,520 Desigur, avem de a verifica pentru a vedea dacă x este nul. 1588 01:22:52,520 --> 01:22:56,400 Apoi vom stabili exact ceea ce x este îndreptat la 50. 1589 01:22:56,400 --> 01:23:00,350 1590 01:23:00,350 --> 01:23:03,260 Printeaza ce x este îndreptat la, imprimare x, și apoi gratuit x. 1591 01:23:03,260 --> 01:23:08,920 >> Deci, cum este acest fapt de gând să se uite daca ne uitam la stiva si heap nostru? 1592 01:23:08,920 --> 01:23:10,950 Deci, vom începe din nou. 1593 01:23:10,950 --> 01:23:12,580 Partea de jos a stivei noastre ca înainte. 1594 01:23:12,580 --> 01:23:15,930 Amintiți-vă că te-heap direct se opune stiva? 1595 01:23:15,930 --> 01:23:18,850 Deci, vom avea partea de sus a morman noastre acolo. 1596 01:23:18,850 --> 01:23:22,590 >> Deci, partea de jos a stivei noastre, ne-am cadru noastră stiva de principal. 1597 01:23:22,590 --> 01:23:28,000 Ea are spațiu pentru argc, argv, și ne-am au acum un x variabilă locală, care 1598 01:23:28,000 --> 01:23:30,030 este o stea int. 1599 01:23:30,030 --> 01:23:32,240 Deci, vom repeta prin intermediul acestui program. 1600 01:23:32,240 --> 01:23:34,420 Primul lucru pe care îl avem este un apel la malloc. 1601 01:23:34,420 --> 01:23:36,250 >> Deci, facem un apel la malloc. 1602 01:23:36,250 --> 01:23:37,100 Malloc este o funcție. 1603 01:23:37,100 --> 01:23:38,770 Va obține un cadru stivă. 1604 01:23:38,770 --> 01:23:40,180 Ce vom trece la malloc? 1605 01:23:40,180 --> 01:23:41,610 Asta va merge în interiorul a cadrului stivă. 1606 01:23:41,610 --> 01:23:45,130 Trecem dimensiune de n, care este de 4. 1607 01:23:45,130 --> 01:23:49,700 Deci, care este trecut la malloc. 1608 01:23:49,700 --> 01:23:50,910 >> Ce face malloc? 1609 01:23:50,910 --> 01:23:53,820 Ne ia de spațiu pe heap. 1610 01:23:53,820 --> 01:23:55,320 Deci, vom merge la grămadă. 1611 01:23:55,320 --> 01:23:57,990 Și vom apuca 4 bytes din heap. 1612 01:23:57,990 --> 01:24:01,500 Așa că hai să dai o adresă arbitrar. 1613 01:24:01,500 --> 01:24:06,680 0x123 Doar pretinde că este un adresa care este pe heap. 1614 01:24:06,680 --> 01:24:12,300 >> Deci, ce este de fapt in interiorul că regiune de memorie la adresa Ox123? 1615 01:24:12,300 --> 01:24:13,080 Garbage. 1616 01:24:13,080 --> 01:24:15,270 Așa că nu ne-am depozitat nimic în ea. 1617 01:24:15,270 --> 01:24:18,830 Deci, în măsura în care știm, ea ar putea fi orice. 1618 01:24:18,830 --> 01:24:20,560 Nu ar trebui să-și asume că e zero. 1619 01:24:20,560 --> 01:24:23,870 Este cel mai probabil nu este zero. 1620 01:24:23,870 --> 01:24:26,260 >> Deci, acum se întoarce malloc. 1621 01:24:26,260 --> 01:24:28,020 Și ce facem când se întoarce malloc? 1622 01:24:28,020 --> 01:24:29,800 Am stabilit ce se întoarce. 1623 01:24:29,800 --> 01:24:32,290 Ne-am propus x egal cu ceea ce ea se întoarce. 1624 01:24:32,290 --> 01:24:33,690 Deci, ceea ce este ea întoarce? 1625 01:24:33,690 --> 01:24:38,150 Se întoarce 0x123 de la care este adresa blocului de memorie care se 1626 01:24:38,150 --> 01:24:40,850 doar alocată în heap. 1627 01:24:40,850 --> 01:24:47,160 >> Deci reveni 0x123 x este acum de gând să fie stabilite egal la 0x123 care, pictural, 1628 01:24:47,160 --> 01:24:52,940 tragem frecvent ca x are un efectiv săgeată arătând spre acel bloc. 1629 01:24:52,940 --> 01:24:55,820 Dar x doar stochează adresa. 1630 01:24:55,820 --> 01:24:58,670 Deci, acum avem de a verifica dacă x este nul. 1631 01:24:58,670 --> 01:24:59,120 Nu este nul. 1632 01:24:59,120 --> 01:25:02,170 Ne prefacem că malloc reușit. 1633 01:25:02,170 --> 01:25:04,950 >> Deci, acum stea x este egal cu 50. 1634 01:25:04,950 --> 01:25:08,450 Deci, stele își amintește ea înseamnă du-te la acea adresă. 1635 01:25:08,450 --> 01:25:12,700 Deci, 0x123 Vom du-te la acea adresă. 1636 01:25:12,700 --> 01:25:14,660 Așa că ne aduce acolo. 1637 01:25:14,660 --> 01:25:16,310 Ce facem la acea adresa? 1638 01:25:16,310 --> 01:25:19,020 Suntem depozitare 50. 1639 01:25:19,020 --> 01:25:22,500 >> Deci, după această linie, care este ceea ce lucrurile se vor arăta. 1640 01:25:22,500 --> 01:25:24,640 Deci, acum nu mai este acolo gunoi sus. 1641 01:25:24,640 --> 01:25:28,910 Acum știm că 50 este în faptul că Adresa special deoarece 1642 01:25:28,910 --> 01:25:32,410 l-am setat la asta. 1643 01:25:32,410 --> 01:25:32,790 OK? 1644 01:25:32,790 --> 01:25:34,370 Deci, acum vom imprima f. 1645 01:25:34,370 --> 01:25:38,490 >> Deci, primul vom imprima stea x. 1646 01:25:38,490 --> 01:25:39,640 Deci, ceea ce este steaua x? 1647 01:25:39,640 --> 01:25:44,300 Din nou, stele x înseamnă a merge la lucru care x este îndreptat la. 1648 01:25:44,300 --> 01:25:47,140 Deci, x este stocarea 0x123 Du-te la asta. 1649 01:25:47,140 --> 01:25:48,490 Ne-am 50. 1650 01:25:48,490 --> 01:25:50,540 Deci imprima f asta. 1651 01:25:50,540 --> 01:25:54,900 Și asta înseamnă că va imprima 50. 1652 01:25:54,900 --> 01:25:56,850 Și atunci se întoarce. 1653 01:25:56,850 --> 01:25:58,340 >> Și atunci avem de-al doilea printf. 1654 01:25:58,340 --> 01:25:59,370 Suntem acum la sută p. 1655 01:25:59,370 --> 01:26:01,680 Dacă nu ați văzut-o, asta-i doar cum să imprimați un pointer. 1656 01:26:01,680 --> 01:26:04,960 Deci avem la sută i, la sută f, și toți cei deja. 1657 01:26:04,960 --> 01:26:07,160 Deci la sută p, imprima un pointer. 1658 01:26:07,160 --> 01:26:08,920 >> Deci, x este un pointer. 1659 01:26:08,920 --> 01:26:13,440 Deci, dacă vom imprima x sine, suntem imprimare ceea ce este de fapt în interiorul 1660 01:26:13,440 --> 01:26:19,220 x, care este 0x123 Deci primul imprimare f se va imprima 50. 1661 01:26:19,220 --> 01:26:23,620 Cea de a doua imprimare f se întâmplă pentru a imprima 0x123 Da? 1662 01:26:23,620 --> 01:26:27,460 >> Audiența: Folosești la sută x pentru a imprima un pointer? 1663 01:26:27,460 --> 01:26:31,200 >> ROB: Deci, folositi la sută x pentru a imprima un pointer? 1664 01:26:31,200 --> 01:26:38,350 Deci, poti, dar la suta x este doar, în general, pentru ca daca ai ceva 1665 01:26:38,350 --> 01:26:40,325 întreg și doriți să imprimați ea ca un hexazecimal. 1666 01:26:40,325 --> 01:26:43,250 1667 01:26:43,250 --> 01:26:44,880 Asta e doar modul în care faci asta. 1668 01:26:44,880 --> 01:26:47,160 >> Întrucât, suta d ar imprima ca zecimal. 1669 01:26:47,160 --> 01:26:50,310 Asta este, dacă am lua la sută d. i este doar întreg. 1670 01:26:50,310 --> 01:26:52,690 procente p este în mod special pentru indicii. 1671 01:26:52,690 --> 01:26:54,060 >> Deci, x este un pointer. 1672 01:26:54,060 --> 01:26:56,360 Vrem să folosim la sută p. 1673 01:26:56,360 --> 01:26:57,937 Dar la suta x ar putea funcționa. 1674 01:26:57,937 --> 01:26:58,414 Da? 1675 01:26:58,414 --> 01:26:59,664 >> Audiența: [inaudibil]? 1676 01:26:59,664 --> 01:27:04,138 1677 01:27:04,138 --> 01:27:05,388 >> ROB: Da. 1678 01:27:05,388 --> 01:27:07,870 1679 01:27:07,870 --> 01:27:13,440 Cel de acest lucru la call--, așa că am nu-l includ aici. 1680 01:27:13,440 --> 01:27:19,850 Dar aceste două argumente sunt în mod necesar în interiorul acestui cadru stivă 1681 01:27:19,850 --> 01:27:23,040 împreună cu orice variabile locale printf se întâmplă să fie folosind. 1682 01:27:23,040 --> 01:27:27,020 Și apoi următorul apel la printf acum interiorul printf cadru stivă este 1683 01:27:27,020 --> 01:27:33,960 la sută p backslash n și indiferent Valoarea lui x este, care este 0x123. 1684 01:27:33,960 --> 01:27:34,425 Da? 1685 01:27:34,425 --> 01:27:35,675 >> Audiența: [inaudibil]? 1686 01:27:35,675 --> 01:27:38,145 1687 01:27:38,145 --> 01:27:40,880 >> ROB: Va imprima ceva care arata ca aceasta. 1688 01:27:40,880 --> 01:27:41,846 >> Audiența: [inaudibil]. 1689 01:27:41,846 --> 01:27:44,510 >> ROB: Deci, se imprimă în formă adresa. 1690 01:27:44,510 --> 01:27:47,003 Se pare ca o adresă. 1691 01:27:47,003 --> 01:27:47,494 Da? 1692 01:27:47,494 --> 01:27:49,458 >> Audiența: [inaudibil]? 1693 01:27:49,458 --> 01:27:51,075 >> ROB: De ce este ceea ce? 1694 01:27:51,075 --> 01:27:52,920 >> Audiența: [inaudibil]? 1695 01:27:52,920 --> 01:27:55,240 >> ROB: De ce este acest indicator de 4 bytes? 1696 01:27:55,240 --> 01:27:58,500 Deci, există o grămadă din 0 in fata de acest lucru. 1697 01:27:58,500 --> 01:28:03,740 Deci, este într-adevăr 0x0000000123. 1698 01:28:03,740 --> 01:28:06,510 Pe un sistem pe 64 de biți, nu ar fi o grămadă de mai multe zerouri. 1699 01:28:06,510 --> 01:28:11,410 1700 01:28:11,410 --> 01:28:11,900 Da? 1701 01:28:11,900 --> 01:28:13,150 >> Audiența: [inaudibil]. 1702 01:28:13,150 --> 01:28:17,290 1703 01:28:17,290 --> 01:28:21,130 >> ROB: Deci, primul printf se va print-- 1704 01:28:21,130 --> 01:28:21,980 >> Audiența: [inaudibil]. 1705 01:28:21,980 --> 01:28:24,420 >> ROB: Da, o să imprime ceea ce x se indică spre. 1706 01:28:24,420 --> 01:28:27,030 1707 01:28:27,030 --> 01:28:29,070 Star spune ce este aceasta lucru indică spre. 1708 01:28:29,070 --> 01:28:30,300 Prinde-l. 1709 01:28:30,300 --> 01:28:31,455 Deci, ceea ce este ea indică spre? 1710 01:28:31,455 --> 01:28:31,850 50. 1711 01:28:31,850 --> 01:28:32,410 Prinde-l. 1712 01:28:32,410 --> 01:28:33,390 Asta e ceea ce am de gând să-l imprimați. 1713 01:28:33,390 --> 01:28:37,020 Întrucât, cea viitoare, suntem doar imprimarea x sine. 1714 01:28:37,020 --> 01:28:38,850 Ce este în interiorul de f? 1715 01:28:38,850 --> 01:28:43,710 0x123. 1716 01:28:43,710 --> 01:28:44,500 OK. 1717 01:28:44,500 --> 01:28:46,620 >> Și apoi, în sfârșit, avem liber. 1718 01:28:46,620 --> 01:28:48,040 Ce vom trece la libera? 1719 01:28:48,040 --> 01:28:49,470 Trecem x. 1720 01:28:49,470 --> 01:28:52,380 Acest timp am afișat de fapt aceasta în cadrul stivei. 1721 01:28:52,380 --> 01:28:56,370 >> Deci, vom trece de valoarea 0x123 pentru a elibera. 1722 01:28:56,370 --> 01:28:59,070 Deci, acum gratuit știe, bine, Trebuie să mă duc până la grămada 1723 01:28:59,070 --> 01:29:00,050 și gratuit, care memorie. 1724 01:29:00,050 --> 01:29:03,920 Este nu mai folosește ceea ce este la adresa 0x123. 1725 01:29:03,920 --> 01:29:07,010 >> Deci, liber este de gând să elibereze că din grămada. 1726 01:29:07,010 --> 01:29:09,490 Acum morman noastră este din nou gol. 1727 01:29:09,490 --> 01:29:11,120 Nu avem pierderi de memorie. 1728 01:29:11,120 --> 01:29:12,940 Acum, liber va reveni. 1729 01:29:12,940 --> 01:29:16,130 Observați că x este încă 0x123. 1730 01:29:16,130 --> 01:29:18,240 Dar asta nu este acum valabil memorie. 1731 01:29:18,240 --> 01:29:21,220 1732 01:29:21,220 --> 01:29:23,986 Ar trebui să nu mai dereference x. 1733 01:29:23,986 --> 01:29:24,440 Da? 1734 01:29:24,440 --> 01:29:27,240 >> Audiența: Este întoarce 0 redundant? 1735 01:29:27,240 --> 01:29:28,290 >> ROB: Este returen 0 redundant? 1736 01:29:28,290 --> 01:29:31,110 Da. 1737 01:29:31,110 --> 01:29:33,950 Ne-am pus ca acolo pentru că avem o revenire una pentru aer. 1738 01:29:33,950 --> 01:29:36,830 Deci, e ca, da, vă permite se numără revenirea la 0. 1739 01:29:36,830 --> 01:29:37,310 Da? 1740 01:29:37,310 --> 01:29:38,560 >> Audiența: [inaudibil]? 1741 01:29:38,560 --> 01:29:42,110 1742 01:29:42,110 --> 01:29:45,580 >> ROB: Deci, după x gratuite, ce se întâmplă dacă vom încerca să dereference indicatorul? 1743 01:29:45,580 --> 01:29:47,240 Este posibil ca nimic nu merge bine. 1744 01:29:47,240 --> 01:29:49,330 Este posibil ca vom primi în continuare 50. 1745 01:29:49,330 --> 01:29:53,590 >> Este posibil, de asemenea, că faptul că memoria este acum folosite pentru altceva. 1746 01:29:53,590 --> 01:29:57,140 Deci, este un comportament nedefinit. 1747 01:29:57,140 --> 01:30:00,772 Și nedefinit înseamnă nimic se poate întâmpla. 1748 01:30:00,772 --> 01:30:01,250 Da? 1749 01:30:01,250 --> 01:30:02,500 >> Audiența: [inaudibil]? 1750 01:30:02,500 --> 01:30:07,942 1751 01:30:07,942 --> 01:30:10,830 >> ROB: Nu, așa că dacă atribuiți x la altceva. 1752 01:30:10,830 --> 01:30:15,870 Deci, dacă aici am spus x este egal cu ceva malloc else-- 1753 01:30:15,870 --> 01:30:17,100 malloc dimensiune event-- 1754 01:30:17,100 --> 01:30:20,180 apoi că blocul inițial de memorie nu este eliberat. 1755 01:30:20,180 --> 01:30:21,490 Și l-am pierdut în mod oficial. 1756 01:30:21,490 --> 01:30:23,150 Aceasta este o scurgere de memorie. 1757 01:30:23,150 --> 01:30:25,090 Am pierdut toate referirile la acel bloc de memorie. 1758 01:30:25,090 --> 01:30:26,827 Deci, nu există nici un fel putem elibera vreodată. 1759 01:30:26,827 --> 01:30:32,074 1760 01:30:32,074 --> 01:30:36,630 OK, deci apoi să se întoarcă 0 mijloace făcut. 1761 01:30:36,630 --> 01:30:37,900 >> În regulă, așa overflow stack. 1762 01:30:37,900 --> 01:30:39,320 Care-i ideea aici? 1763 01:30:39,320 --> 01:30:41,210 Deci ține minte, morman se întâmplă în jos. 1764 01:30:41,210 --> 01:30:43,480 Stivă este în creștere. 1765 01:30:43,480 --> 01:30:48,000 Deci asta a fost exemplul de la curs, Cred că, în cazul în care principalul este doar de gând să 1766 01:30:48,000 --> 01:30:51,380 apela această funcție foo, care se va să se numească recursiv peste și 1767 01:30:51,380 --> 01:30:52,320 peste din nou. 1768 01:30:52,320 --> 01:30:55,370 >> Deci, stivă cadre sunt de gând să lucrează exact la fel. 1769 01:30:55,370 --> 01:30:58,130 Deci, vom începe cu principal ca rama stiva de jos. 1770 01:30:58,130 --> 01:31:02,000 Apoi principal se va numi foo, care este mergi la a lua un cadru stivă. 1771 01:31:02,000 --> 01:31:04,260 >> Apoi foo se va numi foo din nou, care urmeaza sa se 1772 01:31:04,260 --> 01:31:05,500 un alt cadru stivă. 1773 01:31:05,500 --> 01:31:08,270 Și apoi, din nou, și din nou, și din nou, și din nou, până când, în cele din urmă, vom rula 1774 01:31:08,270 --> 01:31:09,190 în grămada. 1775 01:31:09,190 --> 01:31:11,990 Deci, acesta este modul în care ne un overflow stack. 1776 01:31:11,990 --> 01:31:14,910 Și la acest moment, vă SEG vina. 1777 01:31:14,910 --> 01:31:17,335 Sau te-ai într-adevăr vina seg înainte acest punct, dar, da. 1778 01:31:17,335 --> 01:31:19,660 >> Audiența: Este de bază groapa de gunoi același ca vina seg? 1779 01:31:19,660 --> 01:31:26,140 >> ROB: Deci, veți vedea de segmentare core vina fac obiectul unui dumping. 1780 01:31:26,140 --> 01:31:28,760 Ai un depozit central în tu Seg vina. 1781 01:31:28,760 --> 01:31:32,580 Și e ca o groapa de toate conținutul de memorie curent, astfel încât 1782 01:31:32,580 --> 01:31:36,670 pe care le puteți încerca și de a identifica de ce Seg acuzat. 1783 01:31:36,670 --> 01:31:37,135 Da? 1784 01:31:37,135 --> 01:31:38,385 >> Audiența: [inaudibil]? 1785 01:31:38,385 --> 01:31:40,855 1786 01:31:40,855 --> 01:31:45,460 >> ROB: Deci, un mijloc de eroare de segmentare există o depășire stack. 1787 01:31:45,460 --> 01:31:47,060 Deci, nu neapărat. 1788 01:31:47,060 --> 01:31:49,880 O eroare de segmentare înseamnă că ești memorie atinge într-un mod 1789 01:31:49,880 --> 01:31:50,880 tu nu ar trebui să fie. 1790 01:31:50,880 --> 01:31:54,750 Deci, într-un fel de care se întâmplă este, când tu Stack Overflow, vom începe emoționant 1791 01:31:54,750 --> 01:31:58,736 memorie într-un mod pe care noi nu ar trebui să fie. 1792 01:31:58,736 --> 01:31:59,208 Da? 1793 01:31:59,208 --> 01:32:00,458 >> Audiența: [inaudibil]? 1794 01:32:00,458 --> 01:32:03,456 1795 01:32:03,456 --> 01:32:05,830 >> ROB: Deci, în interiorul de o buclă infinită. 1796 01:32:05,830 --> 01:32:08,770 Cum ar fi, aceasta este ca un infinit recursive buclă și astfel vom obține un alt 1797 01:32:08,770 --> 01:32:09,770 stivă cadru de fiecare dată. 1798 01:32:09,770 --> 01:32:13,540 Dar, doar în interiorul unui regulat infinit în timp ce unu-- 1799 01:32:13,540 --> 01:32:16,390 bine, hai să nu mai imprime F-- 1800 01:32:16,390 --> 01:32:17,040 face ceva. 1801 01:32:17,040 --> 01:32:18,390 Oricare ar fi. 1802 01:32:18,390 --> 01:32:20,610 >> Noi nu vom fi obtinerea un alt cadru stivă. 1803 01:32:20,610 --> 01:32:22,530 Mergem doar pentru a păstra looping peste această instrucțiune singur. 1804 01:32:22,530 --> 01:32:23,920 Stiva nu este în creștere. 1805 01:32:23,920 --> 01:32:27,290 Este faptul că fiecare recursiv apel este oferindu-ne un cadru stivă. 1806 01:32:27,290 --> 01:32:31,231 De aceea, avem un overflow stack. 1807 01:32:31,231 --> 01:32:31,728 Da? 1808 01:32:31,728 --> 01:32:38,189 >> Audiența: Deci, dacă ai spus pentru a obține în timp ce buclă și apoi [neauzit]? 1809 01:32:38,189 --> 01:32:42,000 >> ROB: Deci, dacă în interiorul buclei în timp ce a existat o printf, tot ar fi 1810 01:32:42,000 --> 01:32:42,790 vina nu seg. 1811 01:32:42,790 --> 01:32:46,090 Pur și simplu nu am vrut să confunde lucrurile. 1812 01:32:46,090 --> 01:32:46,610 Ar fi bucla. 1813 01:32:46,610 --> 01:32:48,225 Ai primi un singur teanc cadru pentru printf. 1814 01:32:48,225 --> 01:32:49,580 >> Apoi printf se va întoarce. 1815 01:32:49,580 --> 01:32:50,280 Apoi, ar fi din nou buclă. 1816 01:32:50,280 --> 01:32:51,460 Ai primi un singur teanc cadru pentru printf. 1817 01:32:51,460 --> 01:32:52,850 Se va întoarce. 1818 01:32:52,850 --> 01:32:54,060 Cadru stivă unică. 1819 01:32:54,060 --> 01:33:00,215 Deci nu vei primi acest infinit piling sus cadre stiva. 1820 01:33:00,215 --> 01:33:03,185 >> Audiența: [inaudibil]? 1821 01:33:03,185 --> 01:33:04,040 >> ROB: Da. 1822 01:33:04,040 --> 01:33:09,360 Deci, acest overflow stack se întâmplă pentru că nici una dintre aceste 1823 01:33:09,360 --> 01:33:11,600 apeluri către foo se întorc. 1824 01:33:11,600 --> 01:33:15,250 Deci, dacă ne-am întoarce, atunci ne-ar începe a pierde cadre stiva. 1825 01:33:15,250 --> 01:33:17,870 Și atunci nu ne-ar Stack Overflow. 1826 01:33:17,870 --> 01:33:20,070 Și de aceea ai nevoie de un caz de bază pentru funcțiile personale. 1827 01:33:20,070 --> 01:33:22,992 1828 01:33:22,992 --> 01:33:23,479 Da? 1829 01:33:23,479 --> 01:33:27,375 >> Audiența: Este de mărimea potențială și stiva pentru heap aceeași pentru 1830 01:33:27,375 --> 01:33:29,880 toate programele? 1831 01:33:29,880 --> 01:33:31,910 >> ROB: Aproximativ. 1832 01:33:31,910 --> 01:33:35,090 Este de mărimea potențială a stivei și heap la fel pentru toate programele? 1833 01:33:35,090 --> 01:33:37,180 Aproximativ. 1834 01:33:37,180 --> 01:33:40,080 Există unele randomizare a unde începe stivă și 1835 01:33:40,080 --> 01:33:42,400 în cazul în care grămada începe. 1836 01:33:42,400 --> 01:33:45,870 Dacă se întâmplă să aveți o mulțime de variabile globale și lucruri, s-ar putea 1837 01:33:45,870 --> 01:33:49,520 ia de la un spațiu pentru heap dumneavoastră. 1838 01:33:49,520 --> 01:33:54,060 >> Pe un sistem pe 64 de biți, aveți practic au memorie infinit. 1839 01:33:54,060 --> 01:33:55,820 Nu e doar atât de mult. 1840 01:33:55,820 --> 01:33:59,250 Între 32 de biți și 64 de biți, care este o diferență semnificativă. 1841 01:33:59,250 --> 01:34:02,350 >> Vei obține un întreg lot mai mult stiva și spațiu grămadă pe un 64-bit 1842 01:34:02,350 --> 01:34:05,810 sistem pentru că nu e doar mai mult adrese pe care le pot folosi. 1843 01:34:05,810 --> 01:34:09,360 Dar, pe un sistem individual, se va fi aproximativ aceeași cantitate de stivă 1844 01:34:09,360 --> 01:34:10,785 și spațiu grămadă. 1845 01:34:10,785 --> 01:34:13,635 1846 01:34:13,635 --> 01:34:15,530 În regulă. 1847 01:34:15,530 --> 01:34:18,220 >> Deci, ultimul lucru este compilare. 1848 01:34:18,220 --> 01:34:19,810 Deci, ar trebui să știi acest proces. 1849 01:34:19,810 --> 01:34:22,240 Există patru pași mari. 1850 01:34:22,240 --> 01:34:24,400 Deci, prima ar trebui să fi ușor de ținut minte. 1851 01:34:24,400 --> 01:34:25,085 Pre-procesare. 1852 01:34:25,085 --> 01:34:28,390 Ea are prefixul pre în ea. 1853 01:34:28,390 --> 01:34:32,080 Deci, este vorba, înainte de orice altceva. 1854 01:34:32,080 --> 01:34:34,000 >> Lucru de retinut este hash. 1855 01:34:34,000 --> 01:34:37,250 Deci, hash definește și hash include în toate. 1856 01:34:37,250 --> 01:34:39,560 Acestea sunt toate pre-procesor directive. 1857 01:34:39,560 --> 01:34:42,030 Acestea sunt lucrurile pe care pre-procesor are grijă de. 1858 01:34:42,030 --> 01:34:43,680 >> Deci, ce face un pre-procesor? 1859 01:34:43,680 --> 01:34:44,850 Este un lucru foarte prost. 1860 01:34:44,850 --> 01:34:49,380 Tot ce e capabil sunt toate de acestea copiere, și tăiate, și pastă de operațiuni. 1861 01:34:49,380 --> 01:34:51,790 >> Deci, hash include standard de I0 punct de ore. 1862 01:34:51,790 --> 01:34:52,990 Ce este faptul că face? 1863 01:34:52,990 --> 01:34:56,610 Este hapsân standard i0 dot h fișier și să îl inserați în partea de sus 1864 01:34:56,610 --> 01:34:58,960 ori de câte ori se spune hash include standard de i0 punct de ore. 1865 01:34:58,960 --> 01:35:02,480 >> Și orice hash defini care le-am văzut, ce este că face? 1866 01:35:02,480 --> 01:35:06,730 Copierea sa valoarea pe care hash definit este definit ca și lipire că 1867 01:35:06,730 --> 01:35:08,500 ori de câte ori îl utilizați valoarea. 1868 01:35:08,500 --> 01:35:13,400 Deci preprocesor doar face într-adevăr operațiunile bazate pe text simplu. 1869 01:35:13,400 --> 01:35:15,870 Ea nu face nimic inteligent. 1870 01:35:15,870 --> 01:35:18,920 Deci, orice altceva este mai complicată. 1871 01:35:18,920 --> 01:35:22,970 >> Deci, acum că preprocesor este făcut, am de fapt compila. 1872 01:35:22,970 --> 01:35:24,320 Deci, ceea ce nu înseamnă compilarea? 1873 01:35:24,320 --> 01:35:27,310 Acum vom cod de c la codul de asamblare. 1874 01:35:27,310 --> 01:35:27,570 Da? 1875 01:35:27,570 --> 01:35:28,820 >> Audiența: [inaudibil]? 1876 01:35:28,820 --> 01:35:32,390 1877 01:35:32,390 --> 01:35:34,220 >> ROB: Da, ne-am prins că. 1878 01:35:34,220 --> 01:35:36,880 1879 01:35:36,880 --> 01:35:38,660 Deci, compilarea. 1880 01:35:38,660 --> 01:35:40,310 Vom de la c la adunare. 1881 01:35:40,310 --> 01:35:42,470 Deci, aceasta este o schimbare limbaj actual. 1882 01:35:42,470 --> 01:35:45,240 Compilarea se înseamnă trecerea de la un limbaj de nivel mai ridicat de 1883 01:35:45,240 --> 01:35:47,340 un limbaj de nivel inferior. 1884 01:35:47,340 --> 01:35:50,720 >> Și c este un limbaj de nivel înalt în comparație cu asamblare. 1885 01:35:50,720 --> 01:35:52,320 Ce este de asamblare? 1886 01:35:52,320 --> 01:35:56,440 Instrucțiunile sale, care sunt, destul de mult, a făcut pentru CPU. 1887 01:35:56,440 --> 01:35:59,130 Dar computerul încă nu nu inteleg de asamblare. 1888 01:35:59,130 --> 01:36:01,570 Se înțelege numai unu și zero. 1889 01:36:01,570 --> 01:36:06,160 Deci, urmatorul pas este de asamblare, care ne aduce din aceste instrucțiuni care 1890 01:36:06,160 --> 01:36:08,760 CPU-ul înțelege și de fapt le traduce, la 1891 01:36:08,760 --> 01:36:10,820 cei și zerouri. 1892 01:36:10,820 --> 01:36:13,570 >> Deci C la asamblare la binar. 1893 01:36:13,570 --> 01:36:15,870 Dar nu am un executabil încă. 1894 01:36:15,870 --> 01:36:19,550 Deci, cred că a bibliotecii CS50. 1895 01:36:19,550 --> 01:36:23,070 Am furnizat cu un binar pentru această bibliotecă CS50, care are getString 1896 01:36:23,070 --> 01:36:24,400 și getint și tot ce. 1897 01:36:24,400 --> 01:36:25,700 >> Dar CS50 library-- 1898 01:36:25,700 --> 01:36:27,650 în și de itself-- nu este executabil. 1899 01:36:27,650 --> 01:36:29,570 Ea nu are o funcție principală. 1900 01:36:29,570 --> 01:36:32,230 E doar o grămadă de binar pe care le puteți folosi. 1901 01:36:32,230 --> 01:36:41,730 Deci, de legătură este modul în care ne aduce împreună toți din aceste diferite fișiere binare 1902 01:36:41,730 --> 01:36:43,110 într-un executabil real. 1903 01:36:43,110 --> 01:36:45,900 Una pe care aveți posibilitatea să tastați punct slash un punct afară. 1904 01:36:45,900 --> 01:36:51,660 >> Deci, acest lucru este ca fișierul pe care a scris, - indiferent de programul este-- 1905 01:36:51,660 --> 01:36:53,620 Ceaser punct c. 1906 01:36:53,620 --> 01:36:55,100 Dar acum că a fost compilat până la binar. 1907 01:36:55,100 --> 01:36:56,480 Deci, Ceaser punct o. 1908 01:36:56,480 --> 01:36:59,620 Și acest lucru este CS50 nostru biblioteci binar. 1909 01:36:59,620 --> 01:37:02,284 Și că sunt combinate într-un singur executabil. 1910 01:37:02,284 --> 01:37:02,758 Da? 1911 01:37:02,758 --> 01:37:04,008 >> Audiența: [inaudibil]? 1912 01:37:04,008 --> 01:37:08,800 1913 01:37:08,800 --> 01:37:12,710 >> ROB: includ Deci în primul rând, amintiți-vă, hash includ este de fapt o 1914 01:37:12,710 --> 01:37:13,810 pre-procesor pas. 1915 01:37:13,810 --> 01:37:14,750 Dar asta e separat. 1916 01:37:14,750 --> 01:37:20,730 Dacă nu utilizați funcții care sunt în afara fișierului singur, atunci, 1917 01:37:20,730 --> 01:37:26,100 Nu, nu aveți nevoie pentru a lega nimic din moment ce ai totul. 1918 01:37:26,100 --> 01:37:30,310 >> Asta a spus, printf este legat în. 1919 01:37:30,310 --> 01:37:32,820 Dacă utilizați niciodată printf, asta e ceva care trebuie să fie legate în 1920 01:37:32,820 --> 01:37:35,740 pentru că nu a scris asta. 1921 01:37:35,740 --> 01:37:39,530 Și, de fapt, este în mod automat printf legate în. 1922 01:37:39,530 --> 01:37:42,760 Știi cât de la linia de comandă sau când ce tastați face, veți vedea o ai 1923 01:37:42,760 --> 01:37:46,690 bord l CS50, care are legătură în biblioteca CS50? 1924 01:37:46,690 --> 01:37:49,070 Printf, și chestii de genul asta, se întâmplă să fie legate în mod automat. 1925 01:37:49,070 --> 01:37:51,730 1926 01:37:51,730 --> 01:37:53,930 Orice alte întrebări cu privire la nimic? 1927 01:37:53,930 --> 01:37:56,280 >> Audiența: [inaudibil]? 1928 01:37:56,280 --> 01:37:58,300 >> ROB: Legarea? 1929 01:37:58,300 --> 01:38:03,450 Avem o grămadă de diferite fișiere binare. 1930 01:38:03,450 --> 01:38:06,410 Acesta este un exemplu canonic pe care le folosim este biblioteca CS50. 1931 01:38:06,410 --> 01:38:09,960 Am compilat și administrat de binar pentru această bibliotecă CS50. 1932 01:38:09,960 --> 01:38:12,410 >> Doriți să utilizați getString în programul tău. 1933 01:38:12,410 --> 01:38:14,750 Deci, tu du-te și de a folosi getString. 1934 01:38:14,750 --> 01:38:19,700 Dar, fără codul meu binar pentru GetString, atunci când vă compila codul 1935 01:38:19,700 --> 01:38:23,140 jos, nu puteți rula de fapt, dumneavoastră Programul pentru getString String este 1936 01:38:23,140 --> 01:38:25,080 nu încă complet definit. 1937 01:38:25,080 --> 01:38:29,220 >> Este doar atunci când vă conectați în binar mea care conține getString că acum, toate 1938 01:38:29,220 --> 01:38:31,130 Bine, poate de fapt executa getString. 1939 01:38:31,130 --> 01:38:32,330 Dosarul meu este complet. 1940 01:38:32,330 --> 01:38:34,208 Și eu pot rula acest lucru. 1941 01:38:34,208 --> 01:38:34,697 Da? 1942 01:38:34,697 --> 01:38:37,631 >> Audiența: Are legătură între converti binar executabil a? 1943 01:38:37,631 --> 01:38:42,032 Deci, chiar dacă nu aveți alte biblioteci, nu ar mai fi 1944 01:38:42,032 --> 01:38:44,477 necesare pentru a traduce [neauzit]? 1945 01:38:44,477 --> 01:38:48,640 >> ROB: Deci, un executabil este încă în binar. 1946 01:38:48,640 --> 01:38:51,750 Doar combinând un întreg buchet de binare. 1947 01:38:51,750 --> 01:38:55,124 1948 01:38:55,124 --> 01:38:56,591 >> Audiența: Vă mulțumesc foarte mult. 1949 01:38:56,591 --> 01:38:58,560 >> ROB: Nici o problema. 1950 01:38:58,560 --> 01:38:59,540 Orice alte întrebări? 1951 01:38:59,540 --> 01:39:02,001 În caz contrar, suntem gata. 1952 01:39:02,001 --> 01:39:02,690 În regulă. 1953 01:39:02,690 --> 01:39:02,990 Multumesc. 1954 01:39:02,990 --> 01:39:03,590 >> [Aplauze] 1955 01:39:03,590 --> 01:39:04,490 >> Audiența: Mulțumesc. 1956 01:39:04,490 --> 01:39:05,740 >> ROB: Da. 1957 01:39:05,740 --> 01:39:06,582