Professional Documents
Culture Documents
“Unidad Zacatenco"
PROYECTO FINAL:
“ESTRUCTURA Y UNION”
TRABAJO: “DESARROLLO TEORICO”
ALUMNO:
PROFESOR:
Una estructura (struct) permite agrupar variables de varios tipos bajo un mismo
nombre. De esta forma es posible crear elementos de datos complejos, basándose en
los tipos básicos que suministra el lenguaje de programación.
Una declaración de estructura define un tipo, y por lo tanto será posible definir
variables de este nuevo tipo. Cada una de estas variables estará compuesto a su vez
por las variables que se definieron en la estructura.
struct nombre {
componente1 ;
componente2 ;
...
componenteN ;
} lista-variables ;
tipo nombre ;
Por ejemplo, para declarar una estructura que permita manejar, de manera conjunta,
los datos de algunos alumnos de determinado curso, se podría hacer:
struct Alumno {
char Nombre[30];
char NumAlumno[8];
float Nota1;
float Nota2;
float Nota3;
float NotaFinal;
Esta declaración define tres variables (A1, A2 y A3), cada una compuesta a su vez por
un string para el nombre, un string para su número de alumno, tres float para sus notas
parciales, y un float para su nota final.
estructura.componente
Por ejemplo, el string que contiene el nombre del segundo alumno se referencia como:
A2.Nombre
Al igual que con los tipos simples de C, es posible definir vectores compuestos de
estructuras. Así, sería posible hacer la definición anterior aplicable a un mayor número
de alumnos:
struct Alumno {
char nombre[30];
char NumAlumno[8];
float Nota1;
float Nota2;
float Nota3;
float NotaFinal;
} Alumnos[NUM_ALUMNOS];
Alumnos[0].Nombre
En las versiones ANSI de C (como gcc), también es posible asignar estructuras, pasarlas
como argumentos a funciones y retornarlas como resultado de funciones. En el caso
del paso de estructuras como argumento, éstas se pasan por referencia, por lo que es
posible cambiar el contenido de las variables dentro de la función y los cambios se
propagarán al retornar. Las siguientes acciones y declaraciones serían válidas:
Importante:
Observe que el nombre del tipo que debe usarse lleva incluido el prefijo struct. Para el
caso de nuestro ejemplo:
struct Alumno
Haciendo uso de typedef será posible manejar estos nuevos tipos sin necesidad de
acarrear constantemente el prefijo mencionado.
Una vez dada la declaración inicial de una estructura, es posible definir más variables
del nuevo tipo definido. Esto se hace siguiendo la sintaxis:
UNION
Sinopsis
Las uniones C++ son un tipo especial de clase; un tipo de variable con cierta similitud
con las estructuras. Pueden albergar diferentes tipos de datos, pero solo uno, de entre
todos los posibles, al mismo tiempo. Se dice que solo uno puede estar "activo" en cada
momento, y se corresponden con los registros de tipo variable de Pascal y Modula-2.
Como el lector estará suponiendo, el tamaño de una unión es el del mayor elemento
que puede albergar. El valor exacto depende de la implementación y de las
alineaciones internas.
En realidad las uniones son un recurso de programación que permite alojar distintos
tipos de objetos en un mismo espacio cuando estos objetos no coexisten en el tiempo
y no hay suficiente memoria disponible para asignarles espacios distintos. Se trata por
tanto de objetos muy especializados en cuanto a su uso, propio de aplicaciones muy
"afinadas", de tiempos en que la memoria era un bien escaso, pero cuya utilización
real es bastante rara y desaconsejada.
2 Declaración
a: Las uniones pueden contener campos de bits ,pero solo uno puede estar activo.
Todos comienzan en el principio de la unión y como consecuencia, dado que los
campos de bits son dependientes de la implementación, pueden presentar problemas
para escribir código portable.
b: Un objeto que tenga constructor o destructor no puede ser utilizado como miembro
de una unión.
c: A diferencia de las estructuras, en las uniones C++ no se permiten los
especificadores de acceso public, private y protected de las clases. Todos sus campos
son públicos.
union local87 {
int i;
double d;
} a = { 20 };
2.1 Ejemplo
int i;
double d;
char ch;
char *ptr;
El uso debe ser consistente con los valores almacenados en cada caso, cuestión esta
que queda bajo responsabilidad del programador (esta es la razón principal para que
se desaconseje su uso salvo caso de necesidad insoslayable). Si se lee un dato de tipo
distinto al que se escribió, el resultado obtenido es dependiente de la implementación.
3 Acceso a miembros
Como en el caso de las estructuras, se dispone de dos operadores para referenciar los
miembros de las uniones:
. Selector directo
Una expresión del tipo Un.obj representa el objeto obj de la unión Un. La expresión es
un Lvalue siempre que Un no lo sea y obj no sea una matriz.
mu.ch = 'A';
muptr->i = 3;
El segundo printf es legal, dado que mu.i es un entero. El problema es que el patrón de
bits que correspondería a mu.i coincide con parte del double previamente asignado
en la primera sentencia, y su valor no tiene ningún sentido considerado aisladamente.
4 Punteros a uniones
Cuando son modelados adecuadamente, los punteros a una unión señalan a cada
uno de sus miembros y viceversa.
5 Tamaño y alineación
Por ejemplo, si nos referimos a la unión anterior, las sentencias sizeof(union miUnion) y
sizeof(mu), ambas devuelven 8; este es el tamaño en bytes de la unión, que
corresponde a la opción más desfavorable, cuando se almacena un double, pero
cuando mu almacena un int existen 4 bytes desaprovechados, y 7 cuando se
almacena un char.
6 Uniones anónimas
Uniones anónimas son aquellas que no tienen etiqueta y tampoco se utilizan para
declarar un objeto nominado (con nombre). Tienen la forma general:
union { lista-de-miembros };
#include <iostream.h>
void main () {
i = 25;
cout << "El valor de '?.i' es: " << i << endl;
Salida:
6.1 Las uniones anónimas pueden ser globales, y anidadas o sin anidar.
Ejemplo:
#include <iostream.h
void main () {
i = 15;
cout << "El valor de '?.i' es: " << i << endl;
i = 25;
cout << "El valor de '?.i' es: " << i << endl;
cout << "El valor de '?.i' es: " << ::i << endl;
Salida:
Ejemplo:
#include <iostream.h>
void main () {
cout << "El valor '?.i' es: " << i << endl;
Resulado de la compilación:
Borland C++: Error E2020 pru1.c 2: Global anonymous union not static
La estructura, clase o unión exterior de una unión anónima anidada debe tener un
nombre. C++ permite uniones anónimas anidadas. Por ejemplo:
int x;
int y;
char c;
};
};
...
int main(void) {