[Powered by Google Translate] Anem a parlar sobre les matrius.
Llavors, per què mai volem utilitzar matrius?
Bé, diguem que vostè té un programa que necessita per emmagatzemar 5 identificacions estudiantils.
Podria semblar raonable tenir 5 variables independents.
Per raons que veurem en un moment, començarem a comptar des de 0.
Les variables que tindrem serà id0 int, int ID1, i així successivament.
Qualsevol lògica que vol fer en una identificació d'estudiant haurà de ser copiat i enganxat
per a cadascuna d'aquestes identificacions estudiantils.
Si volem comprovar que els alumnes passen a ser en CS50,
el primer que haurà de comprovar si id0 representa l'estudiant en el curs.
Després de fer el mateix per a l'estudiant que ve, haurà de copiar i enganxar el codi per id0
i reemplaçar totes les aparicions de id0 amb ID1 i així successivament per ID2, 3, i 4.
>> Així que se sent que hem de copiar i enganxar,
vostè ha de començar a pensar que hi ha una solució millor.
Ara el que si et dones compte que no és necessari 5 identificacions estudiantils sinó 7?
Has d'anar novament dins les seves fonts i afegir en un id5, un ID6,
i copiar i enganxar la lògica per comprovar si els ID de pertànyer a la classe per aquests 2 nous ID.
No hi ha res connectar tots aquests identificadors de conjunt, i així que no hi ha forma de demanar
el programa per fer això per als nombres del 0 al 6.
Bé, ara t'adones que té 100 identificacions estudiantils.
Està començant a semblar menys que ideal a haver de declarar per separat cadascuna d'aquestes identificacions,
i copiar i enganxar qualsevol lògica per als nous ID.
Però potser estem determinats, i nosaltres ho fem pels 100 alumnes.
Però el que si vostè no sap quants estudiants hi ha en realitat?
Hi ha només alguns estudiants núm i el seu programa ha de demanar a l'usuari el que n és.
Uh oh. Això no funcionarà molt bé.
El programa només funciona per a un nombre constant dels estudiants.
>> Resoldre tots aquests problemes és la bellesa de les matrius.
Llavors, què és una matriu?
En alguns llenguatges de programació un tipus de matriu pot ser capaç de fer una mica més,
però aquí ens centrarem en la matriu bàsica de l'estructura de dades de la mateixa manera que ho veurà en C.
Una matriu és simplement un gran bloc de memòria. Això és tot.
Quan diem que tenim un arranjament de 10 punts, això només significa que tenim una mica de poma
de memòria que és prou gran com per contenir 10 números enters separats.
Assumint que un nombre enter de 4 bytes, el que significa que una matriu de 10 enters
és un bloc continu de 40 bytes a la memòria.
Fins i tot quan s'utilitzen matrius multidimensionals, que no anirem per aquí,
encara és només un gran bloc de memòria.
La notació multidimensional és només una conveniència.
Si vostè té un 3 per 3 matriu multidimensional d'enters,
llavors el seu programa realment només tractar això com un gran bloc de 36 bytes.
El nombre total de nombres enters és 3 vegades 3, i cada enter ocupa 4 bytes.
>> Fem una ullada a un exemple bàsic.
Podem veure aquí dues maneres diferents de matrius declaren.
Haurem de comentar un d'ells pel programa per compilar
ja que declarem x dues vegades.
Anem a fer una ullada a algunes de les diferències entre aquests dos tipus de declaracions en una mica.
Aquestes dues línies de declarar una matriu de mida n,
on hem # defineix N com 10.
Ens podria fàcilment haver demanat a l'usuari un nombre enter positiu
i utilitza aquest nombre enter com una sèrie d'elements en la nostra matriu.
Igual que l'exemple d'estudiant abans, això és una cosa així com declarar totalment independent 10
Les variables imaginàries; x0, x1, x2, i així successivament fins xN-1.
Fent cas omís de les línies en les quals es declara la matriu, observi els claudàtors intacte
dins de la dels bucles.
Quan escrivim alguna cosa com x [3], que només vaig a llegir com a suport x 3,
vostè pot pensar que és com preguntar pel imaginari x3.
Noteu que amb una matriu de grandària N, això significa que el nombre dins dels claudàtors,
que anomenarem l'índex, pot ser qualsevol cosa, des de 0 a N-1,
que és un total d'índexs núm.
>> Pensar en com funciona realment
recordar que la matriu és un gran bloc de memòria.
Suposant que un enter és de 4 bytes, l'arsenal sencer x és un bloc de 40 bytes de memòria.
Així x0 fa als primers 4 bytes del bloc.
X [1] es refereix als propers 4 bytes i així successivament.
Això significa que l'inici de x és tot el programa mai necessita seguir la pista.
Si voleu utilitzar x [400], el programa sap que és equivalent
a només 1.600 bytes després de l'inici de x.
D'on obtenim 1.600 bytes de? Està a 400 vegades 4 bytes del tot.
>> Abans de continuar, és molt important tenir en compte que en C
no hi ha control de l'índex que s'utilitza en la matriu.
El nostre gran bloc és a 10 punts llargs, però res va a cridar a nosaltres si escrivim x [20]
o fins i tot x [-5].
L'índex no té ni tan sols per ser un nombre.
Pot ser qualsevol expressió arbitrària.
Al programa que utilitzi la variable i de la bucle per índex en la matriu.
Aquest és un patró molt comú, d'enllaç de i = 0 a la longitud de la matriu,
i i, a continuació, utilitzant com a índex de la matriu.
D'aquesta manera, efectivament llaç sobre tota la matriu,
i es poden assignar a cada punt de la matriu o utilitzar-lo per algun càlcul.
>> En el primer bucle, i comença en 0,
i pel que cedirà al punt 0 en la matriu, el valor 0 vegades 2.
Llavors jo increments, i li assignem el primer lloc en la matriu el valor 1 vegades 2.
Llavors em increments de nou i així successivament fins que se li assigna a la posició N-1 a la matriu
el valor N-1 vegades 2.
Per això hem creat una matriu amb els 10 primers nombres parells.
Potser iguala hagués estat una mica millor nom per a la variable de x,
però que li hauria donat les coses.
El segon bucle for a continuació, només imprimeix els valors que ja hem emmagatzemat dins de la matriu.
>> Tractarem d'executar el programa amb dos tipus de declaracions d'arrays
i fer una ullada a la sortida del programa.
Pel que podem veure, el programa es comporta de la mateixa manera per tots dos tipus de declaracions.
També anem a fer una ullada al que succeeix si canviem el primer bucle de no parar en N
sinó més bé dir 10.000.
Molt més enllà del final de la matriu.
Oops. Potser vostè ha vist això abans.
Un error de segmentació significa que el programa s'ha bloquejat.
Vostè començarà a veure aquests quan et toqui les àrees de memòria que no s'ha de tocar.
Aquí estem tocant 10.000 places més enllà del començament de x,
que, evidentment, és un lloc en la memòria que no ha de tocar.
Així que la majoria de nosaltres probablement no per casualitat posaria 10.000 en lloc de N,
però el que si podem fer alguna cosa més subtil, com diuen escriptura menor o igual a N
en la condició de bucle per en oposició a menys de N.
Recordeu que una matriu només té índexs de 0 a N-1,
el que significa que l'índex de N està més enllà del final de la matriu.
El programa no pot fallar en aquest cas, però tot i així és un error.
De fet, aquest error és tan comú que dona el seu nom,
un apagat per un error.
>> Això és per al bàsic.
Quines són les principals diferències entre els dos tipus de declaracions d'arrays?
Una diferència és que el gran bloc de memòria va.
A la primera declaració, que vaig a trucar al suport tipus-matriu,
encara que això no és en absolut un nom convencional,
el límit de la pila.
Mentre que en el segon, el que anomenaré el tipus de punter-array, anirà en el munt.
Això vol dir que quan es retorna la funció, la matriu de suport automàticament es cancel · la assignació de
mentre que a mesura que explicitily de cridar lliure a la matriu punter
o en cas contrari vostè té una pèrdua de memòria.
A més, la matriu de suport no és en realitat una variable.
Això és important. És només un símbol.
Vostè pot pensar en ell com una constant que el compilador ha triat per a vostè.
Això vol dir que no podem fer alguna cosa com x + + amb el tipus de suport,
encara que això és perfectament vàlid amb el tipus de punter.
>> El tipus de punter és una variable.
Per al tipus de punter, tenim 2 blocs separats de la memòria.
La variable X en si s'emmagatzema a la pila i és només un punter,
però el gran bloc de memòria s'emmagatzema en el munt.
La variable x a la pila només emmagatzema l'adreça
del gran bloc de memòria en el munt.
Una implicació d'això és amb la mida de l'operador.
Si sol · licita la mida de la matriu suport, que li donarà la mida del bloc gran de memòria,
alguna cosa així com 40 bytes,
però si vostè demana la mida del tipus de punter de matriu,
se li donarà la mida de la variable x en si, que l'aparell és probablement només 4 bytes.
Utilitzant el tipus de punter de matriu, és impossible demanar directament per
la mida del bloc gran de memòria.
Això no és generalment molt més d'una restricció ja que molt poques vegades es vol que la mida
del gran bloc de memòria, i en general es pot calcular si la necessitem.
>> Finalment, la matriu de suport que passa que ens proporcioni un accés directe per a la inicialització d'una matriu.
Anem a veure com podem escriure els 10 primers enters parells utilitzant la inicialització d'accés directe.
Amb la matriu de punters, no hi ha una manera de fer un accés directe d'aquesta manera.
Això és només una introducció al que pot fer amb arrays.
Es presenten en gairebé tots els programes que vostè escriu.
Esperem que ara es pot veure una manera millor de fer l'estudiant exemple els ID
des de l'inici del vídeo.
>> El meu nom és Rob Bowden, i això és CS50.