1 00:00:00,000 --> 00:00:06,030 >> [MUSIC JOC] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: indicii, iată-ne. 3 00:00:08,390 --> 00:00:11,080 Acest lucru este, probabil, va fi cel mai dificil subiect 4 00:00:11,080 --> 00:00:12,840 că vorbim despre în CS50. 5 00:00:12,840 --> 00:00:15,060 Și dacă ați citit nimic despre indicii 6 00:00:15,060 --> 00:00:19,080 înainte de a putea fi un pic intimidare a intra în acest videoclip. 7 00:00:19,080 --> 00:00:21,260 E adevărat indicii nu permiteți capacitatea 8 00:00:21,260 --> 00:00:23,740 să șurub sus, probabil, destul de rău atunci când sunteți 9 00:00:23,740 --> 00:00:27,450 de lucru cu variabile, și date, și cauzând programul sa se prabuseasca. 10 00:00:27,450 --> 00:00:30,490 Dar sunt de fapt foarte util și ne-au un mod foarte mare permite 11 00:00:30,490 --> 00:00:33,340 pentru a trece de date înapoi și înapoi între funcții, 12 00:00:33,340 --> 00:00:35,490 că suntem altfel în imposibilitatea de a face. 13 00:00:35,490 --> 00:00:37,750 >> Și așa mai departe ceea ce suntem cu adevarat vrei sa faci aici este trenul 14 00:00:37,750 --> 00:00:41,060 tine de a avea disciplina bun indicator, așa pe care le puteți utiliza în mod eficient indicii 15 00:00:41,060 --> 00:00:43,850 pentru a face programele că mult mai bine. 16 00:00:43,850 --> 00:00:48,220 Așa cum am spus indicii ne dau un alt modalitate de a trece de date între funcții. 17 00:00:48,220 --> 00:00:50,270 Acum, dacă vă amintiți de la un film mai devreme, atunci când 18 00:00:50,270 --> 00:00:53,720 am vorbit despre domeniul de aplicare variabil, am menționat 19 00:00:53,720 --> 00:01:00,610 că toate datele pe care le trece între funcții în C este trecut prin valoare. 20 00:01:00,610 --> 00:01:03,070 Și eu nu pot fi utilizate ca pe termen lung, ceea ce am vrut să spun că 21 00:01:03,070 --> 00:01:07,170 a fost că trecem de copii ale datelor. 22 00:01:07,170 --> 00:01:12,252 Când trecem o variabilă la o funcție, nu suntem de fapt trece variabila 23 00:01:12,252 --> 00:01:13,210 la funcția, nu? 24 00:01:13,210 --> 00:01:17,670 Suntem trece o copie a că datele pentru funcția. 25 00:01:17,670 --> 00:01:20,760 Funcția face ceea ce va și calculează o valoare, 26 00:01:20,760 --> 00:01:23,180 și poate vom folosi această valoare atunci când dă înapoi. 27 00:01:23,180 --> 00:01:26,700 >> Nu a fost o excepție de la această regulă de trece prin valoare, 28 00:01:26,700 --> 00:01:31,210 și vom reveni la ceea ce că este un pic mai târziu în acest film. 29 00:01:31,210 --> 00:01:34,880 Dacă vom folosi în schimb indicii de a folosi variabile, 30 00:01:34,880 --> 00:01:38,180 sau în locul folosirii variabilelor ei sau copii ale variabilelor, 31 00:01:38,180 --> 00:01:43,790 putem trece acum variabilele din jurul între funcțiile într-un mod diferit. 32 00:01:43,790 --> 00:01:46,550 Acest lucru înseamnă că, dacă facem o schimbare într-o singură funcție, 33 00:01:46,550 --> 00:01:49,827 că schimbarea va avea de fapt efect într-o funcție diferită. 34 00:01:49,827 --> 00:01:52,160 Din nou, acest lucru este ceva care nu am putea face anterior, 35 00:01:52,160 --> 00:01:56,979 și dacă ați încercat vreodată să swap Valoarea de două variabile într-o funcție, 36 00:01:56,979 --> 00:01:59,270 ai observat această problemă un fel de târâtor în sus, nu? 37 00:01:59,270 --> 00:02:04,340 >> Dacă vrem să facă schimb de X și Y, iar noi le trece la o funcție numită de swap, 38 00:02:04,340 --> 00:02:08,680 în interiorul a funcției swap variabile face valori de schimb. 39 00:02:08,680 --> 00:02:12,600 Unul devine doi, doua devine o, dar nu face de fapt 40 00:02:12,600 --> 00:02:16,890 schimba nimic în original funcție, în apelantul. 41 00:02:16,890 --> 00:02:19,550 Pentru că nu putem, suntem doar de lucru cu copii ale acestora. 42 00:02:19,550 --> 00:02:24,760 Cu indicii, deși, putem treci de fapt X și Y la o funcție. 43 00:02:24,760 --> 00:02:26,960 Această funcție se poate face ceva cu ei. 44 00:02:26,960 --> 00:02:29,250 Și aceste valori variabile se poate schimba de fapt. 45 00:02:29,250 --> 00:02:33,710 Așa că e destul de o schimbare în capacitatea noastra de a lucra cu date. 46 00:02:33,710 --> 00:02:36,100 >> Înainte de a se arunca cu capul în indicii, cred că merită 47 00:02:36,100 --> 00:02:38,580 luând câteva minute până la du-te înapoi la elementele de bază aici. 48 00:02:38,580 --> 00:02:41,000 Și au o privire la modul Lucrari de memorie de calculator 49 00:02:41,000 --> 00:02:45,340 pentru că aceste două subiecte sunt de gând pentru a fi de fapt destul de interdependente. 50 00:02:45,340 --> 00:02:48,480 După cum probabil știți, pe sistemul de computer 51 00:02:48,480 --> 00:02:51,310 aveți un hard disk sau poate o unitate SSD, 52 00:02:51,310 --> 00:02:54,430 un fel de loc de depozitare de fișiere. 53 00:02:54,430 --> 00:02:57,950 Este, de obicei, undeva în cartier de 250 de gigabytes 54 00:02:57,950 --> 00:02:59,810 să poate un cuplu de terabytes acum. 55 00:02:59,810 --> 00:03:02,270 Și e în cazul în care toate dvs. fișiere în cele din urmă trăi, 56 00:03:02,270 --> 00:03:04,870 chiar și atunci când computerul este oprit off, îl puteți întoarce la 57 00:03:04,870 --> 00:03:09,190 și veți găsi fișierele sunt acolo din nou, atunci când reporniți sistemul. 58 00:03:09,190 --> 00:03:14,820 Dar unitățile de disc, cum ar fi o unitate hard disk, un HDD, sau o unitate SSD, un SSD, 59 00:03:14,820 --> 00:03:16,050 sunt spațiu de stocare doar. 60 00:03:16,050 --> 00:03:20,400 >> Nu putem face nimic cu de fapt, datele care se află în hard disk, 61 00:03:20,400 --> 00:03:22,080 sau într-o unitate SSD. 62 00:03:22,080 --> 00:03:24,950 În scopul de a schimba efectiv de date sau mutați-l în jurul valorii de, 63 00:03:24,950 --> 00:03:28,800 am să-l mute la RAM, memorie cu acces aleator. 64 00:03:28,800 --> 00:03:31,170 Acum RAM, aveți o mulțime mai puțin de pe computer. 65 00:03:31,170 --> 00:03:34,185 Este posibil să aveți undeva în cartier de 512 megaocteți 66 00:03:34,185 --> 00:03:38,850 dacă aveți un calculator mai vechi, la poate două, patru, opt, 16, 67 00:03:38,850 --> 00:03:41,820 eventual, chiar un pic mai mult, gigabytes de memorie RAM. 68 00:03:41,820 --> 00:03:46,390 Deci asta e mult mai mici, dar asta e unde toate datele volatile există. 69 00:03:46,390 --> 00:03:48,270 Asta e unde putem schimba lucrurile. 70 00:03:48,270 --> 00:03:53,350 Dar când ne întoarcem calculatorul nostru off, toate datele din memoria RAM este distrus. 71 00:03:53,350 --> 00:03:57,150 >> Deci, de aceea avem nevoie de hard disk pentru localizarea permanentă a acestuia, 72 00:03:57,150 --> 00:03:59,720 astfel încât să exists- aceasta ar fi foarte rău dacă de fiecare dată când 73 00:03:59,720 --> 00:04:03,310 transformat calculatorul nostru oprit, fiecare fișier în sistemul nostru a fost șters. 74 00:04:03,310 --> 00:04:05,600 Așa că am de lucru în interiorul RAM. 75 00:04:05,600 --> 00:04:09,210 Și de fiecare dată când vorbim despre memorie, destul de mult, în CS50, 76 00:04:09,210 --> 00:04:15,080 vorbim despre RAM, nu pe hard disk. 77 00:04:15,080 --> 00:04:18,657 >> Așa că atunci când ne-am muta lucrurile în memorie, este nevoie de o anumită cantitate de spațiu. 78 00:04:18,657 --> 00:04:20,740 Toate tipurile de date care am fost de lucru cu 79 00:04:20,740 --> 00:04:23,480 ia diferite cantități de spațiu în memoria RAM. 80 00:04:23,480 --> 00:04:27,600 Deci, de fiecare dată când creați un număr întreg variabile, patru bytes de memorie 81 00:04:27,600 --> 00:04:30,750 sunt retrase din circuitul agricol în memoria RAM, astfel încât să poate lucra cu asta întreg. 82 00:04:30,750 --> 00:04:34,260 Puteți declara întreg, schimba-l, ea atribuie 83 00:04:34,260 --> 00:04:36,700 la o valoare de 10 incrementat câte unul, așa mai departe și așa mai departe. 84 00:04:36,700 --> 00:04:39,440 Tot ce trebuie să se întâmple în RAM, și veți obține patru octeți 85 00:04:39,440 --> 00:04:42,550 pentru a lucra cu pentru fiecare întreg pe care le creați. 86 00:04:42,550 --> 00:04:45,410 >> Fiecare personaj vă crea devine un octet. 87 00:04:45,410 --> 00:04:48,160 Asta e doar cât de mult spațiu este necesare pentru a stoca un caracter. 88 00:04:48,160 --> 00:04:51,310 Fiecare float, un adevărat numărul, devine patru bytes 89 00:04:51,310 --> 00:04:53,390 excepția cazului în care este un dublu precizie în virgulă mobilă 90 00:04:53,390 --> 00:04:56,510 număr, care vă permite să au cifre mai precise sau mai multe 91 00:04:56,510 --> 00:04:59,300 după virgulă fără a pierde de precizie, 92 00:04:59,300 --> 00:05:01,820 care ia opt bytes de memorie. 93 00:05:01,820 --> 00:05:06,730 Tânjește lungi, numere întregi foarte mari, De asemenea, ia opt bytes de memorie. 94 00:05:06,730 --> 00:05:09,000 Câte bytes de memorie nu siruri de caractere ia? 95 00:05:09,000 --> 00:05:12,990 Ei bine, să punem un ac în această întrebare pentru acum, dar vom reveni la ea. 96 00:05:12,990 --> 00:05:17,350 >> Deci, înapoi la această idee de memorie ca o gamă mare de celule-octet dimensiuni. 97 00:05:17,350 --> 00:05:20,871 Asta e într-adevăr tot ce este, e doar o gamă foarte mare de celule, 98 00:05:20,871 --> 00:05:23,370 la fel ca orice alt matrice care esti familiarizat cu și să vedem, 99 00:05:23,370 --> 00:05:26,430 cu excepția fiecare element este un octet larg. 100 00:05:26,430 --> 00:05:30,030 Și la fel ca o matrice, fiecare element are o adresă. 101 00:05:30,030 --> 00:05:32,120 Fiecare element al unui tablou are un index, iar noi 102 00:05:32,120 --> 00:05:36,302 poate folosi ca index pentru a face așa-numitele acces aleatoriu pe matrice. 103 00:05:36,302 --> 00:05:38,510 Noi nu trebuie să înceapă de la începutul matrice, 104 00:05:38,510 --> 00:05:40,569 repeta prin fiecare singur element al acestuia, 105 00:05:40,569 --> 00:05:41,860 pentru a găsi ceea ce căutați. 106 00:05:41,860 --> 00:05:45,790 Putem spune doar, vreau să ajung la Elementul 15 sau elementul 100. 107 00:05:45,790 --> 00:05:49,930 Și tu poți trece doar în acest număr și pentru a obține valoarea pe care îl căutați. 108 00:05:49,930 --> 00:05:54,460 >> În mod similar fiecare locație în memorie are o adresă. 109 00:05:54,460 --> 00:05:57,320 Deci, memoria ar putea arata ceva de genul asta. 110 00:05:57,320 --> 00:06:01,420 Iată o foarte mică bucată de memorie, aceasta este de 20 de bytes de memorie. 111 00:06:01,420 --> 00:06:04,060 Primii 20 de octeți din cauza mea adresează acolo în partea inferioară 112 00:06:04,060 --> 00:06:08,890 sunt 0, 1, 2, 3, și așa pe tot drumul până la 19. 113 00:06:08,890 --> 00:06:13,190 Și când am declara variabile și când am început să lucrez cu ei, 114 00:06:13,190 --> 00:06:15,470 sistemul va seta deoparte un spațiu pentru mine 115 00:06:15,470 --> 00:06:17,595 în această memorie pentru a lucra cu variabile mele. 116 00:06:17,595 --> 00:06:21,610 Așa că s-ar putea spune, char c este egal cu capitalul H. Și ce se va întâmpla? 117 00:06:21,610 --> 00:06:23,880 Ei bine, sistemul este de gând să retrase din circuitul agricol pentru mine un octet. 118 00:06:23,880 --> 00:06:27,870 În acest caz, a ales numărul octet patru, octet la adresa de patru, 119 00:06:27,870 --> 00:06:31,310 si va pentru a stoca H majusculă acolo pentru mine. 120 00:06:31,310 --> 00:06:34,350 Dacă spun atunci viteza int limită este egal cu 65 de ani, e 121 00:06:34,350 --> 00:06:36,806 O să anuleze patru bytes de memorie pentru mine. 122 00:06:36,806 --> 00:06:39,180 Și o să trateze pe cei patru octeți ca o singură unitate 123 00:06:39,180 --> 00:06:41,305 pentru că ceea ce lucrăm cu este un număr întreg de aici. 124 00:06:41,305 --> 00:06:44,350 Si va stoca 65 acolo. 125 00:06:44,350 --> 00:06:47,000 >> Acum deja sunt un fel de vă spun un pic de o minciună, 126 00:06:47,000 --> 00:06:50,150 Bine, pentru că știm că computere lucrează în binar. 127 00:06:50,150 --> 00:06:53,100 Ei nu înțeleg în mod necesar ceea ce un capital H este 128 00:06:53,100 --> 00:06:57,110 sau ceea ce o 65 de ani este, numai ei înțelege binare, zerouri și cele. 129 00:06:57,110 --> 00:06:59,000 Și așa mai departe, de fapt ceea ce suntem stocarea acolo 130 00:06:59,000 --> 00:07:03,450 nu este litera H și numărul de 65 de ani, ci reprezentările binare 131 00:07:03,450 --> 00:07:06,980 acestuia, care arata o ceva de genul asta. 132 00:07:06,980 --> 00:07:10,360 Și în special în context al variabilei întreg, 133 00:07:10,360 --> 00:07:13,559 nu va doar o scuipe în, nu va să-l trateze ca o patru 134 00:07:13,559 --> 00:07:15,350 bucată octet necesar, se intampla de fapt 135 00:07:15,350 --> 00:07:19,570 să-l trateze ca patru una bucăți octet, care ar putea arata ceva de genul asta. 136 00:07:19,570 --> 00:07:22,424 Și chiar acest lucru nu este în întregime adevărat, fie, 137 00:07:22,424 --> 00:07:24,840 din cauza ceva numit un endianness, care nu suntem 138 00:07:24,840 --> 00:07:26,965 mergi la a lua în acum, dar Daca esti curios despre, 139 00:07:26,965 --> 00:07:29,030 puteți citi pe puțin și endianness mare. 140 00:07:29,030 --> 00:07:31,640 Dar de dragul acestui argument, de dragul acestui videoclip, 141 00:07:31,640 --> 00:07:34,860 hai să presupunem că este, în De fapt, modul în care numărul 65 ar fi 142 00:07:34,860 --> 00:07:36,970 fie reprezentate în de memorie pe fiecare sistem, 143 00:07:36,970 --> 00:07:38,850 deși nu este în întregime adevărat. 144 00:07:38,850 --> 00:07:41,700 >> Dar să fapt chiar a lua scăpa de toate binare în întregime, 145 00:07:41,700 --> 00:07:44,460 și cred că doar despre cum H și 65 de ani, este mult mai ușor 146 00:07:44,460 --> 00:07:47,900 să se gândească la ea ca care ca o ființă umană. 147 00:07:47,900 --> 00:07:51,420 Bine, asa ca, de asemenea, pare poate o puțin aleatoriu care I've- sistemul meu 148 00:07:51,420 --> 00:07:55,130 nu mi-a dat bytes 5, 6, 7, și 8 pentru a stoca un număr întreg. 149 00:07:55,130 --> 00:07:58,580 E un motiv pentru care, de asemenea, care nu vom intra în chiar acum, dar suficient 150 00:07:58,580 --> 00:08:00,496 să spunem că ceea ce calculator este de a face aici 151 00:08:00,496 --> 00:08:02,810 este, probabil, o miscare buna din partea sa. 152 00:08:02,810 --> 00:08:06,020 Pentru a nu-mi dai de memorie care este înapoi neapărat să înapoi. 153 00:08:06,020 --> 00:08:10,490 Deși este de gând să o fac acum dacă vreau să obțineți un alt șir, 154 00:08:10,490 --> 00:08:13,080 numit prenumele, și vreau pentru a pune Lloyd acolo. 155 00:08:13,080 --> 00:08:18,360 Am de gând să nevoie pentru a se potrivi o caracter, fiecare literă din care este 156 00:08:18,360 --> 00:08:21,330 O să solicite o caracter, un octet de memorie. 157 00:08:21,330 --> 00:08:26,230 Deci, dacă am putea pune Lloyd în matrice mea așa sunt destul de bun pentru a merge, nu? 158 00:08:26,230 --> 00:08:28,870 Ce lipsește? 159 00:08:28,870 --> 00:08:31,840 >> Amintiți-vă că fiecare șir lucrăm cu în C se încheie cu backslash la zero, 160 00:08:31,840 --> 00:08:33,339 și nu putem omite faptul că aici, fie. 161 00:08:33,339 --> 00:08:36,090 Avem nevoie să pună deoparte un octet de memorie să se constate că, astfel ne-am 162 00:08:36,090 --> 00:08:39,130 știu când șir noastră sa încheiat. 163 00:08:39,130 --> 00:08:41,049 Deci, din nou acest aranjament de modul în care lucrurile 164 00:08:41,049 --> 00:08:42,799 apar în puterea de memorie fi un pic aleatoriu, 165 00:08:42,799 --> 00:08:44,870 dar este de fapt modul în care majoritatea sistemelor sunt concepute. 166 00:08:44,870 --> 00:08:48,330 Pentru a le alinia pe multipli de patru, din motive nou 167 00:08:48,330 --> 00:08:50,080 că nu trebuie să intra in chiar acum. 168 00:08:50,080 --> 00:08:53,060 Dar acest lucru, astfel încât este suficient să spunem că După aceste trei linii de cod, 169 00:08:53,060 --> 00:08:54,810 acest lucru este ceea ce s-ar putea arata memorie ca. 170 00:08:54,810 --> 00:08:58,930 Dacă am nevoie de locații de memorie 4, 8, 12 și să dețină datele mele, 171 00:08:58,930 --> 00:09:01,100 acest lucru este ceea ce s-ar putea arata ca memoria mea. 172 00:09:01,100 --> 00:09:04,062 >> Și fi deosebit de pedant aici, atunci când 173 00:09:04,062 --> 00:09:06,020 vorbim despre memorie Noi, de obicei adrese 174 00:09:06,020 --> 00:09:08,390 face acest lucru folosind notații hexazecimale. 175 00:09:08,390 --> 00:09:12,030 Deci, de ce nu ne-am converti toate acestea de la zecimal la notație hexazecimală 176 00:09:12,030 --> 00:09:15,010 doar pentru că asta e, în general, cum ne referim la memorie. 177 00:09:15,010 --> 00:09:17,880 Deci, în loc de a fi 0 prin 19, ceea ce avem este zero 178 00:09:17,880 --> 00:09:20,340 X zero, prin zero x1 trei. 179 00:09:20,340 --> 00:09:23,790 Acestea sunt cele 20 de bytes de memorie pe care le au sau ne uitam la această imagine în 180 00:09:23,790 --> 00:09:25,540 chiar aici. 181 00:09:25,540 --> 00:09:29,310 >> Deci, toate acestea fiind spuse, hai să pas departe de memorie pentru un al doilea 182 00:09:29,310 --> 00:09:30,490 și înapoi la indicii. 183 00:09:30,490 --> 00:09:32,420 Aici este cel mai important lucru de retinut 184 00:09:32,420 --> 00:09:34,070 așa cum am începe să lucreze cu indicatori. 185 00:09:34,070 --> 00:09:36,314 Un pointer este nimic mai mult decât o adresă. 186 00:09:36,314 --> 00:09:38,230 Voi spune din nou că este atât de important, 187 00:09:38,230 --> 00:09:42,730 un pointer este nimic mai mult decât o adresă. 188 00:09:42,730 --> 00:09:47,760 Indicii sunt adrese către locații în memorie în cazul în care locuiesc variabile. 189 00:09:47,760 --> 00:09:52,590 Știind că acesta devine un sperăm pic mai ușor să lucreze cu ei. 190 00:09:52,590 --> 00:09:54,550 Un alt lucru îmi place de a face este de a avea un fel 191 00:09:54,550 --> 00:09:58,510 diagramelor vizual reprezintă ceea ce este întâmplă cu diverse linii de cod. 192 00:09:58,510 --> 00:10:00,660 Și vom face acest lucru un cuplu de ori în indicii, 193 00:10:00,660 --> 00:10:03,354 și atunci când vorbim despre dinamica alocare de memorie, de asemenea. 194 00:10:03,354 --> 00:10:06,020 Pentru că eu cred că aceste diagrame poate fi deosebit de utile. 195 00:10:06,020 --> 00:10:09,540 >> Deci, dacă spun, de exemplu, Int K în codul meu, ceea ce se întâmplă? 196 00:10:09,540 --> 00:10:12,524 Ei bine, ceea ce se întâmplă de fapt este Primesc memorie rezervată pentru mine, 197 00:10:12,524 --> 00:10:14,690 dar nu-mi place chiar cred despre ea ca asta, 198 00:10:14,690 --> 00:10:16,300 place să se gândească la el ca o cutie. 199 00:10:16,300 --> 00:10:20,090 Am o cutie și este de culoare verde, pentru că 200 00:10:20,090 --> 00:10:21,750 pot pune numere întregi în cutii verzi. 201 00:10:21,750 --> 00:10:23,666 Dacă ar fi fost un personaj I ar putea avea o cutie albastră. 202 00:10:23,666 --> 00:10:27,290 Dar eu spun întotdeauna, dacă am crea o cutie care poate stoca numere întregi 203 00:10:27,290 --> 00:10:28,950 cutia este de culoare verde. 204 00:10:28,950 --> 00:10:33,020 Și eu iau un marker permanent și scriu k de partea aceasta. 205 00:10:33,020 --> 00:10:37,590 Deci, am o cutie numită K, în care pot pune numere întregi. 206 00:10:37,590 --> 00:10:41,070 Așa că atunci când spun int k, asta e ceea ce se întâmplă în capul meu. 207 00:10:41,070 --> 00:10:43,140 Dacă spun k este egal cu cinci, ce fac? 208 00:10:43,140 --> 00:10:45,110 Ei bine, eu pun cinci centru, dreapta. 209 00:10:45,110 --> 00:10:48,670 Acest lucru este destul de simplă, în cazul în care Eu spun Int k, a crea o cutie numita k. 210 00:10:48,670 --> 00:10:52,040 Dacă spun k este egal cu 5, pus cinci în caseta. 211 00:10:52,040 --> 00:10:53,865 Să sperăm că asta nu e prea mult de un salt. 212 00:10:53,865 --> 00:10:55,990 Iată unde lucrurile nu merg un puțin interesant, deși. 213 00:10:55,990 --> 00:11:02,590 Dacă spun int * PK, bine, chiar dacă nu Știi ce înseamnă asta în mod necesar, 214 00:11:02,590 --> 00:11:06,150 se are în mod clar ceva de a face cu un număr întreg. 215 00:11:06,150 --> 00:11:08,211 Deci, am de gând să coloreze această casetă verde-ish, 216 00:11:08,211 --> 00:11:10,210 Știu că are ceva de a face cu un număr întreg, 217 00:11:10,210 --> 00:11:13,400 dar nu este un număr întreg de sine, pentru că este o stea Int. 218 00:11:13,400 --> 00:11:15,390 Nu e ceva ușor diferite cu privire la aceasta. 219 00:11:15,390 --> 00:11:17,620 Atât de implicat un număr întreg, a dar altfel e 220 00:11:17,620 --> 00:11:19,830 nu prea diferită de ce vorbeam. 221 00:11:19,830 --> 00:11:24,240 E o cutie, sa luat o etichetă, se poartă un PK etichetă, 222 00:11:24,240 --> 00:11:27,280 și este capabil să mențină stele int, oricare ar fi acestea sunt. 223 00:11:27,280 --> 00:11:29,894 Ei au ceva de a face cu numere întregi, în mod clar. 224 00:11:29,894 --> 00:11:31,060 Aici este ultima linie, deși. 225 00:11:31,060 --> 00:11:37,650 Dacă spun PK = & k, stai, ce sa întâmplat, nu? 226 00:11:37,650 --> 00:11:41,820 Deci, acest număr aleator, aparent aleator numărul, se aruncat în caseta de acolo. 227 00:11:41,820 --> 00:11:44,930 Tot ceea ce este, este PK primeste adresa de k. 228 00:11:44,930 --> 00:11:52,867 Deci, eu sunt lipit în cazul în care k locuiește în memorie, adresa, adresa de bytes sale. 229 00:11:52,867 --> 00:11:55,200 Tot ce fac este să spun că este ceea ce valoare am de gând 230 00:11:55,200 --> 00:11:59,430 pentru a pune în interiorul caseta mea a sunat PK. 231 00:11:59,430 --> 00:12:02,080 Și pentru că aceste lucruri sunt indicii, și pentru că în căutarea 232 00:12:02,080 --> 00:12:04,955 la un șir de zero ca X opt la zero c șapte patru opt 233 00:12:04,955 --> 00:12:07,790 doi de zero este, probabil, nu foarte semnificativ. 234 00:12:07,790 --> 00:12:12,390 Când ne-am vizualiza general indicii, am de fapt, acest lucru ca indicii. 235 00:12:12,390 --> 00:12:17,000 PK ne oferă informații trebuie să găsim k în memorie. 236 00:12:17,000 --> 00:12:19,120 Deci, practic PK are o săgeată în el. 237 00:12:19,120 --> 00:12:21,670 Și dacă umblăm lungimea de care săgeată, imaginați-vă 238 00:12:21,670 --> 00:12:25,280 e ceva ce se poate merge pe, dacă de mers pe jos de-a lungul săgeții, 239 00:12:25,280 --> 00:12:29,490 chiar la vârful săgeții pe care, noi va găsi locația în memorie 240 00:12:29,490 --> 00:12:31,390 unde k locuiește. 241 00:12:31,390 --> 00:12:34,360 Și asta e foarte important pentru că odată ce știm unde locuiește K, 242 00:12:34,360 --> 00:12:37,870 putem începe să lucreze cu datele în interiorul acestui locație de memorie. 243 00:12:37,870 --> 00:12:40,780 Deși primim o Teeny bit înainte de noi înșine pentru acum. 244 00:12:40,780 --> 00:12:42,240 >> Deci, ce este un pointer? 245 00:12:42,240 --> 00:12:45,590 Un pointer este un element de date a cărui valoare nu este o adresă de memorie. 246 00:12:45,590 --> 00:12:49,740 Asta a fost că de zero x opt lucruri la zero întâmplă, asta a fost o adresă de memorie. 247 00:12:49,740 --> 00:12:52,060 Asta a fost o locație în memorie. 248 00:12:52,060 --> 00:12:55,080 Și tipul unei pointer descrie natura 249 00:12:55,080 --> 00:12:56,930 de datele pe care le veți găsi la acea adresă de memorie. 250 00:12:56,930 --> 00:12:58,810 Deci nu e de partea dreaptă stea Int. 251 00:12:58,810 --> 00:13:03,690 Dacă am urma ca sageata, e O să mă conducă la o locație. 252 00:13:03,690 --> 00:13:06,980 Și acea locație, ceea ce am vor găsi acolo, în exemplul meu, 253 00:13:06,980 --> 00:13:08,240 este o cutie de culoare verde. 254 00:13:08,240 --> 00:13:12,650 E un număr întreg, asta e ceea ce am veți găsi, dacă mă duc la acea adresă. 255 00:13:12,650 --> 00:13:14,830 Tipul de date al unui pointer descrie ceea ce 256 00:13:14,830 --> 00:13:17,936 veți găsi la acea adresă de memorie. 257 00:13:17,936 --> 00:13:19,560 Deci, aici e lucru foarte cool, deși. 258 00:13:19,560 --> 00:13:25,090 Indicii ne permit sa treaca variabile între funcții. 259 00:13:25,090 --> 00:13:28,520 Și de fapt, trece variabile și nu trece copii ale acestora. 260 00:13:28,520 --> 00:13:32,879 Pentru că dacă știm exact unde în memorie pentru a găsi o variabilă, 261 00:13:32,879 --> 00:13:35,670 nu avem nevoie pentru a face o copie a aceasta, putem merge doar la acea locație 262 00:13:35,670 --> 00:13:37,844 și de a lucra cu acea variabilă. 263 00:13:37,844 --> 00:13:40,260 Deci, în esență indicii fel de a face un mediu de calculator 264 00:13:40,260 --> 00:13:42,360 mai mult ca lumea reală, nu. 265 00:13:42,360 --> 00:13:44,640 >> Deci, aici este o analogie. 266 00:13:44,640 --> 00:13:48,080 Să spunem că am un notebook, drept, și este plin de note. 267 00:13:48,080 --> 00:13:50,230 Și aș dori să-l actualizați. 268 00:13:50,230 --> 00:13:53,960 Ești o funcție care actualizări note, dreapta. 269 00:13:53,960 --> 00:13:56,390 În modul în care am fost de lucru până în prezent, ceea ce 270 00:13:56,390 --> 00:14:02,370 se întâmplă este va lua notebook-mea, veți merge la magazin de copiere, 271 00:14:02,370 --> 00:14:06,410 veți face o copie xerox a fiecare pagină a notebook-ului. 272 00:14:06,410 --> 00:14:09,790 Vei lăsa notebook înapoi pe biroul meu atunci când ați terminat, 273 00:14:09,790 --> 00:14:14,600 veți merge și cruce lucruri în mea notebook care sunt depășite sau greșite, 274 00:14:14,600 --> 00:14:19,280 și apoi veți trece înapoi la mi teancul de pagini Xerox 275 00:14:19,280 --> 00:14:22,850 că este o replica de notebook mea cu modificările pe care le-ați făcut să-l. 276 00:14:22,850 --> 00:14:27,040 Și în acel moment, este de până la mine, ca funcția de apelare, cum apelantului, 277 00:14:27,040 --> 00:14:30,582 pentru a decide să ia notițe si integrarea lor înapoi în caietul meu. 278 00:14:30,582 --> 00:14:32,540 Deci, există o mulțime de pași implicat aici, chiar. 279 00:14:32,540 --> 00:14:34,850 Ca nu ar fi mai bine dacă spun doar, hei, poți 280 00:14:34,850 --> 00:14:38,370 actualiza notebook-ul meu pentru ma, tu dai caietul meu, 281 00:14:38,370 --> 00:14:40,440 și luați lucrurile și literalmente le tăiați 282 00:14:40,440 --> 00:14:42,810 și actualizează notele mele în caietul meu. 283 00:14:42,810 --> 00:14:45,140 Și apoi dă-mi notebook înapoi. 284 00:14:45,140 --> 00:14:47,320 Asta e un fel de ceea ce indicii ne permit să facem, 285 00:14:47,320 --> 00:14:51,320 ei fac acest mediu mult mai mult ca modul în care ne desfășurăm activitatea în realitate. 286 00:14:51,320 --> 00:14:54,640 >> Bine Deci asta un pointer este, hai sa vorbim 287 00:14:54,640 --> 00:14:58,040 despre modul în care indicii de lucru în C, și cum putem începe să lucreze cu ei. 288 00:14:58,040 --> 00:15:02,550 Deci, există un indicator foarte simplu în C numit indicatorul nul. 289 00:15:02,550 --> 00:15:04,830 Nulul indicatorul la nimic. 290 00:15:04,830 --> 00:15:08,310 Probabil pare ca e de fapt, nu este un lucru foarte util, 291 00:15:08,310 --> 00:15:10,500 dar vom vedea o puțin mai târziu, faptul 292 00:15:10,500 --> 00:15:15,410 că acest pointer null de fapt, într-adevăr poate veni la îndemână. 293 00:15:15,410 --> 00:15:19,090 Și ori de câte ori creați un pointer, și nu setați immediately- sa valoare 294 00:15:19,090 --> 00:15:21,060 un exemplu de setare valoarea sa imediat 295 00:15:21,060 --> 00:15:25,401 va fi un cuplu diapozitive înapoi în cazul în care am spus PK egal & K, 296 00:15:25,401 --> 00:15:28,740 PK devine adresa k lui, ca vom vedea ce înseamnă că, 297 00:15:28,740 --> 00:15:32,990 vom vedea cum să cod care shortly- dacă nu setați valoarea sa la ceva 298 00:15:32,990 --> 00:15:35,380 semnificativ imediat, trebuie întotdeauna 299 00:15:35,380 --> 00:15:37,480 setați indicatorul pentru a indica null. 300 00:15:37,480 --> 00:15:40,260 Tu ar trebui să stabilească o pentru a indica nimic. 301 00:15:40,260 --> 00:15:43,614 >> Asta e foarte diferit de lăsând doar valoarea cum este 302 00:15:43,614 --> 00:15:45,530 și apoi declararea unei pointer și doar asumarea 303 00:15:45,530 --> 00:15:48,042 este nul pentru că rareori adevărat. 304 00:15:48,042 --> 00:15:50,000 Așa că ar trebui să stabilească întotdeauna valoarea unui pointer 305 00:15:50,000 --> 00:15:55,690 la null daca nu setați valoarea sa la ceva semnificativ imediat. 306 00:15:55,690 --> 00:15:59,090 Puteți verifica dacă valoarea unui pointer de este nul folosind operatorul de egalitate 307 00:15:59,090 --> 00:16:05,450 (==), La fel ca veți compara orice întreg valori sau valori de caractere utilizând (==) 308 00:16:05,450 --> 00:16:06,320 deasemenea. 309 00:16:06,320 --> 00:16:10,994 E un fel special de constant Valoarea pe care o puteți utiliza pentru a testa. 310 00:16:10,994 --> 00:16:13,160 Deci, asta a fost o foarte simplu pointer, indicatorul nul. 311 00:16:13,160 --> 00:16:15,320 Un alt mod de a crea un pointer este de a extrage 312 00:16:15,320 --> 00:16:18,240 adresa unei variabile deja le-ați creat, 313 00:16:18,240 --> 00:16:22,330 și face acest lucru folosind & extracție adresa operatorului. 314 00:16:22,330 --> 00:16:26,720 Care le-am văzut deja anterior în primul exemplu diagrama-am arătat. 315 00:16:26,720 --> 00:16:31,450 Deci, dacă X este o variabilă care l-am deja creat de tip întreg, 316 00:16:31,450 --> 00:16:35,110 atunci și X este un pointer la un întreg. 317 00:16:35,110 --> 00:16:39,810 & X este- amintesc, si se va pentru a extrage adresa de lucru pe dreapta. 318 00:16:39,810 --> 00:16:45,350 Si din moment ce un indicator este doar o adresă, decât & X este un pointer la un întreg 319 00:16:45,350 --> 00:16:48,560 a căror valoare nu este în cazul în care în memorie x viața. 320 00:16:48,560 --> 00:16:50,460 E adresa lui x. 321 00:16:50,460 --> 00:16:53,296 Deci & x este adresa lui x. 322 00:16:53,296 --> 00:16:55,670 Să luăm această un pas în continuare și conectarea la ceva 323 00:16:55,670 --> 00:16:58,380 Am făcut aluzie la un videoclip în prealabil. 324 00:16:58,380 --> 00:17:06,730 Dacă arr este o serie de camere duble, atunci & Suport pătrat ARR i este un pointer 325 00:17:06,730 --> 00:17:08,109 la o dublă. 326 00:17:08,109 --> 00:17:08,970 BINE. 327 00:17:08,970 --> 00:17:12,160 arr suport pătrat I, în cazul în care arr este o serie de camere duble, 328 00:17:12,160 --> 00:17:19,069 apoi arr suport pătrat i este elementul i din care matrice, 329 00:17:19,069 --> 00:17:29,270 și & arr suport pătrat i este în cazul în care în Memoria elementul i din ARR există. 330 00:17:29,270 --> 00:17:31,790 >> Deci, ce este implicarea aici? 331 00:17:31,790 --> 00:17:34,570 Un nume matrice, implicarea din toată chestia asta, 332 00:17:34,570 --> 00:17:39,290 este că numele o matrice este de fapt, el însuși un pointer. 333 00:17:39,290 --> 00:17:41,170 Ai lucrat cu indicii de-a lungul 334 00:17:41,170 --> 00:17:45,290 de fiecare dată când ați folosit un tablou. 335 00:17:45,290 --> 00:17:49,090 Amintiți-vă de la exemplul pe domeniul de aplicare variabil, 336 00:17:49,090 --> 00:17:53,420 aproape de sfârșitul video prezint un exemplu în cazul în care avem o funcție 337 00:17:53,420 --> 00:17:56,890 numit set Int și o funcție numită set matrice. 338 00:17:56,890 --> 00:18:00,490 Și provocarea ta pentru a determina sau nu, sau ceea ce 339 00:18:00,490 --> 00:18:03,220 Valorile pe care le imprimate pe sfârșitul funcției, 340 00:18:03,220 --> 00:18:05,960 la sfârșitul programului principal. 341 00:18:05,960 --> 00:18:08,740 >> Dacă vă amintiți de la acel exemplu sau dacă ați vizionat video, 342 00:18:08,740 --> 00:18:13,080 Știi că atunci când vi-apelul la set Int nu face în mod eficient nimic. 343 00:18:13,080 --> 00:18:16,390 Dar apelul de a stabili matrice face. 344 00:18:16,390 --> 00:18:19,280 Și am un fel de glosat peste ce că a fost cazul, la momentul. 345 00:18:19,280 --> 00:18:22,363 Tocmai am spus, bine este o matrice, este special, știi, există un motiv. 346 00:18:22,363 --> 00:18:25,020 Motivul este că o serie de Numele este de fapt doar un pointer, 347 00:18:25,020 --> 00:18:28,740 și nu există acest special sintaxă suport pătrat care 348 00:18:28,740 --> 00:18:30,510 face lucrurile mult mai frumos o de a lucra cu. 349 00:18:30,510 --> 00:18:34,410 Și ei fac ideea de pointer mult mai puțin intimidant, 350 00:18:34,410 --> 00:18:36,800 și de aceea sunt un fel de prezentat în acest fel. 351 00:18:36,800 --> 00:18:38,600 Dar de fapt matrice sunt doar indicative. 352 00:18:38,600 --> 00:18:41,580 Și de aceea, atunci când ne-am a făcut o schimbare la matrice, 353 00:18:41,580 --> 00:18:44,880 când am trecut un tablou ca un parametru pentru o funcție sau ca un argument 354 00:18:44,880 --> 00:18:50,110 la o funcție, conținutul șirului schimbat de fapt atât în ​​callee 355 00:18:50,110 --> 00:18:51,160 și în apelantul. 356 00:18:51,160 --> 00:18:55,846 Care, pentru orice alt tip de variabilă am văzut nu a fost cazul. 357 00:18:55,846 --> 00:18:58,970 Deci asta e doar ceva pentru a păstra în minte atunci când lucrați cu indicii, 358 00:18:58,970 --> 00:19:01,610 este faptul că numele unui matrice de fapt un pointer 359 00:19:01,610 --> 00:19:04,750 la primul element de care matrice. 360 00:19:04,750 --> 00:19:08,930 >> OK asa ca acum avem toate aceste fapte, să continuăm, chiar. 361 00:19:08,930 --> 00:19:11,370 De ce nu ne pasă de în cazul în care ceva locuiește. 362 00:19:11,370 --> 00:19:14,120 Ei bine, cum am spus, e destul de util să știm unde locuiește ceva 363 00:19:14,120 --> 00:19:17,240 astfel încât să puteți merge acolo și să îl modificați. 364 00:19:17,240 --> 00:19:19,390 Lucra cu el și de fapt au un lucru pe care 365 00:19:19,390 --> 00:19:23,710 vrei să faci în acest sens ia variabilă, și nu produce efecte de la unele copie a acesteia. 366 00:19:23,710 --> 00:19:26,150 Aceasta se numește dereferencing. 367 00:19:26,150 --> 00:19:28,690 Mergem la referință și vom schimba valoarea acolo. 368 00:19:28,690 --> 00:19:32,660 Deci, dacă avem un pointer si se numeste PC-ul, și puncte de la un personaj, 369 00:19:32,660 --> 00:19:40,610 atunci putem spune * * PC și PC-ul este Numele de ceea ce vom găsi dacă vom merge 370 00:19:40,610 --> 00:19:42,910 la PC adresa. 371 00:19:42,910 --> 00:19:47,860 Ce vom găsi acolo este un personaj și * PC-ul este cum ne referim la datele la care 372 00:19:47,860 --> 00:19:48,880 locație. 373 00:19:48,880 --> 00:19:54,150 Deci, am putea spune ceva de genul * pc = D sau ceva de genul asta, 374 00:19:54,150 --> 00:19:59,280 și asta înseamnă că orice a fost la adresa de memorie PC-ul, 375 00:19:59,280 --> 00:20:07,040 indiferent de caracterul a fost anterior există, este acum D, dacă spunem * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Deci, aici vom merge din nou cu unele C chestii ciudate, chiar. 377 00:20:10,090 --> 00:20:14,560 Deci am vazut * anterior ca fiind într-un fel o parte din tipul de date, 378 00:20:14,560 --> 00:20:17,160 iar acum este folosit în un context puțin diferit 379 00:20:17,160 --> 00:20:19,605 pentru a accesa datele într-o locație. 380 00:20:19,605 --> 00:20:22,480 Știu că e un pic confuz și Asta este de fapt o parte a acestui întreg 381 00:20:22,480 --> 00:20:25,740 cum ar fi, de ce indicii au această mitologie în jurul lor ca fiind atât de complex, 382 00:20:25,740 --> 00:20:28,250 este un fel de o problemă de sintaxă, sincer. 383 00:20:28,250 --> 00:20:31,810 Dar * este folosit în ambele contexte, atât ca parte a numelui de tip, 384 00:20:31,810 --> 00:20:34,100 si vom vedea un pic mai târziu ceva, de asemenea. 385 00:20:34,100 --> 00:20:36,490 Iar acum este operator de dereference. 386 00:20:36,490 --> 00:20:38,760 Deci, merge la referință, se accesează datele 387 00:20:38,760 --> 00:20:43,000 la locul de indicatorul, și vă permite să-l manipuleze după bunul plac. 388 00:20:43,000 --> 00:20:45,900 >> Acum acest lucru este foarte similar cu vizita pe aproapele tău, chiar. 389 00:20:45,900 --> 00:20:48,710 Dacă știi ce dvs. vecin locuiește, ești 390 00:20:48,710 --> 00:20:50,730 nu stau cu aproapele tău. 391 00:20:50,730 --> 00:20:53,510 Știi că se întâmplă să știu unde trăiesc, 392 00:20:53,510 --> 00:20:56,870 dar asta nu înseamnă că de virtutea de a avea cunoștințe care 393 00:20:56,870 --> 00:20:59,170 vi se interacționează cu ei. 394 00:20:59,170 --> 00:21:01,920 Dacă doriți pentru a interacționa cu ei, trebuie să te duci la casa lor, 395 00:21:01,920 --> 00:21:03,760 trebuie să te duci la locul în care trăiesc. 396 00:21:03,760 --> 00:21:07,440 Și odată ce ai făcut asta, atunci puteți interacționa 397 00:21:07,440 --> 00:21:09,420 cu ei la fel ca ai vrea sa. 398 00:21:09,420 --> 00:21:12,730 În mod similar și cu variabile, aveți nevoie pentru a merge la adresa lor 399 00:21:12,730 --> 00:21:15,320 dacă vrei să le interacționeze, nu se poate ști doar adresa. 400 00:21:15,320 --> 00:21:21,495 Și modul în care te duci la adresa este să utilizeze *, operatorul dereference. 401 00:21:21,495 --> 00:21:23,620 Ce crezi că se întâmplă dacă vom încerca și dereference 402 00:21:23,620 --> 00:21:25,260 un pointer a carui valoare este nulă? 403 00:21:25,260 --> 00:21:28,470 Amintiti-va ca nul pointer indică nimic. 404 00:21:28,470 --> 00:21:34,110 Deci, dacă încercați și dereference nimic sau du-te la o adresă nimic, 405 00:21:34,110 --> 00:21:36,800 ce crezi că se întâmplă? 406 00:21:36,800 --> 00:21:39,630 Segmentarea Ei bine, dacă ai ghicit vina, ai avea dreptate. 407 00:21:39,630 --> 00:21:41,390 Dacă încercați și dereference un pointer nul, 408 00:21:41,390 --> 00:21:43,140 suferi o segmentare vina. Dar asteapta, 409 00:21:43,140 --> 00:21:45,820 Nu ți-am spus că dacă nu te duci 410 00:21:45,820 --> 00:21:49,220 pentru a seta valoarea ta de dvs. pointer la ceva semnificativ, 411 00:21:49,220 --> 00:21:51,000 tu ar trebui să stabilească la null? 412 00:21:51,000 --> 00:21:55,290 Am făcut-o și de fapt segmentarea vina este un fel de un comportament bun. 413 00:21:55,290 --> 00:21:58,680 >> Ai declarat vreodată o variabilă și nu atribuie valoarea imediat? 414 00:21:58,680 --> 00:22:02,680 Deci, ai spus int x; tu nu de fapt, nimic atribuie 415 00:22:02,680 --> 00:22:05,340 și apoi mai târziu în codul dvs., imprimați din valoarea lui x, 416 00:22:05,340 --> 00:22:07,650 care nu au încă atribuit-l la ceva. 417 00:22:07,650 --> 00:22:10,370 Frecvent veți obține la zero, dar uneori 418 00:22:10,370 --> 00:22:15,000 s-ar putea obține unele numere aleatorii, și aveți nici o idee de unde a venit de la. 419 00:22:15,000 --> 00:22:16,750 În mod similar se poate lucruri intampla cu indicii. 420 00:22:16,750 --> 00:22:20,110 Când declara un pointer int * PK de exemplu, 421 00:22:20,110 --> 00:22:23,490 și nu-l atribuie o valoare, te patru octeți pentru memorie. 422 00:22:23,490 --> 00:22:25,950 Oricare ar fi patru bytes de Memoria sistemul poate 423 00:22:25,950 --> 00:22:28,970 constată că au o anumită valoare semnificativă. 424 00:22:28,970 --> 00:22:31,760 Și nu ar fi putut fi ceva deja acolo, care 425 00:22:31,760 --> 00:22:34,190 nu mai este necesar un alt funcție, astfel încât doar ai 426 00:22:34,190 --> 00:22:35,900 indiferent de datele a fost acolo. 427 00:22:35,900 --> 00:22:40,570 >> Ce se întâmplă dacă ai încercat să faci dereference unii adresa pe care le don't- au fost 428 00:22:40,570 --> 00:22:43,410 deja octeți și informații în acolo, asta e acum în indicatorul. 429 00:22:43,410 --> 00:22:47,470 Dacă încercați și dereference că pointer, s-ar putea să joci cu unele de memorie 430 00:22:47,470 --> 00:22:49,390 că nu a intenționat să te pui cu totul. 431 00:22:49,390 --> 00:22:51,639 Și, de fapt ai putea face ceva cu adevarat devastator, 432 00:22:51,639 --> 00:22:54,880 ca rupe un alt program, sau de a sparge o altă funcție, 433 00:22:54,880 --> 00:22:58,289 sau de a face ceva rău intenționat care nu ai de gând să faci, la toate. 434 00:22:58,289 --> 00:23:00,080 Și astfel că de aceea este de fapt o idee bună 435 00:23:00,080 --> 00:23:04,030 pentru a seta indicii pentru a null dacă nu le setat la ceva semnificativ. 436 00:23:04,030 --> 00:23:06,760 Probabil e mai bine la sfârșitul zilei pentru programul 437 00:23:06,760 --> 00:23:09,840 sa se prabuseasca apoi pentru ea să facă Ceva care șuruburi până 438 00:23:09,840 --> 00:23:12,400 un alt program sau o altă funcție. 439 00:23:12,400 --> 00:23:15,207 Că un comportament este, probabil, chiar mai mult decât ideală crashing. 440 00:23:15,207 --> 00:23:17,040 Și astfel că de aceea este de fapt un obicei bun 441 00:23:17,040 --> 00:23:20,920 pentru a intra în a stabili indicii dvs. la null daca nu le setați 442 00:23:20,920 --> 00:23:24,540 la o valoare semnificativă imediat, o valoare care știți că 443 00:23:24,540 --> 00:23:27,260 și că puteți în condiții de siguranță dereference. 444 00:23:27,260 --> 00:23:32,240 >> Deci, haideți să vină înapoi acum și să ia o privire la sintaxa generală a situației. 445 00:23:32,240 --> 00:23:37,400 Dacă spun int * p ;, ceea ce am făcut doar? 446 00:23:37,400 --> 00:23:38,530 Ce am făcut asta. 447 00:23:38,530 --> 00:23:43,290 Știu valoarea p este o adresă deoarece toate indicii sunt doar 448 00:23:43,290 --> 00:23:44,660 adrese. 449 00:23:44,660 --> 00:23:47,750 Pot dereference p folosind operatorul *. 450 00:23:47,750 --> 00:23:51,250 În acest context aici, chiar la top amintim * face parte din tipul. 451 00:23:51,250 --> 00:23:53,510 Int * este tipul de date. 452 00:23:53,510 --> 00:23:56,150 Dar pot dereference p folosind operatorul *, 453 00:23:56,150 --> 00:24:01,897 și, dacă am face acest lucru, dacă mă duc la acea adresă, ceea ce voi găsi la acea adresă? 454 00:24:01,897 --> 00:24:02,855 Voi găsi un număr întreg. 455 00:24:02,855 --> 00:24:05,910 Deci int * p este de fapt spunând, p este o adresă. 456 00:24:05,910 --> 00:24:09,500 Pot dereference p și dacă Eu fac, voi găsi un număr întreg 457 00:24:09,500 --> 00:24:11,920 la acea locație de memorie. 458 00:24:11,920 --> 00:24:14,260 >> OK, așa că am spus că a fost un alt lucru enervant cu stele 459 00:24:14,260 --> 00:24:17,060 și aici este cazul în care acest lucru enervant cu stele este. 460 00:24:17,060 --> 00:24:21,640 Ați încercat vreodată să declare mai multe variabile de același tip 461 00:24:21,640 --> 00:24:24,409 pe aceeași linie de cod? 462 00:24:24,409 --> 00:24:27,700 Deci, pentru un al doilea, pretinde că linia, codul de fapt, am acolo în verde 463 00:24:27,700 --> 00:24:29,366 nu este acolo și spune doar int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Ce care ar face este de fapt crearea trei variabile întregi pentru tine, 466 00:24:34,550 --> 00:24:36,930 unul numit x, unul numit y, și unul numit z. 467 00:24:36,930 --> 00:24:41,510 Este un mod de a face acest lucru fără având de a împărți pe trei linii. 468 00:24:41,510 --> 00:24:43,890 >> Iată unde stars obține enervant din nou, deși, 469 00:24:43,890 --> 00:24:49,200 deoarece este de fapt parte * atât a numelui de tip și o parte 470 00:24:49,200 --> 00:24:50,320 a numelui variabilei. 471 00:24:50,320 --> 00:24:56,430 Și așa că, dacă spun px int *, py, PZ, ceea ce am de fapt obține este un pointer la un întreg 472 00:24:56,430 --> 00:25:01,650 numit px și două numere întregi, Py și PZ. 473 00:25:01,650 --> 00:25:04,950 Și că, probabil, nu ceea ce este vrem, asta nu e bine. 474 00:25:04,950 --> 00:25:09,290 >> Deci, dacă vreau să creați mai multe indicii pe aceeași linie, de același tip, 475 00:25:09,290 --> 00:25:12,140 și stele, ceea ce de fapt am nevoie să faceți este să spun int * pa, * Pb, * PC-ul. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Acum, după ce tocmai a spus că și acum spun asta, 478 00:25:20,300 --> 00:25:22,170 probabil nu va face acest lucru. 479 00:25:22,170 --> 00:25:25,170 Și este, probabil, un lucru bun sincer, pentru că s-ar putea din greșeală 480 00:25:25,170 --> 00:25:26,544 omite o stea, ceva de genul asta. 481 00:25:26,544 --> 00:25:29,290 Este probabil cel mai bine să o declare poate indicii pe liniile individuale, 482 00:25:29,290 --> 00:25:31,373 dar e doar o alta din cei sintaxă enervant 483 00:25:31,373 --> 00:25:35,310 lucruri cu stele care fac indicii atât de dificil de a lucra cu. 484 00:25:35,310 --> 00:25:39,480 Pentru că e doar acest sintactic mizerie trebuie să lucreze prin intermediul. 485 00:25:39,480 --> 00:25:41,600 Cu practica face deveni cu adevărat oa doua natura. 486 00:25:41,600 --> 00:25:45,410 Eu încă fac greșeli cu tot după programare timp de 10 ani, 487 00:25:45,410 --> 00:25:49,630 asa ca nu fi supărat dacă se întâmplă ceva pentru tine, e destul de comun sincer. 488 00:25:49,630 --> 00:25:52,850 Este într-adevăr un fel de un defect de sintaxa. 489 00:25:52,850 --> 00:25:54,900 >> OK, așa că am un fel de promis care ne-ar revizui 490 00:25:54,900 --> 00:25:59,370 conceptul de cât de mare este un șir. 491 00:25:59,370 --> 00:26:02,750 Ei bine, dacă ți-am spus că o string, am într-adevăr un fel de 492 00:26:02,750 --> 00:26:04,140 mințit pentru a vă tot timpul. 493 00:26:04,140 --> 00:26:06,181 Nu e nici un tip de date numit șir, și, de fapt am 494 00:26:06,181 --> 00:26:09,730 menționat acest lucru în unul dintre noastre primele clipuri video pe tipuri de date, 495 00:26:09,730 --> 00:26:13,820 care șir a fost un tip de date care a fost creat pentru tine în CS50.h. 496 00:26:13,820 --> 00:26:17,050 Trebuie să #include CS50.h în scopul de a utiliza. 497 00:26:17,050 --> 00:26:19,250 >> Ei bine, string este de fapt doar un alias pentru ceva 498 00:26:19,250 --> 00:26:23,600 numit char *, un pointer la un caracter. 499 00:26:23,600 --> 00:26:26,010 Ei bine indicii, rechemare, sunt doar adrese. 500 00:26:26,010 --> 00:26:28,780 Deci, ce este de dimensiunea în bytes de un șir? 501 00:26:28,780 --> 00:26:29,796 Ei bine, e de patru sau opt. 502 00:26:29,796 --> 00:26:32,170 Și motivul pentru care am spus patru sau opt este pentru că de fapt 503 00:26:32,170 --> 00:26:36,730 depinde de sistemul, Dacă utilizați CS50 IDE, char * este de marimea unui caracter 504 00:26:36,730 --> 00:26:39,340 * Este de opt, este un sistem pe 64 de biți. 505 00:26:39,340 --> 00:26:43,850 Fiecare adresă în memorie este 64 de biți lung. 506 00:26:43,850 --> 00:26:48,270 Dacă utilizați aparatul CS50 sau folosind orice mașină pe 32 de biți, 507 00:26:48,270 --> 00:26:51,640 și ați auzit că pe termen de 32 de biți mașină, ceea ce este o mașină pe 32 de biți? 508 00:26:51,640 --> 00:26:56,090 Ei bine, aceasta înseamnă doar că fiecare adresă în memorie este 32 de biți lung. 509 00:26:56,090 --> 00:26:59,140 Și așa 32 de biți este de patru octeți. 510 00:26:59,140 --> 00:27:02,710 Deci, un char * este de patru sau opt octeți în funcție de sistemul dumneavoastră. 511 00:27:02,710 --> 00:27:06,100 Și într-adevăr orice tipuri de date, și un pointer la orice date 512 00:27:06,100 --> 00:27:12,030 tip, deoarece toate indicii sunt doar Adresele, patru sau opt octeti. 513 00:27:12,030 --> 00:27:14,030 Deci, haideți să reexamineze această diagramă și să încheie 514 00:27:14,030 --> 00:27:18,130 acest videoclip cu un mic exercițiu aici. 515 00:27:18,130 --> 00:27:21,600 Deci, aici e schema am rămas cu la începutul videoclipului. 516 00:27:21,600 --> 00:27:23,110 Deci, ce se întâmplă acum în cazul în care spun * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Deci, ce înseamnă când spun, * PK = 35? 519 00:27:30,530 --> 00:27:32,420 Ia-o a doua. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 În context aici, * este operator de dereference. 522 00:27:39,890 --> 00:27:42,110 Deci, atunci când dereference Operatorul este utilizat, 523 00:27:42,110 --> 00:27:48,520 mergem la adresa indicat de PK, și vom schimba ceea ce vom găsi. 524 00:27:48,520 --> 00:27:55,270 Deci * PK = 35 mod eficient face acest lucru pentru a fotografia. 525 00:27:55,270 --> 00:27:58,110 Deci este practic punct de vedere sintactic identic cu a fi spus k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Încă una. 528 00:28:01,930 --> 00:28:05,510 Dacă spun Int m, creez o nouă variabilă numită m. 529 00:28:05,510 --> 00:28:08,260 O nouă cutie, este o cutie verde, deoarece se va ține un întreg, 530 00:28:08,260 --> 00:28:09,840 și este etichetat m. 531 00:28:09,840 --> 00:28:14,960 Dacă spun m = 4, am pus un întreg în cutia. 532 00:28:14,960 --> 00:28:20,290 Dacă zice PK = & m, cum se această schimbare diagrama? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, nu vă amintiți Ce & Operatorul are sau se numește? 534 00:28:28,760 --> 00:28:34,430 Amintiți-vă că și unele nume de variabilă este adresa unui nume de variabilă. 535 00:28:34,430 --> 00:28:38,740 Deci, ceea ce spui este PK devine adresa m. 536 00:28:38,740 --> 00:28:42,010 Și atât de eficient ce se întâmplă în Diagrama este că pk puncte nu mai 537 00:28:42,010 --> 00:28:46,420 pentru k, dar puncte la m. 538 00:28:46,420 --> 00:28:48,470 >> Din nou, indicii sunt foarte dificil de a lucra cu 539 00:28:48,470 --> 00:28:50,620 și ei să ia o mulțime de practică, ci pentru că 540 00:28:50,620 --> 00:28:54,150 de capacitatea lor de a vă permite pentru a trece de date între funcțiile 541 00:28:54,150 --> 00:28:56,945 și de fapt au cele schimbări în vigoare, 542 00:28:56,945 --> 00:28:58,820 obtinerea capul în jurul valorii de este foarte important. 543 00:28:58,820 --> 00:29:02,590 Este, probabil, este cel mai complicat subiect vom discuta în CS50, 544 00:29:02,590 --> 00:29:05,910 dar valoarea pe care obține de la utilizarea indicii 545 00:29:05,910 --> 00:29:09,200 depășește cu mult complicațiile care vin de la ei de învățare. 546 00:29:09,200 --> 00:29:12,690 Deci vă doresc cel mai bun de noroc de învățare despre indicii. 547 00:29:12,690 --> 00:29:15,760 Sunt Doug Lloyd, aceasta este CS50. 548 00:29:15,760 --> 00:29:17,447