Hola y bienvenido de nuevo. Lo último de lo que quiero hablar
sobre las estructuras es cómo se relacionan con las funciones, cómo
se pueden pasar estructuras como un argumento a un parámetro y una función y cómo
esto también es más eficiente.
Entonces, estructuras como argumentos para funciones.
Después de declarar una
estructura llamada Familia. En este ejemplo vamos a crear
una familia nombrada, ¿cómo pasamos esta estructura como argumento a una función?
Entonces tenemos esta estructura llamada Familia.
Tenemos un montón de matrices de caracteres
aquí, nombre, padre y madre, y luego tenemos una edad int.
Esa es nuestra definición de estructura.
Sabemos que es una estructura porque la palabra clave struct está ahí seguida del nombre de
la etiqueta, tenemos nuestras llaves y así sucesivamente.
Ahora, ¿cómo pasamos esa estructura a una
función llamada hermanos?
Bueno, lo harías tal como declaras la estructura, dirías
el tipo como el nombre del parámetro.
Es realmente sencillo. Entonces, en este caso, tenemos hermanos booleanos.
Los hermanos devuelven un booleano.
Y está tomando dos parámetros, dos parámetros de estructura.
Tienes que identificar el tipo de estructura que es la familia de estructuras de tipo.
Ahora, en una c más avanzada, podría
hacer un typedf en esta estructura y nombrarla de otra manera y podría acortar
el nombre aquí, pero no hemos hablado de typeds.
Probablemente sería mejor.
Pero así es como realmente necesitarías hacerlo. Tendría que definir el tipo completo, que es
la estructura de la familia y luego el nombre de la variable, como cualquier otro parámetro.
Así que aquí estamos pasando dos parámetros, el miembro uno y el miembro dos.
Ambos son de la familia de tipo struct.
Luego, dentro de nuestra función, si queremos acceder a los miembros, accedemos a
los miembros como de costumbre.
Miembro uno y miembro dos, no son punteros, por lo que no usamos el guión que es mayor
que, solo hacemos eso en los punteros porque necesitamos desreferenciarlos para ver a qué apuntan.
Debido a que no son punteros, podemos simplemente hacer puntos. Así que el miembro un punto madre, el miembro dos punto madre.
El miembro madre de un punto y la madre
de dos puntos son matrices de caracteres, y las matrices de caracteres son esencialmente punteros.
Entonces podemos pasarlos al str compare. Str compare devolverá iguales si son iguales, así que lo
que estamos haciendo aquí es comprobar que el miembro uno, la
madre y el miembro dos, la madre son iguales. Y si lo son, volveremos verdaderos.
Porque si ambos tienen el mismo nombre
y ese realmente sería el apellido, entonces son hermanos.
Muy claro.
Es fácil pasar argumentos a funciones
siempre que la declaración de la función tenga ese tipo de estructura allí.
Entonces, esta función, nuevamente, dos parámetros, cada uno de los cuales es una estructura de
familia de tipos.
¿Qué pasa si queremos tener punteros a estructuras como argumentos de función?
Y mencioné anteriormente, esto es mejor porque estamos haciendo
pasar por valor y c.
Cuando pasa por valor, copia.
Si tiene una estructura que contiene muchos
datos, muchas estructuras grandes como argumentos,
debe copiar todo en esa estructura
a la función real.
Así que podría llevar algún
tiempo copiar esas grandes estructuras.
Bueno, si tiene un puntero, todo lo que tiene que hacer es copiar
la dirección, que es mucho más rápido. Por lo tanto, los punteros
a las estructuras se utilizan como parámetros y funciones para evitar el
consumo de memoria y el tiempo que lleva copiar todas las estructuras.
Ahora, si tiene una estructura pequeña, no es
gran cosa, pero definitivamente quiere usar punteros y estructuras que sean grandes.
Entonces, en este caso, qué haces, aún especificas el nombre de los tipos de
estructura, solo pones el asterisco de
antemano, muy simple. Y si no desea
que cambie ninguno de los datos dentro de la estructura, puede usar constante antes del tipo de estructura.
Si no desea que cambie la dirección, debe colocar la constante después del puntero de la familia de estructura.
Pero aquí estamos haciendo lo mismo. Pero ahora vamos a acceder
a él de manera diferente porque ahora que es un puntero podemos usar el
guión mayor que, ese nuevo símbolo para acceder en lugar de usar el punto.
No tenemos que usar el punto aquí. Porque recuerde, los
punteros deben eliminar la referencia primero, por lo que tendría que ponerlos entre paréntesis, es
más sintaxis eliminar la referencia del puntero, luego tendría que poner el punto fuera del paréntesis
porque tiene mayor precedencia, mucho más fácil de usar el tablero que mayor que.
Dash y más grande que la madre, dash
y más grande que la madre son ambos indicadores, se pueden pasar en la comparación de str.
Si son iguales, devuelve verdadero. De lo contrario, devuelva falso, bastante sencillo.
También puede usar el modificador const como mencioné si
no desea permitir ninguna modificación de los miembros de la estructura.
A lo que apunta la estructura, coloca la constante antes del puntero.
También podrías poner la constante antes que la familia.
En este caso, family tiene un typef.
Así que aquí realmente
sería un puntero de const de familia de construcción o familia de estructura.
Y luego vuelve a acceder de la misma manera, no estás modificando nada. Entonces estás listo para irte.
El compilador no se va a quejar.
También puede usar el modificador constante si no desea permitir ninguna modificación
de la dirección en sí.
Cualquier intento de cambiar estas estructuras provocará un mensaje de error durante la compilación.
Así que aquí dirías estrella
de la familia y pones la constante después de la estrella.
Y lo que esto dice es que no puede
cambiar el valor de p-member, el valor del puntero, que es una dirección.
Pero nuevamente, esto no es muy útil porque
cuando pasa por valor, en realidad está pasando una copia de la dirección.
Entonces esto es redundante, no necesita hacer esto, pero puede hacerlo.
Y aquí, nuevamente, desea poder cambiar la dirección de lo que es p miembro.
Y en este caso, solo está accediendo a los datos de todos modos para ver si son iguales.
El operador de indirección en cada definición de parámetro está ahora
delante de la palabra clave constante.
Ese asterisco, no está delante del nombre del parámetro.
No puede modificar la dirección almacenada en los punteros porque está después del asterisco.
Si estaba delante del tipo de nombre del
parámetro, entonces querrá poder modificar el verdadero al que apunta.
Si tuviéramos ese operador de indirección delante del nombre del parámetro, lo que sería
en la constante antes, eso significaría
que querría poder modificar a lo que apunta. Esto es solo decir la dirección.
Por lo tanto, no puede modificar la dirección almacenada en los punteros.
Son los punteros los que están protegidos aquí, no las estructuras a
las que apuntan, al igual que la constante y otros parámetros de puntero, no hay diferencia con las estructuras.
Si desea devolver una estructura de una función que es un
puntero, el prototipo de función tiene que indicar este valor de retorno de la
forma normal en la declaración.
Así que aquí tendrías que decir golpeado para
salir con mi puntero
divertido o no puntero, no importa. Este es un prototipo para una función que no toma argumentos que devuelve
una estructura de tipo fecha, muy fácil de devolver una estructura desde una función. Y cuál es el valor de esto.
Bueno, ahora podemos devolver más de
un elemento o un elemento de datos de una función.
Si devuelve una estructura, puede devolver 10 valores, 10 elementos de datos diferentes.
Cuan genial es eso. La estructura le permite devolver más de uno de una función.
Muy, muy valioso.
Por lo tanto, a menudo es más conveniente devolver un puntero a una estructura en lugar de solo a la estructura.
Cuando devuelve un puntero a la estructura, se crea en el montón porque todos
los punteros se crean en el montón.
Esto significa que va a durar un poco más.
Y esto significa que puede eliminarlo y administrarlo en momentos arbitrarios.
Entonces, en este ejemplo, estamos creando una estructura llamada fondos.
Contiene una matriz de
caracteres llamada banco, contiene un doble, otro carácter
llamado guardado de una longitud particular. Solo asumí que la duración de la diversión es igual a 50.
Y luego tiene una doble guardada.
Tenemos una función llamada suma que toma esa estructura como parámetro.
Y todo lo que estamos haciendo es que estamos devolviendo
un - el fondo bancario de la primera estructura más el fondo de ahorro,
y eso devolverá la cantidad que tienen en su banco.
En este ejemplo, la suma es solo un doble.
No devolvemos un puntero. Solo tomamos un puntero como parámetro.
Y así, en nuestra función principal, estamos creando una variable de
estructura llamada stan de tipo struct fondos.
Lo estamos inicializando con algunos valores y luego imprimimos el total
de suma de llamadas. Y simplemente pasamos esta estructura como pasamos cualquier variable.
No tenemos que quitarle la referencia, no es un puntero. Realmente no tenemos que hacer nada especial.
Solo nos aseguramos de que en la declaración de la función tengamos ese tipo de estructura allí,
pero todo lo demás parece normal.
Un par de recordatorios.
Mencioné anteriormente que siempre debe usar punteros al pasar estructuras a una función.
¿Por qué? Porque recuerde, las versiones anteriores de
c no
permiten que se pasen estructuras, pero sí permiten punteros.
Para que pueda evitar cualquier tipo de compatibilidad con versiones anteriores.
Si está utilizando una versión anterior de c, su programa funcionará.
Entonces, simplemente pasar esa única dirección también
es más eficiente debido al tiempo de copia.
Pero si hace esto, si pasa un parámetro que es un puntero
a una estructura dentro de una función, tiene menos protección para sus datos.
Entonces, algunas operaciones en la función llamada podrían afectar inadvertidamente los datos
en la estructura original.
Y aquí es donde desea utilizar el calificador const.
Y usaría la const antes del tipo
real, no después del asterisco y antes del nombre
del parámetro, antes del tipo.
La ventaja de pasar estructuras son los argumentos, la
función trabaja con copias de los datos originales.
Es más seguro que trabajar con los datos originales.
Entonces, esa es realmente la única vez que desea pasar una estructura como un argumento que no es un puntero.
Y el estilo de programación tiende a ser un poco más claro.
Las principales desventajas de pasar estructuras como argumentos en lugar de pasar un
puntero estructurado como argumento es que las
implementaciones más antiguas pueden no manejar el código, desperdicia
tiempo y espacio y es especialmente
un desperdicio cuando tienes estructuras grandes, tenemos que hacer muchas copias
para cada una. miembro. Así que ten esto en cuenta.
En su mayor parte, desea pasar
punteros a estructuras, mucho más eficiente y ahorra tiempo.
Los programadores usan punteros de estructura como argumentos de función por razones de eficiencia
y usan constante cuando es necesario. Y esta es la combinación que quieres hacer.
Si está preocupado por la protección, simplemente use el puntero de
función para mejorar la eficiencia y luego
use la const const para que nada se estropee dentro
de la función, al igual que los punteros realmente
normales más o menos, pero con los punteros es aún más importante con la
eficiencia porque de grandes estructuras.
Pasar estructuras por valor se realiza con mayor frecuencia para estructuras que son pequeñas, y esas
son las reglas en las que desea pensar.
Está bien pasar una estructura que no es un puntero siempre que sea pequeña.
Una vez más, algunos conceptos importantes relacionados con las
estructuras y el paso de punteros como parámetros,
argumentos y también devuelven punteros. Ahora, podemos empezar a implementar algo
de esto. Proporcionamos muchos ejemplos. Entendemos los conceptos. Entendemos la sintaxis.
Ahora quiero presentarles un par de desafíos que lo tienen realmente haciendo esto, ha memorizado en la
sintaxis que ahora, si alguna vez desea crear una estructura en el programa, ya sabe cómo hacerlo
como la palma de su mano.
Así que vamos a tener un par de desafíos en nuestro próximo
par de conferencias para que se familiarice con todas estas cosas de las que hablamos sobre las estructuras.
Gracias.