1 00:00:00,000 --> 00:00:02,395 >> [Música tocando] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> Doug LLOYD: Aceptar. 4 00:00:06,506 --> 00:00:08,880 Traballamos con números enteiros, traballamos cos personaxes, 5 00:00:08,880 --> 00:00:11,930 traballamos Carrozas, dobres, cadeas e bools. 6 00:00:11,930 --> 00:00:14,870 Nós xa esgotou practicamente todos dos [inaudível] tipo que 7 00:00:14,870 --> 00:00:17,100 estiveron dispoñibles para todos xuntos. 8 00:00:17,100 --> 00:00:19,430 Pero agora queremos facer algo máis. 9 00:00:19,430 --> 00:00:20,210 Como facemos isto? 10 00:00:20,210 --> 00:00:22,560 Como podemos crear diferentes tipos de datos? 11 00:00:22,560 --> 00:00:26,130 Podemos facelo empregando estruturas. 12 00:00:26,130 --> 00:00:30,180 Entón estruturas permitirá a unificación variables de distintos tipos 13 00:00:30,180 --> 00:00:34,810 nun único, novo tipo de variable, que podemos asignar o seu propio nome de tipo. 14 00:00:34,810 --> 00:00:37,570 Este é realmente un forte cousa que ser capaz de facer, 15 00:00:37,570 --> 00:00:40,900 porque podemos agora grupo elementos de diferentes tipos de datos 16 00:00:40,900 --> 00:00:43,910 xuntos, que teñen unha conexión lóxica. 17 00:00:43,910 --> 00:00:46,440 Fomos capaces de facelo con matrices tipo de, non? 18 00:00:46,440 --> 00:00:49,540 Podemos variables do grupo do mesmo tipo de datos 19 00:00:49,540 --> 00:00:53,410 xuntos nunha unidade gran de memoria, unha matriz. 20 00:00:53,410 --> 00:00:56,660 >> Pero non fomos capaces de mesturar ata diferentes tipos de datos en conxunto. 21 00:00:56,660 --> 00:01:02,610 Non podemos, por exemplo, asociar un número enteiro, e un personaxe, e un dobre todo 22 00:01:02,610 --> 00:01:05,330 na mesma cousa e chamar que un todo. 23 00:01:05,330 --> 00:01:08,830 Pero coas estruturas, ou frecuentemente chamada estruturas, 24 00:01:08,830 --> 00:01:09,585 realmente pode. 25 00:01:09,585 --> 00:01:12,370 Así, unha estrutura é unha especie de como unha variable super. 26 00:01:12,370 --> 00:01:16,530 É unha variable que conteña outras variables dentro do mesmo. 27 00:01:16,530 --> 00:01:19,650 Entón aquí está un exemplo de unha estrutura moi simple. 28 00:01:19,650 --> 00:01:23,380 Isto é o que a sintaxe quedaría como para crear unha estrutura de un coche. 29 00:01:23,380 --> 00:01:25,250 Agora, imos pasar a sintaxe aquí. 30 00:01:25,250 --> 00:01:27,400 Struct, que é a palabra clave que indica 31 00:01:27,400 --> 00:01:30,270 que estou creando un novo tipo de datos aquí. 32 00:01:30,270 --> 00:01:33,860 En particular, o nome do tipo de datos é será coche struct, como veremos. 33 00:01:33,860 --> 00:01:36,640 Pero este é o tipo de punta off para o compilador que este 34 00:01:36,640 --> 00:01:42,440 como un grupo de variables que está pasando para ser considerado parte do mesmo tipo 35 00:01:42,440 --> 00:01:44,010 nun minuto. 36 00:01:44,010 --> 00:01:46,340 >> Coches, só o nome da estrutura. 37 00:01:46,340 --> 00:01:50,590 Unha vez máis, o tipo de datos aquí vai ser o coche struct, non só coche. 38 00:01:50,590 --> 00:01:53,060 Pero se ten diferente-- se crear varias estruturas 39 00:01:53,060 --> 00:01:56,950 no mesmo programa, ten que distinguir entre e struct. 40 00:01:56,950 --> 00:02:00,140 Coche para struct, eu tamén pode ter estudante struct, por exemplo, 41 00:02:00,140 --> 00:02:01,790 no mesmo programa. 42 00:02:01,790 --> 00:02:05,980 Dentro das claves son todos os campos chamados, 43 00:02:05,980 --> 00:02:07,954 ou os membros da estrutura. 44 00:02:07,954 --> 00:02:10,370 Entón, cales son algunhas das cousas que son inherentes nun coche? 45 00:02:10,370 --> 00:02:15,270 Ben, ten xeralmente un ano, ten un nome de modelo, e unha placa de licenza, 46 00:02:15,270 --> 00:02:18,000 un conta-quilómetros que ten xeralmente un certo número de millas sobre el, 47 00:02:18,000 --> 00:02:19,225 e quizais un tamaño do motor. 48 00:02:19,225 --> 00:02:23,570 E como se pode ver, eu estou mesturando-se enteiros e caracteres e dobres. 49 00:02:23,570 --> 00:02:26,420 Están todos indo a ser parte deste novo tipo de datos. 50 00:02:26,420 --> 00:02:29,750 >> Finalmente, a última cousa que eu teño que facer, non se esqueza este pequeno punto e coma 51 00:02:29,750 --> 00:02:30,290 Ao final. 52 00:02:30,290 --> 00:02:34,380 Despois de que rematar de definir a estrutura, hai que poñer un punto e coma ao final. 53 00:02:34,380 --> 00:02:37,325 É unha sintáctica moi común erro, porque cunha función, 54 00:02:37,325 --> 00:02:40,200 por exemplo, que tería só chaveta aberta, preto chaveta. 55 00:02:40,200 --> 00:02:42,950 Non especificou un punto e coma no final dunha definición de función. 56 00:02:42,950 --> 00:02:46,430 Isto parece unha función definición, pero non é, 57 00:02:46,430 --> 00:02:49,653 e así o punto e coma non é só un recordatorio de que 58 00:02:49,653 --> 00:02:52,440 Debe poñer-lo alí, porque o compilador doutro xeito non vai 59 00:02:52,440 --> 00:02:53,510 sabe o que facer con el. 60 00:02:53,510 --> 00:02:56,160 É un erro moi común para facer accidentalmente 61 00:02:56,160 --> 00:02:58,570 cando está definindo primeiro estruturas. 62 00:02:58,570 --> 00:02:59,500 >> Aceptar. 63 00:02:59,500 --> 00:03:02,824 Entón, nós xeralmente definir as nosas estruturas na parte superior dos nosos programas 64 00:03:02,824 --> 00:03:05,490 porque pode que vas para ser usado por varias funcións. 65 00:03:05,490 --> 00:03:08,850 Non queremos establecer unha struct dentro dunha función, 66 00:03:08,850 --> 00:03:12,110 porque entón podemos only-- o ámbito da estrutura realmente 67 00:03:12,110 --> 00:03:13,790 só existe dentro desa función. 68 00:03:13,790 --> 00:03:17,450 Nós probablemente quere establecer unha estrutura para que poidamos usalo en múltiples funcións, 69 00:03:17,450 --> 00:03:20,670 ou que en múltiples arquivos que son amarre 70 00:03:20,670 --> 00:03:22,920 para crear o noso programa único. 71 00:03:22,920 --> 00:03:24,920 Ás veces, tamén, no canto de definir a estrutura 72 00:03:24,920 --> 00:03:27,961 na parte superior, onde poñer o seu libra e inclúe a súa libra define, 73 00:03:27,961 --> 00:03:32,080 por exemplo, pode poñelos arquivos dot h separados, que, a continuación, 74 00:03:32,080 --> 00:03:35,020 libra incluír a si mesmo. 75 00:03:35,020 --> 00:03:37,620 >> Polo tanto, temos estruturas, pero agora necesitamos comezar dentro deles. 76 00:03:37,620 --> 00:03:39,800 Como é que imos ir por dentro unha estrutura para acceso 77 00:03:39,800 --> 00:03:43,530 estes sub-variables, estas variables que hai no interior da estrutura? 78 00:03:43,530 --> 00:03:46,810 Ben, nós temos unha cousa chamada o operador punto, o que nos permite 79 00:03:46,810 --> 00:03:50,990 para acceder aos campos da estrutura. 80 00:03:50,990 --> 00:03:55,490 Así, por exemplo, digamos que eu teño declarado meus datos estrutura do tipo nalgún lugar 81 00:03:55,490 --> 00:03:59,020 na parte superior do meu programa, ou que en un ficheiro dot h que teño libra incluído. 82 00:03:59,020 --> 00:04:03,360 Agora ben, se eu queira crear un novo variable deste tipo de datos, o que podo dicir, 83 00:04:03,360 --> 00:04:06,260 struct coche, meu coche, punto e coma. 84 00:04:06,260 --> 00:04:11,580 Así como eu podería dicir int x, ou nome da secuencia punto e coma. 85 00:04:11,580 --> 00:04:18,100 >> O tipo de datos aquí é coche struct, o nome da variable é o meu coche, 86 00:04:18,100 --> 00:04:23,770 e entón eu podo usar o operador punto para acceder aos varios campos de meu coche. 87 00:04:23,770 --> 00:04:27,494 Entón eu podo dicir o meu coche ano punto é igual a 2,011. 88 00:04:27,494 --> 00:04:28,410 Isto é perfectamente ben. 89 00:04:28,410 --> 00:04:34,210 Ano, se se lembra, foi definida como un campo enteiro dentro deste coche struct 90 00:04:34,210 --> 00:04:35,200 tipo de datos. 91 00:04:35,200 --> 00:04:39,966 Así, calquera variable dos datos coche struct tipo, como o meu coche, podo dicir que o meu coche 92 00:04:39,966 --> 00:04:44,030 ano punto é igual a e despois asignar -lle algún valor enteiro de 2011. 93 00:04:44,030 --> 00:04:47,290 Meu punto é igual a tarxeta do coche CS50. 94 00:04:47,290 --> 00:04:51,180 Meu hodômetro tarxeta de punto é igual a 50505 punto e coma. 95 00:04:51,180 --> 00:04:53,270 Todos estes son perfectamente ben e iso é 96 00:04:53,270 --> 00:04:57,802 como podemos acceder ao campos da estrutura. 97 00:04:57,802 --> 00:05:00,260 Estruturas, con todo, non é necesario a crear na pila. 98 00:05:00,260 --> 00:05:02,950 Así como calquera outra variable, pode reservar los dinamicamente. 99 00:05:02,950 --> 00:05:06,309 Se temos un programa que pode estar xerando moitas estruturas, 100 00:05:06,309 --> 00:05:08,100 non sabemos cantas imos ter, 101 00:05:08,100 --> 00:05:10,800 entón necesitamos dinamicamente reservar esas estruturas 102 00:05:10,800 --> 00:05:12,960 como o noso programa está a ser executado. 103 00:05:12,960 --> 00:05:16,600 E por iso, se nós estamos indo para acceder ao campos dunha estrutura nese contexto, 104 00:05:16,600 --> 00:05:20,660 Lembre que primeiro necesitamos dereference o anotador para a estrutura, 105 00:05:20,660 --> 00:05:24,810 e, a continuación, xa que a eliminación de referencia punteiro, entón podemos acceder aos campos. 106 00:05:24,810 --> 00:05:26,830 Se temos só un Punteiro para a estrutura, 107 00:05:26,830 --> 00:05:32,120 non podemos só dicir campo punteiro dot nome e obter o que estamos buscando. 108 00:05:32,120 --> 00:05:34,259 Hai a etapa extra de dereferencing. 109 00:05:34,259 --> 00:05:36,050 Entón, imos dicir que no canto do previous-- 110 00:05:36,050 --> 00:05:38,770 como no exemplo anterior, no canto de declaralo lo 111 00:05:38,770 --> 00:05:43,680 na pila, coche struct, meu coche, punto e coma, digo coche struct, 112 00:05:43,680 --> 00:05:48,020 estrela, un punteiro para unha coche struct chamado meu coche, 113 00:05:48,020 --> 00:05:51,250 equivale ao tamaño de malloc de coche struct. 114 00:05:51,250 --> 00:05:54,950 Tamaño imos descubrir cantas bytes seu novo tipo de datos ocupa. 115 00:05:54,950 --> 00:05:58,570 Non necesariamente só precisa utilizar tamaño, ancho, int ou char, ou calquera 116 00:05:58,570 --> 00:05:59,715 dos tipos de datos embutidos. 117 00:05:59,715 --> 00:06:02,090 O compilador é intelixente dabondo para descubrir cantos bytes 118 00:06:02,090 --> 00:06:04,170 están obrigados á súa nova estrutura. 119 00:06:04,170 --> 00:06:09,610 Así que me malloc unidade de memoria grande abondo para soster un coche struct, 120 00:06:09,610 --> 00:06:12,410 e eu recibín un punteiro de volta para ese bloque de memoria, 121 00:06:12,410 --> 00:06:16,090 e ese punteiro se lle atribúe ao meu coche. 122 00:06:16,090 --> 00:06:18,050 >> Agora, se eu queira acceder os campos do meu coche, 123 00:06:18,050 --> 00:06:22,615 I primeiro dereference meu coche usando o operador de eliminación de referencia, estrela 124 00:06:22,615 --> 00:06:26,620 que vimos desde os punteiros vídeos, e, a continuación, despois de que eu dereference, 125 00:06:26,620 --> 00:06:32,200 entón podo usar o operador punto para acceder aos varios campos de meu coche. 126 00:06:32,200 --> 00:06:35,490 Protagonizar meu coche dot ano é igual a 2011. 127 00:06:35,490 --> 00:06:38,480 Isto tería o efecto queremos neste caso 128 00:06:38,480 --> 00:06:41,960 porque temos dinamicamente alocados meu coche. 129 00:06:41,960 --> 00:06:43,610 >> Iso é medio chat, non? 130 00:06:43,610 --> 00:06:44,818 Hai un proceso de 2 pasos agora. 131 00:06:44,818 --> 00:06:47,460 Agora temos que dereference-- temos un operador de estrela, 132 00:06:47,460 --> 00:06:48,910 e temos un operador punto. 133 00:06:48,910 --> 00:06:51,660 E como podería esperar, porque Programadores C amo camiños máis curtos 134 00:06:51,660 --> 00:06:53,740 para facer as cousas, hai unha camiño máis curto para facelo. 135 00:06:53,740 --> 00:06:57,790 Hai outro operador chama frecha, o que fai que este proceso moito máis fácil. 136 00:06:57,790 --> 00:07:00,750 A forma como funciona é frecha el primeiro dereferences 137 00:07:00,750 --> 00:07:03,560 o punteiro á esquerda lado do operador, 138 00:07:03,560 --> 00:07:06,620 e, a continuación, despois de desreferenciado o punteiro á esquerda, 139 00:07:06,620 --> 00:07:09,620 el accede ao campo da dereita. 140 00:07:09,620 --> 00:07:14,170 E así xa tivemos este tipo Star meu coche dot todo este material, 141 00:07:14,170 --> 00:07:15,880 como non había moita cousa a suceder alí. 142 00:07:15,880 --> 00:07:22,040 Pero o que podemos facer é, en vez isto-- meu ano frecha coche é igual a 2011. 143 00:07:22,040 --> 00:07:23,580 >> De novo, o que está pasando aquí? 144 00:07:23,580 --> 00:07:25,720 En primeiro lugar, eu estou dereferencing meu coche. 145 00:07:25,720 --> 00:07:27,810 Que á súa vez, é un punteiro aquí. 146 00:07:27,810 --> 00:07:31,270 A continuación, despois de desreferenciado meu coche, eu 147 00:07:31,270 --> 00:07:35,130 Pode, entón, acceder aos campos ano, prato, e conta-quilómetros 148 00:07:35,130 --> 00:07:40,020 así como eu podería antes de primeiro estrela usado para eliminar referencia o meu coche, 149 00:07:40,020 --> 00:07:42,020 e punto para acceder ao campo. 150 00:07:42,020 --> 00:07:45,290 Entón vostede pode ter estruturas, vostede Pode que punteiros para estruturas, 151 00:07:45,290 --> 00:07:48,360 e ten formas de acceso os dominios destas estruturas, 152 00:07:48,360 --> 00:07:52,600 se ten punteiros para Los ou as propias variables. 153 00:07:52,600 --> 00:07:57,640 Dot ou frecha en función como a variable foi declarada. 154 00:07:57,640 --> 00:08:00,510 Eu son Doug Lloyd, este é CS50. 155 00:08:00,510 --> 00:08:01,975