CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
ESTRUCTURAS Y UNIONES EN C
1.- DEFINICIÓN DE UNA ESTRUCTURA
La composición de una estructura puede ser definida como:
struct nombre;
Los nombres de los miembros de una estructura deben ser todos diferentes. No se puede asignar un tipo de almacenamiento a un miembro individual. No pueden hacerse inicializaciones dentro de la declaración del tipo de la estructura.
Una vez que se ha definido la composición de la estructura, las variables individuales de ese tipo de estructura pueden declararse como sigue:
tipo_almacenamiento struct nombre variable1, variable2, , variableK;
Es posible combinar la declaración de la composición de una estructura con la de las variables de estructura. En este caso el nombre es opcional:
tipo_almacenamiento struct nombre variable1, variable2, , variableK;
Ej: struct fecha ;
struct fecha nacimiento, bautizo;
struct fecha nacimiento, bautizo;
Se puede definir una estructura como miembro de otra estructura, pero la declaración de la estructura interna debe aparecer antes que la declaración de la estructura externa.
A los miembros de una variable de estructura se le pueden asignar valores iniciales de forma parecida a como se hace con los arrays. Para hacer esto, las variables de estructura deben ser tipo extern o static. Los valores iniciales deben aparecer entre llaves, separados por comas y en el orden en que serán asignados a sus correspondientes miembros de la estructura:
tipo_almacenamiento struct nombre variable = ;
Ej: struct fecha ;
struct datos cliente = ;
struct datos padres[2];
2.- PROCESAMIENTO DE UNA ESTRUCTURA
Las estructuras se suelen procesar teniendo en cuenta cada miembro de forma individual. Un miembro de una estructura se accede escribiendo:
variable.miembro
donde el punto es un operador cuya precedencia y asociatividad aparecen en el Apéndice C.
Ej: Tomando de base el ejemplo anterior, podemos escribir:
cliente.nombre
cliente.nombre[2]
&cliente.nombre[2]
cliente.nacimiento.día
padres[0].nombre
padres[1].nacimiento.aÑo
En las versiones más antiguas de C, las estructuras debían procesarse miembro a miembro. Sin embargo, las nuevas versiones permiten asignar una estructura completa a otra siempre que las estructuras tengan la misma composición.
También es posible pasar estructuras completas a y desde funciones, pero la forma de hacerlo varía. Las versiones antiguas de C sólo permiten pasar punteros mientras que las nuevas versiones permiten pasar las estructuras completas.
3.- TIPOS DE DATOS DEFINIDOS POR EL USUARIO (typedef)
La característica typedef permite a los usuarios definir nuevos tipos de datos. Una vez que el tipo de dato definido por el usuario ha sido establecido, entonces las nuevas variables, arrays, estructuras, pueden ser declaradas en términos de este nuevo tipo de dato.
typedef tipo nuevo_tipo;
donde tipo se refiere a un tipo de dato existente (estándar o previamente definido por el usuario) y nuevo_tipo al nuevo tipo definido por el usuario.
Un caso particular muy utilizado es cuando se definen estructuras como nuevos tipos:
typedef struct nuevo_tipo;
Ej: typedef unsigned int boolean;
typedef int edad;
typedef float altura;
typedef float peso[100];
typedef struct registro;
edad varon, hembra;
altura hombre, mujer;
peso hombres, mujeres;
registro cliente1, cliente2;
4.- ESTRUCTURAS Y PUNTEROS
La dirección de comienzo de una estructura puede accederse por medio del operador dirección (&). Además, podemos declarar una variable puntero a una estructura escribiendo:
tipo *ptvar;
Ej: typedef struct registro;
registro cliente, *pc;
pc=&cliente;
Las declaraciones de la variable y del puntero pueden combinarse con la declaración de la estructura:
struct variable, *ptvar;
donde variable representa de nuevo una variable del tipo estructura y ptvar el nombre de una variable puntero.
Ej: struct cliente, *pc;
pc=&cliente;
Un miembro de una estructura puede accederse en términos de su correspondiente variable puntero con:
ptvar->miembro
Ej: pc->alto cliente.alto (*pc).alto son equivalentes
Las siguientes expresiones son equivalentes entre sí:
pc->nombre[2] cliente.nombre[2] (*pc).nombre[2]
*(cliente.nombre + 2) *(pc->nombre + 2) *((*pc).nombre + 2)
5.- PASO DE ESTRUCTURAS A UNA FUNCIÓN
Los miembros individuales de una estructura se pueden pasar como argumentos a una función, y un miembro de una estructura puede ser devuelto mediante la sentencia return. Para hacer esto, cada miembro de la estructura se trata como una variable ordinaria unievaluada.
Una estructura completa puede transferirse a una función pasando un puntero a la estructura como argumento. En realidad, estamos pasando la estructura por referencia y cualquier modificación de los miembros de la estructura permanecerá al salir de la función.
La mayoría de las nuevas versiones de C permiten que una estructura completa sea transferida directamente a una función como parámetro y devuelta directamente con la sentencia return. En este caso, el paso de la estructura es por valor.
Ej: typedef struct registro;
main( )
registro *func1(registro *pt1, registro*pt2) /* definición de función */
void func2(registro clien) /* definición de función */
6.- ESTRUCTURAS AUTORREFERENCIADORAS
Se puede incluir dentro de una estructura un miembro que sea un puntero a este tipo de estructura:
struct nombre ;
7.- UNIONES
Las uniones, como las estructuras, contienen miembros cuyos tipos de datos pueden ser diferentes. Sin embargo, los miembros que componen una unión comparten el mismo área de almacenamiento dentro de la memoria, mientras que cada miembro dentro de la estructura tiene asignada su propia área de almacenamiento. El compilador reserva espacio para poder almacenar el miembro que más memoria ocupe. Las uniones son útiles para ahorrar memoria cuando todos los miembros no necesiten tener valor a la vez.
En términos generales, la composición de una unión puede definirse como:
union nombre ;
Las variables de unión pueden definirse como:
tipo_almacenamiento union nombre variable1, variable2, , variableK;
Las dos declaraciones pueden ser combinadas (en este caso el nombre es opcional):
union nombre variable1, variable2, , variableK;
Una unión puede ser miembro de una estructura y viceversa. Además, estructuras y uniones pueden ser mezcladas libremente con arrays.
Ej: union id ;
struct ropa camisa, blusa;
Es equivalente a:
struct ropa descripción;
} camisa, blusa;
Tenemos camisa y blusa como variables de estructura del tipo ropa. Cada variable contendrá los siguientes miembros:
una cadena (fabricante)
una cantidad en punto flotante (coste)
una unión (descripción) que puede representar:
una cadena (color) o bien
una cantidad entera (talla)
Un miembro individual de una unión puede ser accedido de la misma forma que un miembro de una estructura, usando los operadores . y ->.
Una variable de unión puede ser inicializada siempre que su tipo de almacenamiento sea extern o static. Recordar, sin embargo, que sólo uno de los miembros de la unión puede tener un valor asignado en cada momento.
Ej: union id ;
static union id camisa =;
extern union id blusa =;
En todos los aspectos, las uniones se procesan como las estructuras (paso a funciones, asignaciones,).
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1011
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved