[Powered by Google Translate] Imos falar sobre matrices.
Entón por que iríamos querer usar arrays?
Ben, imos dicir que ten un programa que precisa para almacenar cinco identificacións estudantís.
Pode parecer razoable ter cinco variables separadas.
Por razóns que veremos de aquí a pouco, imos comezar a contar a partir de 0.
As variables que teremos será id0 int, int id1, e así por diante.
Calquera lóxica queremos facer nunha bolsa de estudante deberá ser copiado e pegado
para cada un destes IDs do estudante.
Se queres comprobar que os estudantes que ser en CS50,
imos primeiro cómpre comprobar se id0 representa o estudante no curso.
Entón, para facer o mesmo para o alumno que vén, nós imos ter copiar e pegar o código para id0
e substituír todas as ocorrencias con id0 id1 e así por diante para id2, 3, e 4.
>> Así que escoitar que hai que copiar e pegar,
ten que comezar a pensar que hai unha solución mellor.
Agora, o que se entende que non precisa de 5 identificacións estudantís, senón 7?
Debe volver ao seu código fonte e engadir un ID5, un ID6,
e copia e pega a lóxica para comprobar que as identificacións pertencen á clase para estas dúas novas identificacións.
Non hai nada que chame todas estas identificacións xuntos, e así non hai ningunha forma de pedir
o programa para facer iso para IDs de 0 a 6.
Ben, agora entende que ten 100 identificacións estudantís.
Está empezando a parecer menos que o ideal a necesidade de declarar por separado cada unha desas identificacións,
e copiar e pegar calquera lóxica para esas novas identificacións.
Pero quizais son determinados, e facemos isto para todos os 100 alumnos.
Pero e se non sabe cantos alumnos realmente existen?
Hai só uns alumnos ne seu programa ten que preguntar ao usuario o que n é.
Uh oh. Iso non vai funcionar moi ben.
O seu programa só funciona para un número constante de alumnos.
>> Resolver todos estes problemas é a beleza de matrices.
Entón, o que é unha matriz?
En moitas linguaxes de programación un tipo de matriz pode ser capaz de facer un pouco máis,
pero aquí imos nos centrarse no básico estrutura de datos matriz, así como vai ver que en C.
Unha matriz é só un bloque grande de memoria. É iso aí.
Cando dicimos que temos unha matriz de 10 enteiros, iso só significa que temos algún bloque
de memoria que é grande o suficiente para almacenar 10 enteiros separados.
Asumindo que un número enteiro de 4 bytes, o que significa que un array de 10 enteiros
é un bloque continuo de 40 bytes de memoria.
Mesmo cando usa matrices multidimensionais que non imos para aquí,
aínda é só un bloque grande de memoria.
A notación multidimensional é só unha conveniencia.
Se vostede ten un 3 por 3 matriz multidimensional de enteiros,
a continuación, o programa vai realmente só tratar isto como un gran bloque de 36 bytes.
O número total de números enteiros é de 3 veces 3, e cada número enteiro ocupa catro bytes.
>> Imos dar un ollo a un exemplo básico.
Podemos ver aquí dúas formas diferentes de matrices declarando.
Nós imos ter que comentar un deles para fóra para que o programa compilar
unha vez que declara x dúas veces.
Nós imos dar un ollo a algunhas das diferenzas entre estes dous tipos de declaracións en un pouco.
Ambas estas liñas de declarar unha matriz de tamaño N,
onde temos # define N como 10.
Poderiamos facilmente ter preguntado ao usuario un número enteiro positivo
e usado ese enteiro como un número de elementos na nosa matriz.
Como o noso exemplo estudante antes, este é o tipo de como declarar 10 completamente separado
variables imaxinarios; x0, x1, x2, e así por diante ata o XN-1.
Ignorando as liñas onde nós declaramos a matriz, observe os corchetes intacta
dentro do para loops.
Cando escribimos algo x [3], que eu vou ler como soporte x 3,
Podes pensar niso como pedirlle a x3 imaxinario.
Notar que unha matriz de tamaño N, isto significa que o número dentro dos soportes,
que chamaremos o índice, pode ser calquera cousa de 0 a N-1,
que é un total de índices de N.
>> Para pensar sobre como isto realmente funciona
Lembre que a matriz é un gran bloque de memoria.
Supoñendo que se un número enteiro é de 4 bytes, o x matriz enteira é un bloque de 40 bytes de memoria.
Así x0 refírese aos primeiros 4 bytes do bloque.
X [1] refírese ás seguintes catro bytes e así por diante.
Isto significa que o inicio x todo o programa sempre que seguir.
Se quere usar x [400], a continuación, o programa sabe que iso é equivalente
para só 1600 bytes tras o inicio do x.
Onde temos 1.600 bytes? É só a 400 veces 4 bytes por enteiro.
>> Antes de continuar, é moi importante entender que en C
non hai aplicación do índice que utilizamos na matriz.
O noso gran bloque é de só 10 enteiros longo, pero nada vai berrar con nós escribir x [20]
ou aínda x [-5].
O índice non ten sequera a ser un número.
Pode ser calquera expresión arbitraria.
No programa usan a variable i do loop for a índice para a matriz.
Trátase de un patrón moi común, looping de i = 0 para a lonxitude da matriz,
e, a continuación, utilizando i como o índice para a matriz.
Deste xeito, circuíto efectivamente todo o conxunto,,
e pode atribuír a cada punto na matriz ou usalo por algún cálculo.
>> No primeiro bucle, i comeza en 0,
e por iso vai asignar o punto 0 na matriz, o valor 0 veces 2.
Entón eu incrementos, e asignar o primeiro lugar na matriz o valor 1 veces 2.
Entón eu incrementa novo e así por diante ata que atribuímos á posición n-1 na matriz
o valor de N-1 veces 2.
Entón, creamos unha matriz cos 10 primeiros números pares.
Quizais gradúa sería un pouco mellor nome para a variable X,
pero que daría cousas.
O segundo bucle entón só imprime os valores que xa foron almacenados dentro da matriz.
>> Imos tentar executar o programa cos dous tipos de declaracións de matriz
e dar un ollo á saída do programa.
Tanto como se pode ver, o programa compórtase do mesmo xeito para os dous tipos de declaracións.
Imos tamén dar un ollo ao que acontece se mudarmos o primeiro ciclo de non parar en N
pero dicir 10.000.
Moito máis alá do fin da matriz.
Oops. Poida que teña visto iso antes.
Un fallo de segmento significa que o seu programa deixou de funcionar.
Comezar a ver estes cando tocar as áreas da memoria que non debe tocar.
Aquí estamos tocando 10.000 prazas ademais do inicio de x,
que, evidentemente, é un lugar de memoria que non debe tocar.
Así, a maioría de nós probablemente non tería accidentalmente poñer 10.000 en vez de N,
pero o que facer algo máis sutil, como din gravación menor ou igual a N
na súa condición de loop para en vez de menos de N.
Lembre que unha matriz só ten índices de 0 a N-1,
o que significa que o índice N é ademais da extremidade da matriz.
O programa non pode fallar neste caso, pero aínda así é un erro.
En realidade, ese erro é tan común que ten o seu propio nome,
un fóra por un erro.
>> Isto é todo o básico.
Entón, cales son as principais diferenzas entre os dous tipos de declaracións de matriz?
Unha diferenza é que o gran bloque de memoria vai.
Na primeira declaración, que eu vou chamar o tipo de admisión de matriz,
aínda que isto sexa de xeito un nome convencional,
vai para a pila.
Mentres que no segundo, que eu vou chamar o tipo de punteiro-array, que vai na pila.
Isto significa que cando a función devolve a matriz soporte será automaticamente desalocado,
Considerando que, como ten que chamar explicitamente libre na matriz de punteiro
ou ben ten un baleirado de memoria.
Ademais, a matriz de soporte non é, en realidade, unha variable.
Isto é importante. É só un símbolo.
Podes pensar niso como unha constante que o compilador escolle para ti.
Isto significa que non podemos facer algo como x + + co tipo de soporte,
que isto é perfectamente válido o tipo de punteiro.
>> O tipo de punteiro é unha variable.
Para o tipo de punteiro, temos dous bloques separados de memoria.
A variable x en si é almacenado na pila e está a só un único punteiro,
pero o gran bloque de memoria se garda na pila.
A variable x na pila só almacena o enderezo
do gran bloque de memoria no heap.
Unha implicación desta é o tamaño do operador.
Se preguntar para o tamaño da matriz do soporte, que lle dará o tamaño do gran bloque de memoria,
algo así como 40 bytes,
pero se preguntar para o tamaño do tipo de punteiro de matriz,
el vai che dar o tamaño da variable x en si, que o aparello é probable só 4 bytes.
Usando o tipo de punteiro matriz, é imposible pedir directamente
o tamaño do bloque de memoria grande.
Este non é xeralmente moito máis dunha restrición, xa que moi raramente quere o tamaño
do bloque do gran de memoria, e xeralmente pode calculalas lo se requirir.
>> Finalmente, a matriz soporte acontece nos ofrecer un atallo para arrincar unha matriz.
Imos ver como podemos escribir os 10 primeiros números enteiros ata usar o initilization ligazón.
Coa matriz de punteiro, non existe unha forma de facer un atallo coma este.
Esta é só unha introdución para o que podes facer con matrices.
Aparecen en case todos os programas que escribe.
Espero que agora podes ver a mellor forma de facer o alumno exemplo IDs
a partir do inicio do vídeo.
>> O meu nome é Rob Bowden, e este é o CS50.