1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Să vorbim despre tablouri. 2 00:00:09,360 --> 00:00:12,780 Deci, de ce ne-ar dori vreodată să utilizați tablouri? 3 00:00:12,780 --> 00:00:17,210 Ei bine, hai să presupunem că aveți un program de care are nevoie pentru a stoca 5 ID-uri studențești. 4 00:00:17,210 --> 00:00:21,270 Ar putea părea rezonabil să aibă 5 variabile separate. 5 00:00:21,270 --> 00:00:24,240 Din motive vom vedea într-un pic, vom începe numărarea de la 0. 6 00:00:24,240 --> 00:00:30,700 Variabilele vom avea vor fi id0 int, int ID1, și așa mai departe. 7 00:00:30,700 --> 00:00:34,870 Orice logica dorim pentru a efectua pe un ID de student va trebui să fie copiate și lipite 8 00:00:34,870 --> 00:00:36,870 pentru fiecare dintre aceste ID-uri studențești. 9 00:00:36,870 --> 00:00:39,710 Dacă vrem să verificați care elevii se întâmplă să fie în CS50, 10 00:00:39,710 --> 00:00:43,910 vom trebui mai întâi pentru a verifica dacă id0 reprezintă student în curs. 11 00:00:43,910 --> 00:00:48,070 Apoi să facă același lucru pentru elev următoare, vom avea nevoie să copiați și să inserați codul pentru id0 12 00:00:48,070 --> 00:00:54,430 și să înlocuiască toate aparițiile de id0 cu ID1 și așa mai departe pentru ID2, 3, și 4. 13 00:00:54,430 --> 00:00:57,560 >> De îndată ce veți auzi de care avem nevoie pentru a copia și lipi, 14 00:00:57,560 --> 00:01:00,440 ar trebui să începi să te gândești că nu există o soluție mai bună. 15 00:01:00,440 --> 00:01:05,360 Acum, ce se întâmplă dacă vă dați seama că nu aveți nevoie de ID-uri de 5 studenți, ci mai degrabă 7? 16 00:01:05,360 --> 00:01:09,570 Ai nevoie pentru a merge înapoi în codul sursă și se adaugă într-o id5, o ID6, 17 00:01:09,570 --> 00:01:14,260 și să copiați și să lipiți logica pentru a verifica dacă ID-urile aparțin clasei de aceste 2 ID-uri noi. 18 00:01:14,260 --> 00:01:19,600 Nu este nimic conectarea toate aceste ID-uri împreună, și astfel nu există nici o modalitate de a pune 19 00:01:19,600 --> 00:01:22,040 program pentru a face acest lucru pentru ID-urile de la 0 la 6. 20 00:01:22,040 --> 00:01:26,120 Ei bine, acum iti dai seama ca ai 100 de ID-uri de studenți. 21 00:01:26,120 --> 00:01:30,770 A început să pară mai puțin de ideal dacă doriți să trebuie să declare separat fiecare dintre aceste ID-uri, 22 00:01:30,770 --> 00:01:33,760 și să copiați și lipiți orice logică pentru aceste ID-uri noi. 23 00:01:33,760 --> 00:01:38,380 Dar poate suntem hotărâți, și o facem pentru toți 100 de elevi. 24 00:01:38,380 --> 00:01:42,240 Dar ce se întâmplă dacă nu știi câți elevi există, de fapt sunt? 25 00:01:42,240 --> 00:01:47,320 Există doar unii studenți n și programul dumneavoastră trebuie să solicite utilizatorului ce n este. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Acest lucru nu este de gând să lucreze foarte bine. 27 00:01:50,250 --> 00:01:53,820 Programul tău funcționează numai pentru un numar constant de studenți. 28 00:01:53,820 --> 00:01:57,520 >> Rezolvarea tuturor acestor probleme este frumusetea de matrice. 29 00:01:57,520 --> 00:01:59,930 Deci, ce este o matrice? 30 00:01:59,930 --> 00:02:04,480 În unele limbaje de programare un tip de matrice ar putea fi capabil să facă un pic mai mult, 31 00:02:04,480 --> 00:02:09,960 dar aici ne vom concentra pe structura de bază de date matrice așa cum veți vedea în C. 32 00:02:09,960 --> 00:02:14,030 O matrice este doar un bloc mare de memorie. Asta e tot. 33 00:02:14,030 --> 00:02:17,770 Atunci când spunem că nu avem un tablou de 10 intregi, ca doar înseamnă că avem ceva bloc 34 00:02:17,770 --> 00:02:20,740 de memorie, care este suficient de mare pentru a deține 10 numere întregi separate. 35 00:02:29,930 --> 00:02:33,410 Presupunând că un număr întreg este de 4 octeți, aceasta înseamnă că o serie de 10 numere întregi 36 00:02:33,410 --> 00:02:37,180 este un bloc continuu de 40 de octeți în memorie. 37 00:02:42,660 --> 00:02:46,280 Chiar și atunci când utilizați tablouri multidimensionale, pe care nu vom merge in pentru a aici, 38 00:02:46,280 --> 00:02:49,200 este încă doar un bloc mare de memorie. 39 00:02:49,200 --> 00:02:51,840 Notația multidimensională este doar o comoditate. 40 00:02:51,840 --> 00:02:55,640 Dacă aveți un 3 de 3 matrice multidimensional al întregi, 41 00:02:55,640 --> 00:03:00,650 atunci programul va trata într-adevăr la fel ca pe un bloc mare de 36 de octeți. 42 00:03:00,650 --> 00:03:05,460 Numărul total de numere întregi este de 3 ori 3, și fiecare număr întreg durează până la 4 octeți. 43 00:03:05,460 --> 00:03:07,750 >> Să aruncăm o privire la un exemplu de bază. 44 00:03:07,750 --> 00:03:10,660 Putem vedea aici 2 moduri diferite de declarare a tablourilor. 45 00:03:15,660 --> 00:03:18,580 Va trebui să comenteze 1 din ele afară pentru a compila programul 46 00:03:18,580 --> 00:03:20,900 deoarece ne pronunțăm x de două ori. 47 00:03:20,900 --> 00:03:25,140 Vom arunca o privire la unele dintre diferențele dintre aceste 2 tipuri de declarații într-un pic. 48 00:03:25,140 --> 00:03:28,560 Ambele aceste linii declară o serie de N dimensiune, 49 00:03:28,560 --> 00:03:30,740 în cazul în care ne-am # define N, 10. 50 00:03:30,740 --> 00:03:34,460 Am putea la fel de ușor au cerut utilizator pentru un întreg pozitiv 51 00:03:34,460 --> 00:03:37,250 și utilizate ca întreg și o serie de elemente din gama noastră. 52 00:03:37,250 --> 00:03:41,960 Vrei exemplul nostru ID-ul de student înainte, acest lucru este un fel de declarare complet separat de 10 53 00:03:41,960 --> 00:03:49,000 variabile imaginare, x0, x1, x2, și așa mai departe până la xN-1. 54 00:03:57,270 --> 00:04:00,840 Ignorarea liniile pe care le declara matrice, observați parantezele pătrate intacte 55 00:04:00,840 --> 00:04:02,090 în interiorul pentru bucle. 56 00:04:02,090 --> 00:04:09,660 Când ne-am scrie ceva de genul x [3], pe care voi citi la fel de suport x 3, 57 00:04:09,660 --> 00:04:13,090 vă puteți gândi la ea ca cere imaginar x3. 58 00:04:13,090 --> 00:04:17,519 Aviz decât cu o serie de dimensiune N, acest lucru înseamnă că numărul interiorul paranteze, 59 00:04:17,519 --> 00:04:22,630 pe care vom numi indicele, poate fi orice, de la 0 la N-1, 60 00:04:22,630 --> 00:04:25,660 care este un total de indici N. 61 00:04:25,660 --> 00:04:28,260 >> Să se gândească la modul în care acest fapt de lucrări 62 00:04:28,260 --> 00:04:31,260 amintiți-vă că matrice este un bloc mare de memorie. 63 00:04:31,260 --> 00:04:37,460 Presupunând că un număr întreg este de 4 octeți, x întregului set este un bloc de memorie 40 octet. 64 00:04:37,460 --> 00:04:41,360 Deci x0 se referă la primele 4 bytes de bloc. 65 00:04:45,810 --> 00:04:49,230 X [1] se referă la următoarele 4 octeți și așa mai departe. 66 00:04:49,230 --> 00:04:53,760 Acest lucru înseamnă că la începutul lui x este tot programul vreodată nevoie pentru a ține evidența. 67 00:04:55,660 --> 00:04:59,840 Dacă doriți să utilizați x [400], apoi programul știe că acest lucru este echivalent 68 00:04:59,840 --> 00:05:03,460 la doar 1,600 octeți de la începutul lui x. 69 00:05:03,460 --> 00:05:08,780 De unde vom lua 1600 octeți de la? E doar de 400 de ori 4 bytes pe întreg. 70 00:05:08,780 --> 00:05:13,170 >> Înainte de a trece mai departe, este foarte important să realizăm că, în C 71 00:05:13,170 --> 00:05:17,080 nu există nici punerea în aplicare a indicelui pe care le folosim în matrice. 72 00:05:17,080 --> 00:05:23,180 Blocul nostru de mare este la numai 10 numere întregi lung, dar nimic nu va țipa la noi, dacă vom scrie x [20] 73 00:05:23,180 --> 00:05:26,060 sau chiar x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indicele nu are nici măcar să fie un număr. 75 00:05:28,240 --> 00:05:30,630 Acesta poate fi orice expresie arbitrară. 76 00:05:30,630 --> 00:05:34,800 În programul pe care îl utiliza i variabila de bucla pentru a indexa în matrice. 77 00:05:34,800 --> 00:05:40,340 Acesta este un model foarte comun, looping de la i = 0 la lungimea de matrice, 78 00:05:40,340 --> 00:05:43,350 și apoi i folosind ca index pentru matrice. 79 00:05:43,350 --> 00:05:46,160 În acest fel vă în mod eficient bucla pentru întreaga rețea, 80 00:05:46,160 --> 00:05:50,600 și aveți posibilitatea să atribuiți fie la fața locului, în fiecare matrice sau să-l utilizați pentru unele calcul. 81 00:05:50,600 --> 00:05:53,920 >> În prima bucla de, am începe de la 0, 82 00:05:53,920 --> 00:05:58,680 și așa se va atribui la fața locului 0 în matrice, valoarea 0 ori 2. 83 00:05:58,680 --> 00:06:04,370 Apoi am incremente, și am atribui primul loc în matrice valorii de 1 ori 2. 84 00:06:04,370 --> 00:06:10,170 Apoi m-am trepte din nou și așa mai departe, până vom atribui în poziția N-1 în matrice 85 00:06:10,170 --> 00:06:13,370 valoarea N-1 ori 2. 86 00:06:13,370 --> 00:06:17,810 Deci, am creat un tablou cu primele 10 numere chiar. 87 00:06:17,810 --> 00:06:21,970 Poate că ar fi fost echilibreaza un pic mai bine pentru nume variabila decât x, 88 00:06:21,970 --> 00:06:24,760 dar care ar fi dat la o parte lucrurile. 89 00:06:24,760 --> 00:06:30,210 A doua pentru bucla, apoi imprimă doar valorile pe care le-am deja stocate în interiorul tabloului. 90 00:06:30,210 --> 00:06:33,600 >> Să încercați să executați programul cu ambele tipuri de declarații de matrice 91 00:06:33,600 --> 00:06:36,330 și să ia o privire la ieșirea din program. 92 00:06:51,450 --> 00:06:57,020 În ceea ce putem vedea, programul se comporta la fel pentru ambele tipuri de declarații. 93 00:06:57,020 --> 00:07:02,230 Să aruncăm o privire la, de asemenea, ce se întâmplă dacă vom schimba bucla primul să nu se oprească la N 94 00:07:02,230 --> 00:07:05,040 ci spune mai degrabă 10.000. 95 00:07:05,040 --> 00:07:07,430 Dincolo de sfârșitul matrice. 96 00:07:14,700 --> 00:07:17,210 Hopa. Poate că ați văzut asta înainte. 97 00:07:17,210 --> 00:07:20,440 O eroare de segmentare înseamnă programul dumneavoastră prăbușit. 98 00:07:20,440 --> 00:07:24,430 Ai începe să vedeți aceste atunci când atingeți zonele de memorie pe care nu ar trebui să fie tangente. 99 00:07:24,430 --> 00:07:27,870 Aici ne ating 10,000 de locuri, dincolo de începutul lui x, 100 00:07:27,870 --> 00:07:31,920 care, evident, este un loc în memorie nu trebuie să ne atingă. 101 00:07:31,920 --> 00:07:37,690 Deci, cele mai multe dintre noi, probabil, nu ar pune accidental 10000 în loc de N, 102 00:07:37,690 --> 00:07:42,930 dar ce se întâmplă dacă facem ceva mai subtil ca spun de scriere mai mică sau egală cu N 103 00:07:42,930 --> 00:07:46,830 în stare de buclă pentru ca spre deosebire de mai puțin de N. 104 00:07:46,830 --> 00:07:50,100 Amintiți-vă că o matrice are doar indici de la 0 la N-1, 105 00:07:50,100 --> 00:07:54,510 ceea ce înseamnă că indicele N este dincolo de sfârșitul matrice. 106 00:07:54,510 --> 00:07:58,050 Programul nu s-ar putea prăbuși în acest caz, dar este încă o eroare. 107 00:07:58,050 --> 00:08:01,950 De fapt, această eroare este atât de comună că are nume propriu, 108 00:08:01,950 --> 00:08:03,970 un off de 1 eroare. 109 00:08:03,970 --> 00:08:05,970 >> Asta e. pentru elementele de bază. 110 00:08:05,970 --> 00:08:09,960 Deci, ce sunt diferențele majore între cele 2 tipuri de declarații de matrice? 111 00:08:09,960 --> 00:08:13,960 O diferență este în cazul în care bloc mare de memorie merge. 112 00:08:13,960 --> 00:08:17,660 În prima declarație, pe care-l sun pe tipul de suport-matrice, 113 00:08:17,660 --> 00:08:20,300 deși acest lucru nu este deloc un nume convențional, 114 00:08:20,300 --> 00:08:22,480 se va merge pe stivă. 115 00:08:22,480 --> 00:08:27,450 Întrucât, în al doilea, pe care le voi numi de tip pointer-matrice, se va merge pe movila. 116 00:08:27,450 --> 00:08:32,480 Acest lucru înseamnă că, atunci când se întoarce funcția, matricea suportul va fi automat dealocate, 117 00:08:32,480 --> 00:08:36,419 întrucât, trebuie să apelați în mod explicit gratuit de pe matrice indicatorul 118 00:08:36,419 --> 00:08:38,010 sau altceva aveți o scurgere de memorie. 119 00:08:38,010 --> 00:08:42,750 În plus, suportul matrice nu este de fapt o variabilă. 120 00:08:42,750 --> 00:08:45,490 Acest lucru este important. E doar un simbol. 121 00:08:45,490 --> 00:08:49,160 Vă puteți gândi la ea ca la o constantă că compilatorul alege pentru tine. 122 00:08:49,160 --> 00:08:52,970 Acest lucru înseamnă că nu putem face ceva de genul x + + cu tipul de suport, 123 00:08:52,970 --> 00:08:56,240 deși acest lucru este perfect valabil cu tipul pointer. 124 00:08:56,240 --> 00:08:58,270 >> Tipul de pointer este o variabilă. 125 00:08:58,270 --> 00:09:01,510 Pentru tip pointer, avem 2 blocuri separate de memorie. 126 00:09:01,510 --> 00:09:06,060 Variabila x în sine este stocată în stivă și este doar un indicator unic, 127 00:09:06,060 --> 00:09:08,620 dar bloc mare de memorie sunt stocate pe heap. 128 00:09:08,620 --> 00:09:11,010 Variabila x pe stiva stochează doar adresa 129 00:09:11,010 --> 00:09:14,010 de bloc mare de memorie pe heap. 130 00:09:14,010 --> 00:09:17,370 O implicație a acestui fapt este cu dimensiunea de operator. 131 00:09:17,370 --> 00:09:22,480 Dacă vă întrebați pentru dimensiunea de matrice suport, acesta va da dimensiunea de bloc mare de memorie, 132 00:09:22,480 --> 00:09:24,620 ceva de genul 40 octeți, 133 00:09:24,620 --> 00:09:26,920 dar dacă vă întreb pentru dimensiunea de tip pointer de matrice, 134 00:09:26,920 --> 00:09:32,740 acesta va da dimensiunea variabila x în sine, care, pe aparatul este probabil doar 4 octeți. 135 00:09:32,740 --> 00:09:36,530 Utilizarea de tip pointer-matrice, este imposibil de a solicita în mod direct de 136 00:09:36,530 --> 00:09:38,530 dimensiunea de bloc mare de memorie. 137 00:09:38,530 --> 00:09:42,530 Acest lucru nu este, de obicei, de mult o restricție, deoarece am foarte rar doresc dimensiunea 138 00:09:42,530 --> 00:09:46,980 din bloc mare de memorie, și putem calcula, de obicei, aceasta în cazul în care avem nevoie de ea. 139 00:09:46,980 --> 00:09:51,490 >> În cele din urmă, matrice suportul se întâmplă pentru a ne oferi o comandă rapidă pentru inițializarea unei matrice. 140 00:09:51,490 --> 00:09:56,130 Să vedem cum am putea scrie primele 10 numere întregi, chiar folosind initilization de comenzi rapide. 141 00:10:11,220 --> 00:10:14,470 Cu gama indicatorul, nu există o modalitate de a face o comandă rapidă de genul asta. 142 00:10:14,470 --> 00:10:18,120 Aceasta este doar o introducere la ceea ce puteți face cu tablouri. 143 00:10:18,120 --> 00:10:20,990 Ele arată în aproape fiecare program pe care il scrie. 144 00:10:20,990 --> 00:10:24,390 Sperăm că puteți vedea acum o modalitate mai bună de a face un exemplu carduri de student 145 00:10:24,390 --> 00:10:26,710 de la începutul videoclipului. 146 00:10:26,710 --> 00:10:29,960 >> Numele meu este Rob Bowden, iar acest lucru este CS50.