1 00:00:00,000 --> 00:00:02,395 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK. 4 00:00:06,506 --> 00:00:08,880 Hemos trabajado con números enteros, hemos trabajado con personajes, 5 00:00:08,880 --> 00:00:11,930 hemos trabajado carrozas, dobles, cadenas y bools. 6 00:00:11,930 --> 00:00:14,870 Hemos agotado casi todo de los [inaudible] tipos que 7 00:00:14,870 --> 00:00:17,100 han estado a disposición de nosotros todo el tiempo. 8 00:00:17,100 --> 00:00:19,430 Pero ahora queremos hacer algo más. 9 00:00:19,430 --> 00:00:20,210 como hacemos eso? 10 00:00:20,210 --> 00:00:22,560 ¿Cómo creamos diferentes tipos de datos? 11 00:00:22,560 --> 00:00:26,130 Podemos hacerlo utilizando estructuras. 12 00:00:26,130 --> 00:00:30,180 Así estructuras nos permiten unificar variables de diferentes tipos 13 00:00:30,180 --> 00:00:34,810 en una sola, nuevo tipo de variable, que podemos asignar su propio nombre de tipo. 14 00:00:34,810 --> 00:00:37,570 Este es un muy fuerte cosa es ser capaz de hacer, 15 00:00:37,570 --> 00:00:40,900 porque ahora podemos grupo elementos de diferentes tipos de datos 16 00:00:40,900 --> 00:00:43,910 juntos que tener una conexión lógica. 17 00:00:43,910 --> 00:00:46,440 Hemos sido capaces de hacer esto con arreglos de tipo, ¿no? 18 00:00:46,440 --> 00:00:49,540 Podemos agrupar variables del mismo tipo de datos 19 00:00:49,540 --> 00:00:53,410 juntos en una unidad grande de la memoria, una matriz. 20 00:00:53,410 --> 00:00:56,660 >> Pero no hemos sido capaces de mezclar hasta diferentes tipos de datos juntos. 21 00:00:56,660 --> 00:01:02,610 No podemos, por ejemplo, asociar un número entero, y un carácter, y un doble de todo 22 00:01:02,610 --> 00:01:05,330 en el mismo y llamar a que una sola unidad. 23 00:01:05,330 --> 00:01:08,830 Pero con estructuras, o a que se refiere con frecuencia como estructuras, 24 00:01:08,830 --> 00:01:09,585 que realmente puede. 25 00:01:09,585 --> 00:01:12,370 Así que una estructura es una especie así como una variable de super. 26 00:01:12,370 --> 00:01:16,530 Es una variable que contiene otras variables dentro de ella. 27 00:01:16,530 --> 00:01:19,650 Así que aquí está un ejemplo de una estructura muy simple. 28 00:01:19,650 --> 00:01:23,380 Esto es lo que la sintaxis sería desea crear una estructura para un coche. 29 00:01:23,380 --> 00:01:25,250 Ahora, vamos a ir a través de la sintaxis aquí. 30 00:01:25,250 --> 00:01:27,400 Struct, esa es la palabra clave que indica 31 00:01:27,400 --> 00:01:30,270 que estoy creando un nuevo tipo de datos aquí. 32 00:01:30,270 --> 00:01:33,860 En particular, el nombre del tipo de datos es va a ser un coche estructura, como veremos. 33 00:01:33,860 --> 00:01:36,640 Pero este es el tipo de punta off al compilador que esta 34 00:01:36,640 --> 00:01:42,440 como un grupo de variables que se va para ser considerado parte del mismo tipo 35 00:01:42,440 --> 00:01:44,010 en un minuto. 36 00:01:44,010 --> 00:01:46,340 >> Coches, sólo el nombre de la estructura. 37 00:01:46,340 --> 00:01:50,590 Una vez más, el tipo de datos que aquí se va ser auto estructura, no sólo coche. 38 00:01:50,590 --> 00:01:53,060 Pero si usted tiene diferente-- si crea múltiples estructuras 39 00:01:53,060 --> 00:01:56,950 en el mismo programa, es necesario distinguir entre struct y struct. 40 00:01:56,950 --> 00:02:00,140 Así coche struct, yo también podría tener struct estudiante, por ejemplo, 41 00:02:00,140 --> 00:02:01,790 en el mismo programa. 42 00:02:01,790 --> 00:02:05,980 Dentro de las llaves son todos los campos llamados, 43 00:02:05,980 --> 00:02:07,954 o los miembros de la estructura. 44 00:02:07,954 --> 00:02:10,370 Así que ¿cuáles son algunas de las cosas que son inherentes en un coche? 45 00:02:10,370 --> 00:02:15,270 Bueno, por lo general tiene un año, ha un nombre de modelo, y una placa de matrícula, 46 00:02:15,270 --> 00:02:18,000 un odómetro que por lo general tiene cierto número de millas en él, 47 00:02:18,000 --> 00:02:19,225 y tal vez un tamaño de motor. 48 00:02:19,225 --> 00:02:23,570 Y como se puede ver, estoy mezclando enteros y caracteres y dobles. 49 00:02:23,570 --> 00:02:26,420 Están todos van a ser parte de este nuevo tipo de datos. 50 00:02:26,420 --> 00:02:29,750 >> Por último, la última cosa que necesita hacer, no se olvide de este pequeño punto y coma 51 00:02:29,750 --> 00:02:30,290 al final. 52 00:02:30,290 --> 00:02:34,380 Después de que terminamos de definir la estructura, tenemos que poner un punto y coma al final. 53 00:02:34,380 --> 00:02:37,325 Es una sintáctica muy común error, porque con una función, 54 00:02:37,325 --> 00:02:40,200 por ejemplo, sólo tendría llave de abrir, cerrar corchete. 55 00:02:40,200 --> 00:02:42,950 Usted no pone un punto y coma al final de una definición de función. 56 00:02:42,950 --> 00:02:46,430 Esto se parece a una función definición, pero no lo es, 57 00:02:46,430 --> 00:02:49,653 y así el punto y coma allí es sólo un recordatorio de que usted 58 00:02:49,653 --> 00:02:52,440 tenga que ponerlo allí, porque el compilador no lo hará de otra manera 59 00:02:52,440 --> 00:02:53,510 saber qué hacer con él. 60 00:02:53,510 --> 00:02:56,160 Es un error muy común hacer accidentalmente 61 00:02:56,160 --> 00:02:58,570 cuando se está definiendo en primer lugar las estructuras. 62 00:02:58,570 --> 00:02:59,500 >> OK. 63 00:02:59,500 --> 00:03:02,824 Así que por lo general definimos nuestras estructuras en la parte superior de nuestros programas 64 00:03:02,824 --> 00:03:05,490 porque están probablemente va para ser utilizado por múltiples funciones. 65 00:03:05,490 --> 00:03:08,850 No queremos definir un struct interior de una función, 66 00:03:08,850 --> 00:03:12,110 porque entonces podemos only-- la ámbito de aplicación de la estructura realmente 67 00:03:12,110 --> 00:03:13,790 sólo existe dentro de esa función. 68 00:03:13,790 --> 00:03:17,450 Probablemente nos gustaría definir una estructura para que podamos utilizarlo en múltiples funciones, 69 00:03:17,450 --> 00:03:20,670 o tal vez en múltiples los archivos que están vinculados entre sí 70 00:03:20,670 --> 00:03:22,920 para crear nuestro programa único. 71 00:03:22,920 --> 00:03:24,920 A veces también lugar de definir la estructura 72 00:03:24,920 --> 00:03:27,961 en la parte superior, donde usted pone su libra incluye y su libra define, 73 00:03:27,961 --> 00:03:32,080 por ejemplo, es posible que los puso en archivos punto h separadas, que luego 74 00:03:32,080 --> 00:03:35,020 libra incluye a ti mismo. 75 00:03:35,020 --> 00:03:37,620 >> Así que tenemos estructuras, pero ahora tenemos que conseguir dentro de ellos. 76 00:03:37,620 --> 00:03:39,800 ¿Cómo conseguimos el interior de una estructura para el acceso 77 00:03:39,800 --> 00:03:43,530 los sub-variables, las variables que existen dentro de la estructura? 78 00:03:43,530 --> 00:03:46,810 Bueno, tenemos algo que se llama el operador punto, lo que nos permite 79 00:03:46,810 --> 00:03:50,990 para acceder a los campos de la estructura. 80 00:03:50,990 --> 00:03:55,490 Así, por ejemplo, digamos que he declarado mis datos de la estructura de tipo alguna parte 81 00:03:55,490 --> 00:03:59,020 en la parte superior de mi programa, o tal vez en un archivo de puntos h que tengo libras incluido. 82 00:03:59,020 --> 00:04:03,360 Pues si yo quiero crear un nuevo variable de ese tipo de datos, puedo decir, 83 00:04:03,360 --> 00:04:06,260 struct coche, mi coche, punto y coma. 84 00:04:06,260 --> 00:04:11,580 Al igual que yo pudiera decir int x, o el nombre de cadena de punto y coma. 85 00:04:11,580 --> 00:04:18,100 >> El tipo de datos que aquí es struct coche, el nombre de la variable es mi coche, 86 00:04:18,100 --> 00:04:23,770 y luego puedo utilizar el operador punto para acceder a los diversos campos de mi coche. 87 00:04:23,770 --> 00:04:27,494 Así que puedo decir que mi coche dot año es igual a 2.011. 88 00:04:27,494 --> 00:04:28,410 Eso es perfectamente bien. 89 00:04:28,410 --> 00:04:34,210 Año, si usted recuerda, se definió como un campo entero en el interior de esta estructura de coche 90 00:04:34,210 --> 00:04:35,200 tipo de datos. 91 00:04:35,200 --> 00:04:39,966 Así que cualquier variable de los datos struct coche tipo, como mi coche, puedo decir que mi coche 92 00:04:39,966 --> 00:04:44,030 año de puntos iguales y luego asignar que algún valor entero de 2011. 93 00:04:44,030 --> 00:04:47,290 Mi plato punto del coche es igual CS50. 94 00:04:47,290 --> 00:04:51,180 Mi punto tarjeta odómetro es igual a 50.505 punto y coma. 95 00:04:51,180 --> 00:04:53,270 Todos estos son perfectamente bien y eso es 96 00:04:53,270 --> 00:04:57,802 cómo accedemos a la campos de la estructura. 97 00:04:57,802 --> 00:05:00,260 Estructuras, sin embargo, no es necesario que se creará en la pila. 98 00:05:00,260 --> 00:05:02,950 Al igual que cualquier otra variable, que puede asignar dinámicamente ellos. 99 00:05:02,950 --> 00:05:06,309 Si tenemos un programa que podría estar generando muchas estructuras, 100 00:05:06,309 --> 00:05:08,100 no sabemos cuántos vamos a necesitar, 101 00:05:08,100 --> 00:05:10,800 entonces tenemos que dinámicamente asignar esas estructuras 102 00:05:10,800 --> 00:05:12,960 como nuestro programa se está ejecutando. 103 00:05:12,960 --> 00:05:16,600 Y por lo que si vamos a tener acceso a la campos de una estructura en ese contexto, 104 00:05:16,600 --> 00:05:20,660 recordemos que primero tenemos que eliminar la referencia el puntero a la estructura, 105 00:05:20,660 --> 00:05:24,810 y luego una vez que eliminar la referencia al puntero, entonces puede acceder a los campos. 106 00:05:24,810 --> 00:05:26,830 Si tan sólo tenemos una Puntero a la estructura, 107 00:05:26,830 --> 00:05:32,120 no podemos decir que el campo de punto puntero Nombre y conseguimos lo que estamos buscando. 108 00:05:32,120 --> 00:05:34,259 Ahí está el paso adicional de eliminación de referencias. 109 00:05:34,259 --> 00:05:36,050 Así que digamos que en lugar de la previous-- 110 00:05:36,050 --> 00:05:38,770 al igual que el ejemplo anterior, en lugar de declarar que 111 00:05:38,770 --> 00:05:43,680 en la pila, coche struct, mi coche, punto y coma, digo struct coche, 112 00:05:43,680 --> 00:05:48,020 estrella, un puntero a una struct coche llamó a mi coche, 113 00:05:48,020 --> 00:05:51,250 es igual tamaño malloc de struct coche. 114 00:05:51,250 --> 00:05:54,950 Tamaño de vamos a averiguar cuántos bytes de su nuevo tipo de datos ocupa. 115 00:05:54,950 --> 00:05:58,570 Usted no necesariamente sólo se necesita utilizar tamaño, ancho, int o char, o cualquier 116 00:05:58,570 --> 00:05:59,715 de los tipos de datos incorporados. 117 00:05:59,715 --> 00:06:02,090 El compilador es lo suficientemente inteligente para averiguar cuántos bytes 118 00:06:02,090 --> 00:06:04,170 son requeridos por su nueva estructura. 119 00:06:04,170 --> 00:06:09,610 Así que malloc mí una unidad de memoria lo suficientemente grande como para contener un coche struct, 120 00:06:09,610 --> 00:06:12,410 y me da un puntero hacia atrás a ese bloque de memoria, 121 00:06:12,410 --> 00:06:16,090 y que el puntero se asigna a mi coche. 122 00:06:16,090 --> 00:06:18,050 >> Ahora, si quiero acceder los campos de mi coche, 123 00:06:18,050 --> 00:06:22,615 La primera vez que eliminar la referencia de mi coche usando el operador eliminar la referencia, estrella 124 00:06:22,615 --> 00:06:26,620 que hemos visto de los punteros vídeos, y luego después de eliminar la referencia, 125 00:06:26,620 --> 00:06:32,200 entonces puedo utilizar el operador punto para acceder a los diversos campos de mi coche. 126 00:06:32,200 --> 00:06:35,490 Estrella mi coche dot año es igual a 2.011. 127 00:06:35,490 --> 00:06:38,480 Esto tendría el efecto queremos que en este caso, 128 00:06:38,480 --> 00:06:41,960 porque hemos dinámicamente asignado mi coche. 129 00:06:41,960 --> 00:06:43,610 >> Eso es un poco molesto, sin embargo, ¿no? 130 00:06:43,610 --> 00:06:44,818 Hay un proceso de 2 pasos ahora. 131 00:06:44,818 --> 00:06:47,460 Ahora tenemos que dereference-- tenemos un operador de la estrella, 132 00:06:47,460 --> 00:06:48,910 y tenemos un operador punto. 133 00:06:48,910 --> 00:06:51,660 Y como era de esperar, ya que C programadores aman caminos más cortos 134 00:06:51,660 --> 00:06:53,740 de hacer las cosas, hay un camino más corto para hacer esto. 135 00:06:53,740 --> 00:06:57,790 Hay otro operador llamado flecha, lo que hace que este proceso sea mucho más fácil. 136 00:06:57,790 --> 00:07:00,750 La forma de flecha funciona es Primero se desreferencias 137 00:07:00,750 --> 00:07:03,560 el puntero de la izquierda lado del operador, 138 00:07:03,560 --> 00:07:06,620 y luego, después de haber desreferenciado el puntero a la izquierda, 139 00:07:06,620 --> 00:07:09,620 se accede al campo de la derecha. 140 00:07:09,620 --> 00:07:14,170 Y así previamente teníamos este tipo de la estrella de mi coche salpican toda esta materia, 141 00:07:14,170 --> 00:07:15,880 como había mucho que hacer allí. 142 00:07:15,880 --> 00:07:22,040 Pero lo que en cambio sí podemos hacer es esto-- mi coche flecha año es igual a 2.011. 143 00:07:22,040 --> 00:07:23,580 >> Una vez más, ¿qué está pasando aquí? 144 00:07:23,580 --> 00:07:25,720 En primer lugar, estoy dereferencing mi coche. 145 00:07:25,720 --> 00:07:27,810 Que a su vez, es un puntero aquí. 146 00:07:27,810 --> 00:07:31,270 Entonces, después de haber desreferenciado mi coche, 147 00:07:31,270 --> 00:07:35,130 a continuación, puede acceder a los campos año, la placa, y el odómetro 148 00:07:35,130 --> 00:07:40,020 del mismo modo que pude antes de tener primero estrella usada para eliminar la referencia de mi coche, 149 00:07:40,020 --> 00:07:42,020 y el punto de acceso al campo. 150 00:07:42,020 --> 00:07:45,290 Así que usted puede tener estructuras, que puede tener punteros a estructuras, 151 00:07:45,290 --> 00:07:48,360 y usted tiene maneras de acceder los campos de esas estructuras, 152 00:07:48,360 --> 00:07:52,600 si usted tiene punteros a ellos o las propias variables. 153 00:07:52,600 --> 00:07:57,640 Dot o flecha, dependiendo de cómo se declaró la variable. 154 00:07:57,640 --> 00:08:00,510 Soy Doug Lloyd, esto es CS50. 155 00:08:00,510 --> 00:08:01,975