1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Anem a parlar sobre les matrius. 2 00:00:09,360 --> 00:00:12,780 Llavors, per què mai volem utilitzar matrius? 3 00:00:12,780 --> 00:00:17,210 Bé, diguem que vostè té un programa que necessita per emmagatzemar 5 identificacions estudiantils. 4 00:00:17,210 --> 00:00:21,270 Podria semblar raonable tenir 5 variables independents. 5 00:00:21,270 --> 00:00:24,240 Per raons que veurem en un moment, començarem a comptar des de 0. 6 00:00:24,240 --> 00:00:30,700 Les variables que tindrem serà id0 int, int ID1, i així successivament. 7 00:00:30,700 --> 00:00:34,870 Qualsevol lògica que vol fer en una identificació d'estudiant haurà de ser copiat i enganxat 8 00:00:34,870 --> 00:00:36,870 per a cadascuna d'aquestes identificacions estudiantils. 9 00:00:36,870 --> 00:00:39,710 Si volem comprovar que els alumnes passen a ser en CS50, 10 00:00:39,710 --> 00:00:43,910 el primer que haurà de comprovar si id0 representa l'estudiant en el curs. 11 00:00:43,910 --> 00:00:48,070 Després de fer el mateix per a l'estudiant que ve, haurà de copiar i enganxar el codi per id0 12 00:00:48,070 --> 00:00:54,430 i reemplaçar totes les aparicions de id0 amb ID1 i així successivament per ID2, 3, i 4. 13 00:00:54,430 --> 00:00:57,560 >> Així que se sent que hem de copiar i enganxar, 14 00:00:57,560 --> 00:01:00,440 vostè ha de començar a pensar que hi ha una solució millor. 15 00:01:00,440 --> 00:01:05,360 Ara el que si et dones compte que no és necessari 5 identificacions estudiantils sinó 7? 16 00:01:05,360 --> 00:01:09,570 Has d'anar novament dins les seves fonts i afegir en un id5, un ID6, 17 00:01:09,570 --> 00:01:14,260 i copiar i enganxar la lògica per comprovar si els ID de pertànyer a la classe per aquests 2 nous ID. 18 00:01:14,260 --> 00:01:19,600 No hi ha res connectar tots aquests identificadors de conjunt, i així que no hi ha forma de demanar 19 00:01:19,600 --> 00:01:22,040 el programa per fer això per als nombres del 0 al 6. 20 00:01:22,040 --> 00:01:26,120 Bé, ara t'adones que té 100 identificacions estudiantils. 21 00:01:26,120 --> 00:01:30,770 Està començant a semblar menys que ideal a haver de declarar per separat cadascuna d'aquestes identificacions, 22 00:01:30,770 --> 00:01:33,760 i copiar i enganxar qualsevol lògica per als nous ID. 23 00:01:33,760 --> 00:01:38,380 Però potser estem determinats, i nosaltres ho fem pels 100 alumnes. 24 00:01:38,380 --> 00:01:42,240 Però el que si vostè no sap quants estudiants hi ha en realitat? 25 00:01:42,240 --> 00:01:47,320 Hi ha només alguns estudiants núm i el seu programa ha de demanar a l'usuari el que n és. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Això no funcionarà molt bé. 27 00:01:50,250 --> 00:01:53,820 El programa només funciona per a un nombre constant dels estudiants. 28 00:01:53,820 --> 00:01:57,520 >> Resoldre tots aquests problemes és la bellesa de les matrius. 29 00:01:57,520 --> 00:01:59,930 Llavors, què és una matriu? 30 00:01:59,930 --> 00:02:04,480 En alguns llenguatges de programació un tipus de matriu pot ser capaç de fer una mica més, 31 00:02:04,480 --> 00:02:09,960 però aquí ens centrarem en la matriu bàsica de l'estructura de dades de la mateixa manera que ho veurà en C. 32 00:02:09,960 --> 00:02:14,030 Una matriu és simplement un gran bloc de memòria. Això és tot. 33 00:02:14,030 --> 00:02:17,770 Quan diem que tenim un arranjament de 10 punts, això només significa que tenim una mica de poma 34 00:02:17,770 --> 00:02:20,740 de memòria que és prou gran com per contenir 10 números enters separats. 35 00:02:29,930 --> 00:02:33,410 Assumint que un nombre enter de 4 bytes, el que significa que una matriu de 10 enters 36 00:02:33,410 --> 00:02:37,180 és un bloc continu de 40 bytes a la memòria. 37 00:02:42,660 --> 00:02:46,280 Fins i tot quan s'utilitzen matrius multidimensionals, que no anirem per aquí, 38 00:02:46,280 --> 00:02:49,200 encara és només un gran bloc de memòria. 39 00:02:49,200 --> 00:02:51,840 La notació multidimensional és només una conveniència. 40 00:02:51,840 --> 00:02:55,640 Si vostè té un 3 per 3 matriu multidimensional d'enters, 41 00:02:55,640 --> 00:03:00,650 llavors el seu programa realment només tractar això com un gran bloc de 36 bytes. 42 00:03:00,650 --> 00:03:05,460 El nombre total de nombres enters és 3 vegades 3, i cada enter ocupa 4 bytes. 43 00:03:05,460 --> 00:03:07,750 >> Fem una ullada a un exemple bàsic. 44 00:03:07,750 --> 00:03:10,660 Podem veure aquí dues maneres diferents de matrius declaren. 45 00:03:15,660 --> 00:03:18,580 Haurem de comentar un d'ells pel programa per compilar 46 00:03:18,580 --> 00:03:20,900 ja que declarem x dues vegades. 47 00:03:20,900 --> 00:03:25,140 Anem a fer una ullada a algunes de les diferències entre aquests dos tipus de declaracions en una mica. 48 00:03:25,140 --> 00:03:28,560 Aquestes dues línies de declarar una matriu de mida n, 49 00:03:28,560 --> 00:03:30,740 on hem # defineix N com 10. 50 00:03:30,740 --> 00:03:34,460 Ens podria fàcilment haver demanat a l'usuari un nombre enter positiu 51 00:03:34,460 --> 00:03:37,250 i utilitza aquest nombre enter com una sèrie d'elements en la nostra matriu. 52 00:03:37,250 --> 00:03:41,960 Igual que l'exemple d'estudiant abans, això és una cosa així com declarar totalment independent 10 53 00:03:41,960 --> 00:03:49,000 Les variables imaginàries; x0, x1, x2, i així successivament fins xN-1. 54 00:03:57,270 --> 00:04:00,840 Fent cas omís de les línies en les quals es declara la matriu, observi els claudàtors intacte 55 00:04:00,840 --> 00:04:02,090 dins de la dels bucles. 56 00:04:02,090 --> 00:04:09,660 Quan escrivim alguna cosa com x [3], que només vaig a llegir com a suport x 3, 57 00:04:09,660 --> 00:04:13,090 vostè pot pensar que és com preguntar pel imaginari x3. 58 00:04:13,090 --> 00:04:17,519 Noteu que amb una matriu de grandària N, això significa que el nombre dins dels claudàtors, 59 00:04:17,519 --> 00:04:22,630 que anomenarem l'índex, pot ser qualsevol cosa, des de 0 a N-1, 60 00:04:22,630 --> 00:04:25,660 que és un total d'índexs núm. 61 00:04:25,660 --> 00:04:28,260 >> Pensar en com funciona realment 62 00:04:28,260 --> 00:04:31,260 recordar que la matriu és un gran bloc de memòria. 63 00:04:31,260 --> 00:04:37,460 Suposant que un enter és de 4 bytes, l'arsenal sencer x és un bloc de 40 bytes de memòria. 64 00:04:37,460 --> 00:04:41,360 Així x0 fa als primers 4 bytes del bloc. 65 00:04:45,810 --> 00:04:49,230 X [1] es refereix als propers 4 bytes i així successivament. 66 00:04:49,230 --> 00:04:53,760 Això significa que l'inici de x és tot el programa mai necessita seguir la pista. 67 00:04:55,660 --> 00:04:59,840 Si voleu utilitzar x [400], el programa sap que és equivalent 68 00:04:59,840 --> 00:05:03,460 a només 1.600 bytes després de l'inici de x. 69 00:05:03,460 --> 00:05:08,780 D'on obtenim 1.600 bytes de? Està a 400 vegades 4 bytes del tot. 70 00:05:08,780 --> 00:05:13,170 >> Abans de continuar, és molt important tenir en compte que en C 71 00:05:13,170 --> 00:05:17,080 no hi ha control de l'índex que s'utilitza en la matriu. 72 00:05:17,080 --> 00:05:23,180 El nostre gran bloc és a 10 punts llargs, però res va a cridar a nosaltres si escrivim x [20] 73 00:05:23,180 --> 00:05:26,060 o fins i tot x [-5]. 74 00:05:26,060 --> 00:05:28,240 L'índex no té ni tan sols per ser un nombre. 75 00:05:28,240 --> 00:05:30,630 Pot ser qualsevol expressió arbitrària. 76 00:05:30,630 --> 00:05:34,800 Al programa que utilitzi la variable i de la bucle per índex en la matriu. 77 00:05:34,800 --> 00:05:40,340 Aquest és un patró molt comú, d'enllaç de i = 0 a la longitud de la matriu, 78 00:05:40,340 --> 00:05:43,350 i i, a continuació, utilitzant com a índex de la matriu. 79 00:05:43,350 --> 00:05:46,160 D'aquesta manera, efectivament llaç sobre tota la matriu, 80 00:05:46,160 --> 00:05:50,600 i es poden assignar a cada punt de la matriu o utilitzar-lo per algun càlcul. 81 00:05:50,600 --> 00:05:53,920 >> En el primer bucle, i comença en 0, 82 00:05:53,920 --> 00:05:58,680 i pel que cedirà al punt 0 en la matriu, el valor 0 vegades 2. 83 00:05:58,680 --> 00:06:04,370 Llavors jo increments, i li assignem el primer lloc en la matriu el valor 1 vegades 2. 84 00:06:04,370 --> 00:06:10,170 Llavors em increments de nou i així successivament fins que se li assigna a la posició N-1 a la matriu 85 00:06:10,170 --> 00:06:13,370 el valor N-1 vegades 2. 86 00:06:13,370 --> 00:06:17,810 Per això hem creat una matriu amb els 10 primers nombres parells. 87 00:06:17,810 --> 00:06:21,970 Potser iguala hagués estat una mica millor nom per a la variable de x, 88 00:06:21,970 --> 00:06:24,760 però que li hauria donat les coses. 89 00:06:24,760 --> 00:06:30,210 El segon bucle for a continuació, només imprimeix els valors que ja hem emmagatzemat dins de la matriu. 90 00:06:30,210 --> 00:06:33,600 >> Tractarem d'executar el programa amb dos tipus de declaracions d'arrays 91 00:06:33,600 --> 00:06:36,330 i fer una ullada a la sortida del programa. 92 00:06:51,450 --> 00:06:57,020 Pel que podem veure, el programa es comporta de la mateixa manera per tots dos tipus de declaracions. 93 00:06:57,020 --> 00:07:02,230 També anem a fer una ullada al que succeeix si canviem el primer bucle de no parar en N 94 00:07:02,230 --> 00:07:05,040 sinó més bé dir 10.000. 95 00:07:05,040 --> 00:07:07,430 Molt més enllà del final de la matriu. 96 00:07:14,700 --> 00:07:17,210 Oops. Potser vostè ha vist això abans. 97 00:07:17,210 --> 00:07:20,440 Un error de segmentació significa que el programa s'ha bloquejat. 98 00:07:20,440 --> 00:07:24,430 Vostè començarà a veure aquests quan et toqui les àrees de memòria que no s'ha de tocar. 99 00:07:24,430 --> 00:07:27,870 Aquí estem tocant 10.000 places més enllà del començament de x, 100 00:07:27,870 --> 00:07:31,920 que, evidentment, és un lloc en la memòria que no ha de tocar. 101 00:07:31,920 --> 00:07:37,690 Així que la majoria de nosaltres probablement no per casualitat posaria 10.000 en lloc de N, 102 00:07:37,690 --> 00:07:42,930 però el que si podem fer alguna cosa més subtil, com diuen escriptura menor o igual a N 103 00:07:42,930 --> 00:07:46,830 en la condició de bucle per en oposició a menys de N. 104 00:07:46,830 --> 00:07:50,100 Recordeu que una matriu només té índexs de 0 a N-1, 105 00:07:50,100 --> 00:07:54,510 el que significa que l'índex de N està més enllà del final de la matriu. 106 00:07:54,510 --> 00:07:58,050 El programa no pot fallar en aquest cas, però tot i així és un error. 107 00:07:58,050 --> 00:08:01,950 De fet, aquest error és tan comú que dona el seu nom, 108 00:08:01,950 --> 00:08:03,970 un apagat per un error. 109 00:08:03,970 --> 00:08:05,970 >> Això és per al bàsic. 110 00:08:05,970 --> 00:08:09,960 Quines són les principals diferències entre els dos tipus de declaracions d'arrays? 111 00:08:09,960 --> 00:08:13,960 Una diferència és que el gran bloc de memòria va. 112 00:08:13,960 --> 00:08:17,660 A la primera declaració, que vaig a trucar al suport tipus-matriu, 113 00:08:17,660 --> 00:08:20,300 encara que això no és en absolut un nom convencional, 114 00:08:20,300 --> 00:08:22,480 el límit de la pila. 115 00:08:22,480 --> 00:08:27,450 Mentre que en el segon, el que anomenaré el tipus de punter-array, anirà en el munt. 116 00:08:27,450 --> 00:08:32,480 Això vol dir que quan es retorna la funció, la matriu de suport automàticament es cancel · la assignació de 117 00:08:32,480 --> 00:08:36,419 mentre que a mesura que explicitily de cridar lliure a la matriu punter 118 00:08:36,419 --> 00:08:38,010 o en cas contrari vostè té una pèrdua de memòria. 119 00:08:38,010 --> 00:08:42,750 A més, la matriu de suport no és en realitat una variable. 120 00:08:42,750 --> 00:08:45,490 Això és important. És només un símbol. 121 00:08:45,490 --> 00:08:49,160 Vostè pot pensar en ell com una constant que el compilador ha triat per a vostè. 122 00:08:49,160 --> 00:08:52,970 Això vol dir que no podem fer alguna cosa com x + + amb el tipus de suport, 123 00:08:52,970 --> 00:08:56,240 encara que això és perfectament vàlid amb el tipus de punter. 124 00:08:56,240 --> 00:08:58,270 >> El tipus de punter és una variable. 125 00:08:58,270 --> 00:09:01,510 Per al tipus de punter, tenim 2 blocs separats de la memòria. 126 00:09:01,510 --> 00:09:06,060 La variable X en si s'emmagatzema a la pila i és només un punter, 127 00:09:06,060 --> 00:09:08,620 però el gran bloc de memòria s'emmagatzema en el munt. 128 00:09:08,620 --> 00:09:11,010 La variable x a la pila només emmagatzema l'adreça 129 00:09:11,010 --> 00:09:14,010 del gran bloc de memòria en el munt. 130 00:09:14,010 --> 00:09:17,370 Una implicació d'això és amb la mida de l'operador. 131 00:09:17,370 --> 00:09:22,480 Si sol · licita la mida de la matriu suport, que li donarà la mida del bloc gran de memòria, 132 00:09:22,480 --> 00:09:24,620 alguna cosa així com 40 bytes, 133 00:09:24,620 --> 00:09:26,920 però si vostè demana la mida del tipus de punter de matriu, 134 00:09:26,920 --> 00:09:32,740 se li donarà la mida de la variable x en si, que l'aparell és probablement només 4 bytes. 135 00:09:32,740 --> 00:09:36,530 Utilitzant el tipus de punter de matriu, és impossible demanar directament per 136 00:09:36,530 --> 00:09:38,530 la mida del bloc gran de memòria. 137 00:09:38,530 --> 00:09:42,530 Això no és generalment molt més d'una restricció ja que molt poques vegades es vol que la mida 138 00:09:42,530 --> 00:09:46,980 del gran bloc de memòria, i en general es pot calcular si la necessitem. 139 00:09:46,980 --> 00:09:51,490 >> Finalment, la matriu de suport que passa que ens proporcioni un accés directe per a la inicialització d'una matriu. 140 00:09:51,490 --> 00:09:56,130 Anem a veure com podem escriure els 10 primers enters parells utilitzant la inicialització d'accés directe. 141 00:10:11,220 --> 00:10:14,470 Amb la matriu de punters, no hi ha una manera de fer un accés directe d'aquesta manera. 142 00:10:14,470 --> 00:10:18,120 Això és només una introducció al que pot fer amb arrays. 143 00:10:18,120 --> 00:10:20,990 Es presenten en gairebé tots els programes que vostè escriu. 144 00:10:20,990 --> 00:10:24,390 Esperem que ara es pot veure una manera millor de fer l'estudiant exemple els ID 145 00:10:24,390 --> 00:10:26,710 des de l'inici del vídeo. 146 00:10:26,710 --> 00:10:29,960 >> El meu nom és Rob Bowden, i això és CS50.