[Powered by Google Translate] Vamos falar sobre matrizes.
Então por que iríamos querer usar arrays?
Bem, vamos dizer que você tem um programa que precisa para armazenar cinco identificações estudantis.
Pode parecer razoável ter cinco variáveis ​​separadas.
Por razões que veremos daqui a pouco, nós vamos começar a contar a partir de 0.
As variáveis ​​que teremos será id0 int, int id1, e assim por diante.
Qualquer lógica queremos executar em uma carteira de estudante deverá ser copiado e colado
para cada um destes IDs do estudante.
Se quiser verificar que os estudantes que ser em CS50,
vamos primeiro precisa verificar se id0 representa o estudante no curso.
Então, para fazer o mesmo para o aluno que vem, nós vamos precisar copiar e colar o código para id0
e substituir todas as ocorrências com id0 id1 e assim por diante para id2, 3, e 4.
>> Assim que você ouvir que é preciso copiar e colar,
você deve começar a pensar que há uma solução melhor.
Agora, o que se você percebe que não precisa de 5 identificações estudantis, mas sim 7?
Você precisa voltar para o seu código fonte e adicionar em um ID5, um ID6,
e copie e cole a lógica para verificar se as identificações pertencem à classe para estas duas novas identificações.
Não há nada que ligue todas estas identificações juntos, e assim não há nenhuma maneira de pedir
o programa para fazer isso para IDs de 0 a 6.
Bem, agora você percebe que tem 100 identificações estudantis.
Está começando a parecer menos do que o ideal a necessidade de declarar separadamente cada uma dessas identificações,
e copiar e colar qualquer lógica para essas novas identificações.
Mas talvez nós são determinados, e fazemos isso para todos os 100 alunos.
Mas e se você não sabe quantos alunos realmente existem?
Há apenas alguns alunos n e seu programa tem que perguntar ao usuário o que n é.
Uh oh. Isso não vai funcionar muito bem.
Seu programa só funciona para um número constante de alunos.
>> Resolver todos esses problemas é a beleza de matrizes.
Então, o que é uma matriz?
Em algumas linguagens de programação um tipo de matriz pode ser capaz de fazer um pouco mais,
mas aqui vamos nos concentrar no básico estrutura de dados matriz, assim como você vai ver que em C.
Uma matriz é apenas um bloco grande de memória. É isso aí.
Quando dizemos que temos uma matriz de 10 inteiros, isso só significa que temos algum bloco
de memória que é grande o suficiente para armazenar 10 inteiros separados.
Assumindo-se que um número inteiro de 4 bytes, o que significa que um array de 10 inteiros
é um bloco contínuo de 40 bytes de memória.
Mesmo quando você usa matrizes multidimensionais, que não vamos para aqui,
ainda é apenas um bloco grande de memória.
A notação multidimensional é apenas uma conveniência.
Se você tem um 3 por 3 matriz multidimensional de inteiros,
em seguida, o programa vai realmente apenas tratar isso como um grande bloco de 36 bytes.
O número total de números inteiros é de 3 vezes 3, e cada número inteiro ocupa quatro bytes.
>> Vamos dar uma olhada em um exemplo básico.
Podemos ver aqui duas formas diferentes de matrizes declarando.
Nós vamos ter que comentar um deles para fora para que o programa compilar
uma vez que declara x duas vezes.
Nós vamos dar uma olhada em algumas das diferenças entre estes dois tipos de declarações em um pouco.
Ambas estas linhas de declarar uma matriz de tamanho N,
onde temos # define N como 10.
Poderíamos facilmente ter perguntado ao usuário um número inteiro positivo
e usado esse inteiro como um número de elementos na nossa matriz.
Como o nosso exemplo de estudante antes, este é o tipo de como declarar 10 completamente separado
variáveis ​​imaginários; x0, x1, x2, e assim por diante até a xN-1.
Ignorando as linhas onde nós declaramos a matriz, observe os colchetes intacta
dentro do para loops.
Quando escrevemos algo como x [3], que eu vou ler como suporte x 3,
Você pode pensar nisso como pedir para o x3 imaginário.
Notar que com uma matriz de tamanho N, isto significa que o número dentro dos suportes,
que chamaremos o índice, pode ser qualquer coisa de 0 a N-1,
que é um total de índices de N.
>> Para pensar sobre como isso realmente funciona
lembre-se que a matriz é um grande bloco de memória.
Supondo-se que um número inteiro é de 4 bytes, o x matriz inteira é um bloco de 40 bytes de memória.
Assim x0 refere-se aos primeiros 4 bytes do bloco.
X [1] se refere às seguintes quatro bytes e assim por diante.
Isto significa que o início de x é todo o programa sempre precisa acompanhar.
Se você quiser usar x [400], em seguida, o programa sabe que isso é equivalente
para apenas 1600 bytes após o início do x.
Onde temos 1.600 bytes de? É apenas a 400 vezes 4 bytes por inteiro.
>> Antes de prosseguir, é muito importante perceber que em C
não há aplicação do índice que usamos na matriz.
Nosso grande bloco é de apenas 10 inteiros longo, mas nada vai gritar com nós se escrever x [20]
ou ainda x [-5].
O índice não tem sequer a ser um número.
Ele pode ser qualquer expressão arbitrária.
No programa usamos a variável i do loop for para índice para a matriz.
Trata-se de um padrão muito comum, looping de i = 0 para o comprimento da matriz,
e, em seguida, utilizando i como o índice para a matriz.
Desta forma, você circuito efetivamente todo o conjunto,,
e você pode atribuir a cada ponto na matriz ou usá-lo por algum cálculo.
>> No primeiro loop, i começa em 0,
e por isso vai atribuir ao ponto 0 na matriz, o valor 0 vezes 2.
Então eu incrementos, e atribuir o primeiro lugar na matriz o valor 1 vezes 2.
Então eu incrementa novamente e assim por diante até que nós atribuímos para a posição N-1 na matriz
o valor de N-1 vezes 2.
Então, criamos uma matriz com os 10 primeiros números pares.
Talvez nivela teria sido um pouco melhor nome para a variável de x,
mas que teria dado coisas.
O segundo loop então apenas imprime os valores que já foram armazenados dentro da matriz.
>> Vamos tentar executar o programa com os dois tipos de declarações de matriz
e dar uma olhada na saída do programa.
Tanto quanto se pode ver, o programa se comporta da mesma forma para os dois tipos de declarações.
Vamos também dar uma olhada no que acontece se mudarmos o primeiro ciclo de não parar em N
mas dizer 10.000.
Muito para além do fim da matriz.
Oops. Talvez você tenha visto isso antes.
Uma falha de segmentação significa que seu programa deixou de funcionar.
Você começar a ver estes quando você tocar as áreas da memória que você não deve tocar.
Aqui estamos tocando 10.000 lugares além do início de x,
que, evidentemente, é um lugar de memória que não deve tocar.
Assim, a maioria de nós provavelmente não teria acidentalmente colocar 10.000 em vez de N,
mas o que se fazer algo mais sutil, como dizem gravação menor ou igual a N
na condição de loop para em vez de menos de N.
Lembre-se que uma matriz só tem índices de 0 a N-1,
o que significa que o índice N é para além da extremidade da matriz.
O programa não pode falhar neste caso, mas ainda assim é um erro.
Na verdade, esse erro é tão comum que tem o seu próprio nome,
um fora por um erro.
>> Isso é tudo para o básico.
Então, quais são as principais diferenças entre os dois tipos de declarações de matriz?
Uma diferença é que o grande bloco de memória vai.
Na primeira declaração, que eu vou chamar o tipo de suporte de matriz,
embora isto seja de modo algum um nome convencional,
ele vai para a pilha.
Enquanto que no segundo, que eu vou chamar o tipo de ponteiro-array, ele vai na pilha.
Isto significa que quando a função retorna, a matriz suporte será automaticamente desalocado,
Considerando que, como você deve chamar Explicitamente livre na matriz de ponteiro
ou então você tem um vazamento de memória.
Além disso, a matriz de suporte não é, na verdade, uma variável.
Isto é importante. É apenas um símbolo.
Você pode pensar nisso como uma constante que o compilador escolhe para você.
Isto significa que não podemos fazer algo como x + + com o tipo de suporte,
que isto é perfeitamente válido com o tipo de ponteiro.
>> O tipo de ponteiro é uma variável.
Para o tipo de ponteiro, temos dois blocos separados de memória.
A variável x em si é armazenado na pilha e está a apenas um único ponteiro,
mas o grande bloco de memória é armazenada na pilha.
A variável x na pilha apenas armazena o endereço
do grande bloco de memória no heap.
Uma implicação desta é com o tamanho do operador.
Se você perguntar para o tamanho da matriz do suporte, que lhe dará o tamanho do grande bloco de memória,
algo como 40 bytes,
mas se você perguntar para o tamanho do tipo de ponteiro de matriz,
ele vai te dar o tamanho da variável x em si, que o aparelho é provável apenas 4 bytes.
Usando o tipo de ponteiro matriz, é impossível pedir diretamente para
o tamanho do bloco de memória grande.
Este não é geralmente muito mais de uma restrição, uma vez que muito raramente quer o tamanho
do bloco do grande de memória, e nós geralmente pode calculá-lo se precisarmos.
>> Finalmente, a matriz suporte acontece nos fornecer um atalho para inicializar uma matriz.
Vamos ver como podemos escrever os 10 primeiros números inteiros até mesmo usando o initilization atalho.
Com a matriz de ponteiro, não existe uma maneira de fazer um atalho como este.
Esta é apenas uma introdução para o que você pode fazer com matrizes.
Eles aparecem em quase todos os programas que você escreve.
Espero que agora você pode ver a melhor maneira de fazer o aluno exemplo IDs
a partir do início do vídeo.
>> Meu nome é Rob Bowden, e este é o CS50.