>> [REPRODUCCIÓN DE MÚSICA]
>> DOUG LLOYD: OK.
Hemos trabajado con números enteros, hemos trabajado con personajes,
hemos trabajado carrozas, dobles, cadenas y bools.
Hemos agotado casi todo de los [inaudible] tipos que
han estado a disposición de nosotros todo el tiempo.
Pero ahora queremos hacer algo más.
como hacemos eso?
¿Cómo creamos diferentes tipos de datos?
Podemos hacerlo utilizando estructuras.
Así estructuras nos permiten unificar variables de diferentes tipos
en una sola, nuevo tipo de variable, que podemos asignar su propio nombre de tipo.
Este es un muy fuerte cosa es ser capaz de hacer,
porque ahora podemos grupo elementos de diferentes tipos de datos
juntos que tener una conexión lógica.
Hemos sido capaces de hacer esto con arreglos de tipo, ¿no?
Podemos agrupar variables del mismo tipo de datos
juntos en una unidad grande de la memoria, una matriz.
>> Pero no hemos sido capaces de mezclar hasta diferentes tipos de datos juntos.
No podemos, por ejemplo, asociar un número entero, y un carácter, y un doble de todo
en el mismo y llamar a que una sola unidad.
Pero con estructuras, o a que se refiere con frecuencia como estructuras,
que realmente puede.
Así que una estructura es una especie así como una variable de super.
Es una variable que contiene otras variables dentro de ella.
Así que aquí está un ejemplo de una estructura muy simple.
Esto es lo que la sintaxis sería desea crear una estructura para un coche.
Ahora, vamos a ir a través de la sintaxis aquí.
Struct, esa es la palabra clave que indica
que estoy creando un nuevo tipo de datos aquí.
En particular, el nombre del tipo de datos es va a ser un coche estructura, como veremos.
Pero este es el tipo de punta off al compilador que esta
como un grupo de variables que se va para ser considerado parte del mismo tipo
en un minuto.
>> Coches, sólo el nombre de la estructura.
Una vez más, el tipo de datos que aquí se va ser auto estructura, no sólo coche.
Pero si usted tiene diferente-- si crea múltiples estructuras
en el mismo programa, es necesario distinguir entre struct y struct.
Así coche struct, yo también podría tener struct estudiante, por ejemplo,
en el mismo programa.
Dentro de las llaves son todos los campos llamados,
o los miembros de la estructura.
Así que ¿cuáles son algunas de las cosas que son inherentes en un coche?
Bueno, por lo general tiene un año, ha un nombre de modelo, y una placa de matrícula,
un odómetro que por lo general tiene cierto número de millas en él,
y tal vez un tamaño de motor.
Y como se puede ver, estoy mezclando enteros y caracteres y dobles.
Están todos van a ser parte de este nuevo tipo de datos.
>> Por último, la última cosa que necesita hacer, no se olvide de este pequeño punto y coma
al final.
Después de que terminamos de definir la estructura, tenemos que poner un punto y coma al final.
Es una sintáctica muy común error, porque con una función,
por ejemplo, sólo tendría llave de abrir, cerrar corchete.
Usted no pone un punto y coma al final de una definición de función.
Esto se parece a una función definición, pero no lo es,
y así el punto y coma allí es sólo un recordatorio de que usted
tenga que ponerlo allí, porque el compilador no lo hará de otra manera
saber qué hacer con él.
Es un error muy común hacer accidentalmente
cuando se está definiendo en primer lugar las estructuras.
>> OK.
Así que por lo general definimos nuestras estructuras en la parte superior de nuestros programas
porque están probablemente va para ser utilizado por múltiples funciones.
No queremos definir un struct interior de una función,
porque entonces podemos only-- la ámbito de aplicación de la estructura realmente
sólo existe dentro de esa función.
Probablemente nos gustaría definir una estructura para que podamos utilizarlo en múltiples funciones,
o tal vez en múltiples los archivos que están vinculados entre sí
para crear nuestro programa único.
A veces también lugar de definir la estructura
en la parte superior, donde usted pone su libra incluye y su libra define,
por ejemplo, es posible que los puso en archivos punto h separadas, que luego
libra incluye a ti mismo.
>> Así que tenemos estructuras, pero ahora tenemos que conseguir dentro de ellos.
¿Cómo conseguimos el interior de una estructura para el acceso
los sub-variables, las variables que existen dentro de la estructura?
Bueno, tenemos algo que se llama el operador punto, lo que nos permite
para acceder a los campos de la estructura.
Así, por ejemplo, digamos que he declarado mis datos de la estructura de tipo alguna parte
en la parte superior de mi programa, o tal vez en un archivo de puntos h que tengo libras incluido.
Pues si yo quiero crear un nuevo variable de ese tipo de datos, puedo decir,
struct coche, mi coche, punto y coma.
Al igual que yo pudiera decir int x, o el nombre de cadena de punto y coma.
>> El tipo de datos que aquí es struct coche, el nombre de la variable es mi coche,
y luego puedo utilizar el operador punto para acceder a los diversos campos de mi coche.
Así que puedo decir que mi coche dot año es igual a 2.011.
Eso es perfectamente bien.
Año, si usted recuerda, se definió como un campo entero en el interior de esta estructura de coche
tipo de datos.
Así que cualquier variable de los datos struct coche tipo, como mi coche, puedo decir que mi coche
año de puntos iguales y luego asignar que algún valor entero de 2011.
Mi plato punto del coche es igual CS50.
Mi punto tarjeta odómetro es igual a 50.505 punto y coma.
Todos estos son perfectamente bien y eso es
cómo accedemos a la campos de la estructura.
Estructuras, sin embargo, no es necesario que se creará en la pila.
Al igual que cualquier otra variable, que puede asignar dinámicamente ellos.
Si tenemos un programa que podría estar generando muchas estructuras,
no sabemos cuántos vamos a necesitar,
entonces tenemos que dinámicamente asignar esas estructuras
como nuestro programa se está ejecutando.
Y por lo que si vamos a tener acceso a la campos de una estructura en ese contexto,
recordemos que primero tenemos que eliminar la referencia el puntero a la estructura,
y luego una vez que eliminar la referencia al puntero, entonces puede acceder a los campos.
Si tan sólo tenemos una Puntero a la estructura,
no podemos decir que el campo de punto puntero Nombre y conseguimos lo que estamos buscando.
Ahí está el paso adicional de eliminación de referencias.
Así que digamos que en lugar de la previous--
al igual que el ejemplo anterior, en lugar de declarar que
en la pila, coche struct, mi coche, punto y coma, digo struct coche,
estrella, un puntero a una struct coche llamó a mi coche,
es igual tamaño malloc de struct coche.
Tamaño de vamos a averiguar cuántos bytes de su nuevo tipo de datos ocupa.
Usted no necesariamente sólo se necesita utilizar tamaño, ancho, int o char, o cualquier
de los tipos de datos incorporados.
El compilador es lo suficientemente inteligente para averiguar cuántos bytes
son requeridos por su nueva estructura.
Así que malloc mí una unidad de memoria lo suficientemente grande como para contener un coche struct,
y me da un puntero hacia atrás a ese bloque de memoria,
y que el puntero se asigna a mi coche.
>> Ahora, si quiero acceder los campos de mi coche,
La primera vez que eliminar la referencia de mi coche usando el operador eliminar la referencia, estrella
que hemos visto de los punteros vídeos, y luego después de eliminar la referencia,
entonces puedo utilizar el operador punto para acceder a los diversos campos de mi coche.
Estrella mi coche dot año es igual a 2.011.
Esto tendría el efecto queremos que en este caso,
porque hemos dinámicamente asignado mi coche.
>> Eso es un poco molesto, sin embargo, ¿no?
Hay un proceso de 2 pasos ahora.
Ahora tenemos que dereference-- tenemos un operador de la estrella,
y tenemos un operador punto.
Y como era de esperar, ya que C programadores aman caminos más cortos
de hacer las cosas, hay un camino más corto para hacer esto.
Hay otro operador llamado flecha, lo que hace que este proceso sea mucho más fácil.
La forma de flecha funciona es Primero se desreferencias
el puntero de la izquierda lado del operador,
y luego, después de haber desreferenciado el puntero a la izquierda,
se accede al campo de la derecha.
Y así previamente teníamos este tipo de la estrella de mi coche salpican toda esta materia,
como había mucho que hacer allí.
Pero lo que en cambio sí podemos hacer es esto-- mi coche flecha año es igual a 2.011.
>> Una vez más, ¿qué está pasando aquí?
En primer lugar, estoy dereferencing mi coche.
Que a su vez, es un puntero aquí.
Entonces, después de haber desreferenciado mi coche,
a continuación, puede acceder a los campos año, la placa, y el odómetro
del mismo modo que pude antes de tener primero estrella usada para eliminar la referencia de mi coche,
y el punto de acceso al campo.
Así que usted puede tener estructuras, que puede tener punteros a estructuras,
y usted tiene maneras de acceder los campos de esas estructuras,
si usted tiene punteros a ellos o las propias variables.
Dot o flecha, dependiendo de cómo se declaró la variable.
Soy Doug Lloyd, esto es CS50.