[Música tocando] Doug LLOYD: Todo ben. Traballando con único variables é moi divertido. Pero o que se quere traballar con un gran número de variables, pero nós non queremos ter unha chea de nomes diferentes voando arredor do noso código? Neste caso, son matrices vai ser realmente útil. Arrays son datos realmente fundamentais estrutura para calquera linguaxe de programación que vai empregar. E son moi, moi útil, particularmente, como veremos, no CS 50. Usamos matrices para soster Os valores de datos do mesmo tipo en localizacións contiguas de memoria. É dicir, é unha forma que podemos agrupar unha morea de números enteiros xuntos memoria ou unha morea de personaxes ou flota na memoria realmente xuntas e traballo con eles sen ter que dar a cada un nome propio, o que pode obter complicado despois de un pouco de tempo. Agora, un xeito de analogize matrices é pensar sobre o seu lugar post oficina por un segundo. Entón, paso lonxe de programación e pode pechar os ollos e vendo na súa mente súa estación de correos local. Normalmente, a maioría post oficinas, hai un gran banco as caixas de correos na parede. Unha matriz é un bloque xigante de memoria contiguo, do mesmo xeito que unha mensaxe base na súa estación de correos é un gran espazo no parede da estación de correos. Arrays foron divididos en pequenos, identicamente bloques de tamaño de espazo, cada un dos cales se chama un elemento, en Do mesmo xeito que a parede do posto oficina foi dividida en pequeno, identicamente bloques de tamaño de espazo, que chamamos unha caixa de correos. Cada elemento da matriz pode almacenar unha certa cantidade de datos, así como cada caixa de correos é capaz para manter unha certa cantidade de correo. O que pode ser almacenado en cada elemento de a matriz é variables do mesmo datos tipo, como int ou char, só como na súa caixa de correos, só se pode caber cousas dun tipo similar como cartas ou paquetes pequenos. Para rematar, podemos acceder cada elemento da a matriz directamente polo número de índice, así como podemos acceder nosa estación de correos caixa por saber o seu número de correo de voz. Afortunadamente, esta analoxía axuda a obter a súa cabeza en torno á idea de matrices por analogizante para outra cousa que probablemente está xa está familiarizado. C, os elementos dunha matriz son indexados desde 0, non a partir do 1. E isto é realmente importante. E, de feito, é por iso que, no CS 50, e por que os científicos ordenador con frecuencia contará a partir de 0, é por mor da variedade de C indexación, que sempre comeza en 0. Polo tanto, se unha matriz consiste n elementos, o primeiro elemento desa matriz sitúase no índice 0, e o último elemento da matriz sitúase no índice n menos 1. Unha vez máis, se hai elementos da nosa n array, o último índice é n menos 1. Entón, se a nosa matriz ten 50 elementos, os primeiro elemento está situado no índice 0, eo último elemento sitúase no índice de 49. Desafortunadamente, é sorte, dependendo da súa perspectiva, C é moi branda aquí. Non vai impedilo de saír dos límites da súa matriz. Pode acceder a menos 3 elemento da súa matriz ou o elemento 59 da súa matriz, a matriz ten só 50 elementos. Ela non vai deixar o seu programa de compilando, pero en tempo de execución, podes atopar un fallo de segmento temido se comezar a acceder a memoria que está fóra dos límites do que vostede preguntou ao seu programa para darlle. Polo tanto, teña coidado. O que fai un array declaración parece? Como é que imos codificar unha matriz á existencia como nós codificar calquera outra variable? Hai tres partes para unha matriz declaration-- un tipo, un nome, e un tamaño. Isto é moi semellante a un declaración de variable, que é só un tipo e un nome, sendo o elemento de tamaño o caso especial dunha matriz, porque estamos recibindo unha morea deles ó mesmo tempo. Así, o tipo é o tipo de variable que quero que cada elemento da matriz para ser. Non quero que un array de enteiros? A continuación, o tipo de datos debe ser int. Quere que sexa un matriz de dúos ou flotadores? Tipo de datos debe ser o dobre ou flotar. O nome é o que quero chamar a súa matriz. O que quere para nomear este xigante base de enteiros ou flotadores ou caracteres ou dobres, ou o que ten? Que queres chamalo? Bastante auto-explicativo. Para rematar, o tamaño, o que vai dentro corchetes, é cantos elementos faría como a matriz para conter. Cantos enteiros que quere? Cantos Carrozas que quere? Así, por exemplo, int notas dos alumnos 40. Este declara un array chamado Student graos, que consta de 40 números enteiros. Bastante auto-explicativo, eu espero. Aquí está outro exemplo. Dobre prezos de menú 8. Isto xera unha matriz chamada Menú prezos, que consiste de espazo na memoria por oito dobres. Se pensar en cada elemento dunha matriz de tipo de datos tipo, Así, por exemplo, un único elemento de unha matriz de tipo int, do mesmo xeito que podería pensar de calquera outro variable do tipo int, todas as operacións que familiares discutidos anteriormente nas Operacións vídeo vai ter sentido. Entón, aquí, podemos declarar unha matriz de Booleans chamados Truthtable, que consiste en sala para 10 Booleans. E entón, así como nós só podería atribuír un valor a calquera outra variable do tipo Booleano, poderiamos dicir algo como paréntese Truthtable 2, que é como nós indicamos, cal elemento da táboa de verdade? O terceiro elemento do táboa verdade, pois lembre, estamos contando a partir de 0. Entón é así que indican a terceiro elemento da táboa de verdade. Truthtable 2 é igual a false, así como nós podería declare-- ou poderiamos atribuír, en vez diso, calquera Variable do tipo booleano para ser falsa. Tamén podemos usalo correctamente. if (7 == truthtable certo), o que quere dicir, O oitavo elemento de Truthtable é certo, quizais queremos imprimir unha mensaxe para o usuario, printf ("TRUE! N");. Isto nos leva a dicir Truthtable 10 é igual a verdade, non? Ben, podo, pero é bastante perigoso, pois lembre, temos un array de 10 Booleans. Así, o índice máis elevado que o compilador nos deu é 9. Este programa pode compilar, pero se algunha outra cousa na memoria existe onde iríamos esperar Truthtable 10 para ir, nós podería sufrir un fallo de segmento. Nós pode fuxir con el, pero, en xeral, moi perigoso. Entón, o que eu estou facendo aquí é legal C, pero non necesariamente a mellor xogada. Agora, cando declarar e iniciar unha matriz á vez, hai realmente unha fermosa sintaxe especial que pode usar para cubrir a matriz cos seus valores iniciais. Pode estar abondo para declarar unha matriz de tamaño 100, e, a continuación, teño que dicir, o elemento 0 é igual a este; elemento 1 é igual a este; elemento 2 é igual a iso. Cal é o punto, non? Se é unha pequena matriz, podería facer algo coma isto. Bool truthtable 3 é igual aberta chaveta e logo coma separar a lista de elementos que quere poñer na matriz. A continuación, pecha rizado coma cinta. Isto crea unha matriz de tamaño tres chamado Truthtable, con elementos falso, é verdadeiro, e certo. E, de feito, a instanciação sintaxe que teño aquí é exactamente o mesmo que o que fai sintaxe elemento individual abaixo. Estas dúas formas de codificación faría producir a mesma matriz exacta. Do mesmo xeito, poderíamos facer unha iteración ao longo de todos os elementos dunha matriz usando un lazo, o cal, en realidade, é un moi encarecidamente at-home exercicio. Como crear unha matriz 100 de números enteiros, onde cada elemento da matriz é o seu índice? Así, por exemplo, temos unha gama de 100 números enteiros, e no primeiro elemento, queremos poñer 0. No segundo elemento, queremos poñer un. No terceiro elemento, queremos para poñer 2; e así por diante e así por diante. Isto é realmente un bo at-home exercicio para facelo. Aquí, non se parece como moi cambiou. Pero teña en conta que entre o corchetes, esta vez, Realmente omitido o número. Se está usando este moi instanciação especial para crear unha sintaxe array, o que realmente non facer necesidade de indicar o tamaño da matriz de antemán. O compilador é intelixente dabondo saber que, en realidade, Queres unha matriz de tamaño 3, porque poñer tres elementos á dereita do signo igual. Se colocara catro, tería lle deu unha táboa de verdade de tamaño catro; e así por diante e así por diante. As matrices non está limitado a unha única dimensión, o que é moi legal. Pode realmente ter tantos especificadores secundarios como quere. Así, por exemplo, se quere crear unha placa para o xogo Batalla Naval, que, se xa xogou, é un xogo que é xogado con cravetas na 10 por 10 reixa, pode crear unha matriz como este. Pódese dicir bool paréntese buque de guerra 10 cadrado pechado paréntese soporte 10 pechou paréntese. E entón, pode optar por interpretar isto na súa mente como un 10 por 10 reixa de células. Agora, en realidade, na memoria, realmente fai só seguen a ser un elemento 100, matriz dimensional única. E iso, en realidade, vale para se teñen tres dimensións ou catro ou cinco. Realmente só se multiplica todo o indices-- ou a totalidade do tamaño specifiers-- xuntos, e é só incorporarse un unidimensional matriz dese tamaño. Pero en termos de organización e visualización e percepción humana, pode ser moito máis doado traballando cunha reixa se está a traballar nun xogo como Tic-tac-dedo do pé ou Battleship, ou algo así. É unha gran abstracción, en vez de ter para pensar nun Tic-tac-dedo do pé tarxeta como unha liña de nove cadrados ou un taboleiro de batalla como unha liña de 100 prazas. A 10 por 10 reixa ou tres por tres reixa pode ser moito máis fácil de entender. Agora, algo realmente importante sobre matrices. Podemos tratar cada individuo elemento da matriz como unha variable. Vimos que antes cando estabamos atribuíndo o valor True a certos Booleans ou probando os en condicionais. Pero non podemos tratar todo si matrices como variables. Non podemos, por exemplo, asignarlle unha matriz a outra matriz usando a asignación operador. Non é legal C. Se queremos, por que example-- estariamos facendo nese exemplo sería copiar unha variedade a outra. Se queremos facelo, nós, en realidade, Debe usar un loop para copiar cada elemento individual unha de cada vez. Sei que é un pouco lento. Así, por exemplo, se tivésemos estes parella de liñas de código, isto funcionaría? Ben, non, non, non? Porque estamos tentando para asignar a comida bar. Isto non vai funcionar, porque é unha matriz, e nós acabamos de describir que iso non é legal C. Pola contra, se queremos por favor copie o contido da comida en bar, que é o que nós estamos intentando facer aquí, necesitariamos dunha sintaxe como esta. Temos un loop que de J é igual a 0 ata 5, e nós incrementar J en cada iteración o loop e elementos asignar así. Isto ía producir barra tamén sendo un, dous, tres, catro, cinco, pero hai que facelo neste exacto forma lenta elemento por elemento, no canto de só copiando a matriz enteira. Noutra programación linguas, máis modernos, pode, de feito, facer exactamente que é igual a sintaxe simple. Pero C, por desgraza, estamos Non ten permiso para facelo. Agora, hai outra cousa que quero mencionar sobre matrices que poden ser un pouco pouco complicado a primeira vez que traballar con eles. Discutir nun vídeo sobre o ámbito de variables, que a maioría das variables en C, cando chamar Los en funcións, pásase por valor. Vostede recorda o que significa para pasar por algo de valor? Isto significa que nós estamos facendo unha copia do variable que está a ser pasado. A función de receptor, a función que está a recibir a variable, non recibe a propia variable. Recibe o seu propio local, copia do mesmo para traballar. Arrays, por suposto, facer non seguir esta regra. Pola contra, o que chamamos este está pasando por referencia. O destinatario da chamada, en realidade, non recibe a matriz. Non recibe seu propia copia local do mesmo. E se pensar sobre el, iso ten sentido. Se matrices son realmente grande, leva moito tempo e esforzo para facer unha copia dunha matriz de 100 ou 1.000 ou 10.000 elementos, que non paga a pena para un funcionar para recibir unha copia do mesmo, facer algún traballo con el, e, a continuación, só pode facer coa copia; que non debe ter Lo colgado en torno de máis. Como os arrays son algúns voluminosos e pesados, nós só paso-los por referencia. Nós só confiar en que a función para non romper nada. Entón, realmente obter a matriz. Ela non recibe a súa propia copia local do mesmo. Entón, o que iso significa, a continuación, cando o receptor manipula elementos do array? Que pasa? De momento, imos encubrir sobre por que exactamente esta ocorre, por que matrices pásase por referencia e todo o demais é pasado por valor. Pero eu prometer a vostede, nós iremos volver e darlle a resposta para iso nun vídeo máis tarde. Aquí está máis un exercicio para ti antes de finalizar as cousas en arrays. O monte de código aquí, iso é non particularmente bo estilo, só vou facer esa excepción. Hai comentarios aquí, o que é moi mala forma. Pero é só porque eu quería ser capaz de caber todo na pantalla. Na parte superior, podes ver que eu teño dúas declaracións de funcións para matriz set e establecer int. Set matriz aparentemente recibe un array de catro números enteiros como a súa entrada. E conxunto int aparentemente leva un único enteiro como a súa entrada. Pero ambos non teñen unha saída. A saída, o retorno escriba, de cada un é nula. Na principal, temos unha par de liñas de código. Declaramos unha variable enteira A chamada e asignar-lle o valor 10. Nós declarar unha matriz de catro números enteiros chamado B e asignar os elementos 0, 1, 2, e 3, respectivamente. Entón, temos unha chamada para definir int e unha chamada para definir matriz. Os axustes de conxunto de matriz e conxunto int están alí en baixo, na parte inferior. E así, unha vez máis, pídolle a pregunta. O que queda impreso aquí a finais principal? Hai unha col impresión. Eu son imprimindo dous enteiros. Estou imprimindo o contido da e o contido de soporte B cadrado 0. Deter o vídeo aquí e tomar un minuto. Pode descubrir o que esta función imprimirá a finais? Esperemos que, se se lembra o distinción entre pasaxe por valor e paso por referencia, este problema non era moi complicado para ti. E a resposta que faría atopei é esta. Se vostede non está realmente seguro de como a por que ese é o caso, teña un segundo, volver, revisar o que eu era só discutir sobre o paso de matrices por referencia, contra o paso outras variables por valor, e esperanza, que vai facer un pouco máis de sentido. Eu son Doug Lloyd, e este é CS50.