[Música tocando] DOUG LLOYD: Tudo bem. Trabalhando com único variáveis ​​é muito divertido. Mas o que se quer trabalhar com um grande número de variáveis, mas nós não queremos ter um monte de nomes diferentes voando em torno de nosso código? Neste caso, são matrizes vai ser realmente útil. Arrays são dados realmente fundamentais estrutura para qualquer linguagem de programação que você vai usar. E eles são muito, muito útil, particularmente, como veremos, no CS 50. Nós usamos matrizes para segurar Os valores de dados do mesmo tipo em localizações contíguas de memória. Ou seja, é uma forma que podemos agrupar um monte de números inteiros juntos em memória ou um monte de personagens ou flutua na memória realmente juntas e trabalho com eles sem ter que dar a cada um seu próprio nome, o que pode obter complicado depois de um pouco de tempo. Agora, uma maneira de analogize matrizes é pensar sobre o seu local post escritório por um segundo. Então, passo longe de programação e basta fechar os olhos e visualize em sua mente sua estação de correios local. Normalmente, na maioria pós escritórios, há um grande banco as caixas de correios na parede. Uma matriz é um bloco gigante de memória contíguo, da mesma maneira que um e-mail banco em sua estação de correios é um grande espaço no parede da estação de correios. Arrays foram divididos em pequenos, identicamente blocos de tamanho de espaço, cada um dos quais é chamado um elemento, em Da mesma forma que a parede do posto escritório foi dividida em pequeno, identicamente blocos de tamanho de espaço, que chamamos de uma caixa postal. Cada elemento da matriz pode armazenar uma certa quantidade de dados, assim como cada caixa postal é capaz para manter uma certa quantidade de correio. O que pode ser armazenado em cada elemento de a matriz é variáveis ​​do mesmo dados tipo, como int ou char, apenas como em sua caixa postal, você só pode caber coisas de um tipo semelhante, tais como cartas ou pacotes pequenos. Por último, podemos acessar cada elemento da a matriz diretamente pelo número de índice, assim como podemos acessar nossa estação de correios caixa por saber o seu número de caixa postal. Felizmente, essa analogia ajuda a obter a sua cabeça em torno da idéia de matrizes por analogizante para outra coisa que você provavelmente está já está familiarizado. Em C, os elementos de uma matriz são indexados a partir de 0, não a partir de 1. E isto é realmente importante. E, de fato, é por isso que, no CS 50, e por que os cientistas computador com freqüência contará a partir de 0, é por causa da variedade de C indexação, que sempre começa em 0. Portanto, se uma matriz consiste de n elementos, o primeiro elemento dessa matriz situa-se no índice 0, e o último elemento da matriz situa-se no índice n menos 1. Mais uma vez, se há elementos da nossa n array, o último índice é n menos 1. Então, se a nossa matriz tem 50 elementos, os primeiro elemento está localizado no índice 0, e o último elemento situa-se no índice de 49. Infelizmente, ou felizmente, dependendo da sua perspectiva, C é muito branda aqui. Ele não vai impedi-lo de sair dos limites da sua matriz. Você pode acessar a menos 3 elemento de sua matriz ou o elemento 59 de sua matriz, se a matriz tem apenas 50 elementos. Ela não vai parar seu programa de compilando, mas em tempo de execução, você pode encontrar um falha de segmentação temido se você começar a acessar a memória que está fora dos limites do que você perguntou ao seu programa para dar-lhe. Portanto, tenha cuidado. O que faz um array declaração parece? Como é que vamos codificar uma matriz à existência como nós codificar qualquer outra variável? Há três partes para uma matriz declaration-- um tipo, um nome, e um tamanho. Isto é muito semelhante a um declaração de variável, que é apenas um tipo e um nome, sendo o elemento de tamanho o caso especial de uma matriz, porque estamos recebendo um monte deles ao mesmo tempo. Assim, o tipo é o tipo de variável que você quero que cada elemento da matriz para ser. Não quero que um array de inteiros? Em seguida, o tipo de dados deve ser int. Você quer que ele seja um matriz de duplas ou flutuadores? Tipo de dados deve ser o dobro ou flutuar. O nome é o que você quero chamar a sua matriz. O que você quer para nomear este gigante banco de inteiros ou flutuadores ou caracteres ou duplos, ou o que você tem? O que você quiser chamá-lo? Bastante auto-explicativo. Por último, o tamanho, o que vai dentro de colchetes, é quantos elementos você faria como a matriz para conter. Quantos inteiros que você quer? Quantos carros alegóricos que você quer? Assim, por exemplo, int notas dos alunos 40. Este declara um array chamado Student graus, que consiste de 40 números inteiros. Bastante auto-explicativo, eu espero. Aqui está outro exemplo. Duplo preços de menu 8. Isso cria uma matriz chamada Menu preços, que consiste de espaço na memória por oito duplas. Se você pensar em cada elemento de uma matriz de tipo de dados tipo, Assim, por exemplo, um único elemento de uma matriz do tipo int, da mesma forma que poderia pensar de qualquer outro variável do tipo int, todas as operações que familiares discutidos anteriormente nas Operações vídeo vai fazer sentido. Então, aqui, podemos declarar uma matriz de Booleans chamados Truthtable, que consiste em sala para 10 Booleans. E então, assim como nós apenas poderia atribuir um valor a qualquer outra variável do tipo Booleano, poderíamos dizer algo como colchete Truthtable 2, que é como nós indicamos, qual elemento da tabela de verdade? O terceiro elemento do tabela verdade, pois lembre-se, estamos contando a partir de 0. Então é assim que indicam a terceiro elemento da tabela de verdade. Truthtable 2 é igual a false, assim como nós poderia declare-- ou poderíamos atribuir, em vez disso, qualquer Variável do tipo booleano para ser falsa. Nós também podemos usá-lo em condições. if (7 == truthtable verdadeiro), o que quer dizer, Se o oitavo elemento de Truthtable é verdade, talvez nós queremos imprimir uma mensagem para o utilizador, printf ("VERDADEIRO! N") ;. Isso nos leva a dizer Truthtable 10 é igual a verdade, certo? Bem, eu posso, mas é bastante perigoso, pois lembre-se, temos um array de 10 Booleans. Assim, o índice mais elevado que o compilador nos deu é 9. Este programa irá compilar, mas se alguma outra coisa na memória existe onde iríamos esperar Truthtable 10 para ir, nós poderia sofrer uma falha de segmentação. Nós pode fugir com ele, mas, em geral, muito perigoso. Então, o que eu estou fazendo aqui é legal C, mas não necessariamente a melhor jogada. Agora, quando você declarar e inicializar uma matriz ao mesmo tempo, há realmente uma bonita sintaxe especial que você pode usar para preencher a matriz com os seus valores iniciais. Ele pode ficar pesado para declarar uma matriz de tamanho 100, e, em seguida, tenho que dizer, o elemento 0 é igual a este; elemento 1 é igual a esta; elemento 2 é igual a isso. Qual é o ponto, certo? Se é uma pequena matriz, poderia fazer algo parecido com isto. Bool truthtable 3 é igual aberta chaveta e, em seguida vírgula separar a lista de elementos que você quer colocar na matriz. Em seguida, feche encaracolado vírgula cinta. Isto cria uma matriz de tamanho três chamado Truthtable, com elementos falso, verdadeiro, e verdadeiro. E, de fato, a instanciação sintaxe que tenho aqui é exactamente o mesmo que o que faz sintaxe elemento individual abaixo. Estas duas formas de codificação faria produzir a mesma matriz exata. Da mesma forma, nós poderíamos fazer uma iteração ao longo de todos os elementos de uma matriz usando um laço, o qual, em verdade, é um muito fortemente recomendado at-home exercício. Como você criar uma matriz 100 de números inteiros, onde cada elemento da matriz é o seu índice? Assim, por exemplo, temos uma gama de 100 números inteiros, e no primeiro elemento, queremos colocar 0. No segundo elemento, queremos colocar um. No terceiro elemento, queremos para colocar 2; e assim por diante e assim por diante. Isso é realmente um bom at-home exercício para fazer isso. Aqui, ele não se parece como muito mudou. Mas note que entre o colchetes, desta vez, Eu realmente omitido o número. Se você estiver usando este muito instanciação especial para criar uma sintaxe array, você realmente não fazer necessidade de indicar o tamanho da matriz de antemão. O compilador é inteligente o suficiente saber que você, na verdade, quer uma matriz de tamanho 3, porque você colocar três elementos à direita do sinal de igual. Se você tinha colocado quatro, teria lhe dado uma tabela de verdade de tamanho quatro; e assim por diante e assim por diante. As matrizes não está limitado a uma única dimensão, o que é muito legal. Você pode realmente ter tantos especificadores colaterais como você deseja. Assim, por exemplo, se você quer criar uma placa para o jogo Batalha Naval, que, se você já jogou, é um jogo que é jogado com cavilhas na 10 por 10 grade, você pode criar uma matriz como este. Pode-se dizer Bool colchete navio de guerra 10 quadrado fechado colchete suporte 10 fechou colchete. E então, você pode optar por interpretar isso em sua mente como um 10 por 10 grade de células. Agora, na verdade, na memória, ele realmente faz apenas continuam a ser um elemento 100, matriz dimensional única. E isso, na verdade, vale para se você têm três dimensões ou quatro ou cinco. Realmente só se multiplica todo o indices-- ou a totalidade do tamanho specifiers-- juntos, e você é só pegar um unidimensional matriz desse tamanho. Mas em termos de organização e visualização e percepção humana, ela pode ser muito mais fácil a trabalhar com uma grade se você está trabalhando em um jogo como Tic-tac-dedo do pé ou Battleship, ou algo assim. É uma grande abstração, em vez de ter para pensar em um Tic-tac-dedo do pé placa como uma linha de nove quadrados ou um tabuleiro de batalha como uma linha de 100 praças. A 10 por 10 grade ou três por três grade é provavelmente muito mais fácil de perceber. Agora, algo realmente importante sobre matrizes. Nós podemos tratar cada indivíduo elemento da matriz como uma variável. Vimos que mais cedo quando estávamos atribuindo o valor True a certos Booleans ou testando-os em condicionais. Mas não podemos tratar todo si matrizes como variáveis. Não podemos, por exemplo, atribuir uma matriz para outra matriz usando a atribuição operador. Não é legal C. Se queremos, por que example-- nós estaríamos fazendo nesse exemplo seria copiar uma variedade para outra. Se nós queremos fazer isso, nós, na verdade, precisa usar um loop para copiar cada elemento individual uma de cada vez. Eu sei que é um pouco demorado. Assim, por exemplo, se tivéssemos estes casal de linhas de código, isso funcionaria? Bem, não, não, certo? Porque nós estamos tentando para atribuir a comida bar. Isso não vai funcionar, porque é uma matriz, e nós acabamos de descrever que isso não é legal C. Em vez disso, se quisermos copie o conteúdo da comida em bar, que é o que nós estamos tentando fazer aqui, precisaríamos de uma sintaxe como esta. Temos um loop que vai de J é igual a 0 até 5, e nós incrementar J em cada iteração o loop e elementos atribuir assim. Isto iria resultar em barra também sendo um, dois, três, quatro, cinco, mas temos de fazê-lo neste exato forma lenta elemento por elemento, em vez de apenas copiando a matriz inteira. Em outra programação línguas, mais modernos, você pode, de fato, fazer exatamente que é igual a sintaxe simples. Mas C, infelizmente, estamos não tem permissão para fazer isso. Agora, há uma outra coisa que eu quero mencionar sobre matrizes que podem ser um pouco pouco complicado a primeira vez que você trabalhar com eles. Discutimos em um vídeo sobre o escopo de variáveis, que a maioria das variáveis ​​em C, quando você chamar -los em funções, são passados ​​por valor. Você se lembra o que significa para passar por algo de valor? Isso significa que nós estamos fazendo uma cópia do variável que está sendo passado. A função de receptor, a função que está recebendo a variável, não recebe a própria variável. Ela recebe seu próprio local, cópia do mesmo para trabalhar. Arrays, é claro, fazer não seguir esta regra. Em vez disso, o que nós chamamos este está passando por referência. O destinatário da chamada, na verdade, não recebe a matriz. Ele não recebe seu própria cópia local do mesmo. E se você pensar sobre ele, isso faz sentido. Se matrizes são realmente grande, leva muito tempo e esforço para fazer uma cópia de uma matriz de 100 ou 1.000 ou 10.000 elementos, que não vale a pena para um funcionar para receber uma cópia do mesmo, fazer algum trabalho com ele, e, em seguida, apenas ser feito com a cópia; que não precisa de ter -lo pendurado em torno de mais. Como os arrays são alguns volumosos e pesados, nós apenas passá-los por referência. Nós apenas confiar em que a função para, não quebrar nada. Então, ele realmente obter a matriz. Ela não recebe sua própria cópia local do mesmo. Então o que isso quer dizer, em seguida, quando o receptor manipula elementos do array? O que acontece? Por agora, vamos encobrir sobre por que exatamente esta acontece, por que matrizes são passados ​​por referência e tudo o resto é passado por valor. Mas eu prometo a você, nós iremos voltar e dar-lhe a resposta para isso em um vídeo mais tarde. Aqui está mais um exercício para você antes de finalizar as coisas em arrays. O monte de código aqui, isso é não particularmente bom estilo, apenas vou fazer essa ressalva. Há comentários aqui, o que é bastante má forma. Mas é só porque eu queria ser capaz de caber tudo na tela. No topo, você pode ver que eu tenho duas declarações de função para matriz set e definir int. Set matriz aparentemente recebe um array de quatro números inteiros como sua entrada. E conjunto int aparentemente leva um único inteiro como sua entrada. Mas ambos não têm uma saída. A saída, o retorno escreva, de cada um é nula. Na principal, temos uma par de linhas de código. Nós declaramos uma variável inteira A chamada e atribuir-lhe o valor 10. Nós declarar uma matriz de quatro números inteiros chamado B e atribuir os elementos 0, 1, 2, e 3, respectivamente. Então, temos uma chamada para definir int e uma chamada para definir matriz. As definições de conjunto de matriz e conjunto int estão lá em baixo, na parte inferior. E assim, mais uma vez, peço-lhe a pergunta. O que fica impresso aqui no final principal? Há uma col impressão. Eu sou imprimindo dois inteiros. Eu estou imprimindo o conteúdo de A e o conteúdo de suporte B quadrado 0. Pausar o vídeo aqui e tomar um minuto. Você pode descobrir o que esta função irá imprimir no final? Esperemos que, se você se lembra o distinção entre passagem por valor e passagem por referência, este problema não era muito complicado para você. E a resposta que você faria encontrei é este. Se você não está realmente certo de como a por que esse é o caso, tome um segundo, voltar, rever o que eu era apenas discutir sobre a passagem de matrizes por referência, contra a passagem outras variáveis ​​por valor, e esperançosamente, ele vai fazer um pouco mais de sentido. Eu sou Doug Lloyd, e este é CS50.