-
Estructura
-
Campos de bit
-
Unión
-
Enumeración
Existen también tipos de datos que el usuario puede definir
en base a otros tipos de datos básicos o estructurados empleando la palabra
clave “typedef”.
Una estructura es una variable definida por el programador y
que está compuesta por un conjunto de variables que se referencian bajo un
mismo nombre. Las variables o elementos de la estructura están relacionadas de
una forma lógica desde el punto de vista de la información que tratan.
Para poder emplear una estructura es necesario una
declaración de la misma mediante la palabra clave struct, estableciendo así un patrón o plantilla de la
estructura que se va a emplear.
Formato de declaración de la plantilla:
Tipo
Elemento1;
Tipo
Elemento2;
...
}Lista_variables;
Ejemplo:
Struct cliente{
Int dni;
Char Nom[35];
Char direct[45];
Float cuenta;
}client1,
client2, client3;
Con esta sentencia
se ha declarado una plantilla del tipo cliente y a la vez se han definido en
memoria tres variables client1, client2 y client3 que contienen los elementos
del tipo declarado.
Tipo
Elemento1;
Tipo
Elemento2;
...
}Lista_variables;
Ejemplo:
Struct {
Int dni;
Char Nom[35];
Char direct[45];
Float cuenta;
}client1,
client2, client3;
b) después de haber realizado la declaración de la
estructura
Formato:
struct Nombre_estructura lista_variables;
Ejemplo:
Struct cliente client4, client5;
REFERENCIA A ELEMENTOS
A)
Referenciar elementos
Para hacer referencia a cada uno de los elementos de la estructura se emplea al
operador .(punto).
Nombre_variable_estructura.nombre_elemento
Siguiendo el ejemplo anterior, para referenciar los
elementos de la variable client1:
Client1.dni, client1,nom, client1.direc, client1.cuenta
b) Leer elementos:
Se utilizarán las funciones de lectura dependiendo del tipo
de datos de cada elemento.
Gets(client1.direc); scanf(“%f”,
&client1.cuenta);
c) Escribir elementos:
Se utilizarán las funciones de escritura dependiendo del tipo
de datos de cada elemento.
puts(client1.direc); printf(“%s”,
&client1.cuenta);
a- Inicializando en la definición
Se
especifican en el programa los valores de los datos, al definir las variables,
mediante una asignación de valores a los elementos expresados por una lista
entre llaves.
Ejemplo:
Struct cliente client1 = { 34567,
“Antonio
López Pérez”,
“c/
Mayor 25 –Madrid”,
125000.5
}
Asignando valores
b- Asignando valores
Se asignan
directamente los datos a cada uno de los elementos. No se suele emplear excepto
cuando se quiere modificar algún valor de uno o varios elementos.
Ejemplo:
Strcpy(client1.nom, “Antonio López Pérez”);
Strcpy(client1.direc, “C/ Mayor 25 – Madrid”);
Client1.dni= 24564;
Client1.cuenta = 125000.5;
También es posible asignar todos los elementos de una
variable estructura a otra variable estructura del mismo tipo.
Client1 = client2;
c- Introduciendo los valores por teclado
Se realiza utilizando las
funciones de entrada de datos correspondientes al tipo de datos de cada
elemento.
Scanf(“%d”, &client1.dni);
Gets(client1.nom)
Gets(client1.direc);
Scanf(“%f”,&client1.cuenta);
En una plantilla de
estructura se pueden anidar otras estructuras que deben estar previamente
declaradas.
Formato:
Struct Nombre_estruct1{
Tipo
elemento1;
Tipo
elemento2;
...
};
Struct nombre_estruct2 elementoa;
Tipo
elemento_b;
Tipo
elemento_b;
...
};
struct Nombre_estruct2 Nombre_variable
struct dir{
char
calle[25];
int codpos;
char población[20];
}
struct cliente{
int dni;
char
nom[35];
struct dir
direc;
float
cuenta;
};
struct cliente
client1;
Para referenciar
elementos de la estructura anidada se emplea sucesivamente el operador punto.
Las estructuras, igual que los demás tipos de datos, pueden
formar parte de un array. Cuando se define la variable del tipo estructura se
indica por un índice el tamaño del array.
Struct nombre_estructura nombrevariable[tamaño];
Struct cliente clienttab[150];
Con esta definición se
crea una tabla de 150 elementos, todos del tipo cliente. La referencia a un
elemento de la tabla se hará usando el índice correspondiente.
El tratamiento de los
arrays de estructuras es similar al de los arrays de elementos del tipo básico,
teniendo en cuenta la forma de referenciar sus elementos.
PUNTEROS Y ESTRUCTURAS
Los punteros a estructuras funcionan del mismo modo que los
punteros a otros tipos de variables pero se emplea un operador específico para
referenciar los valores de sus elementos.
a-
Definiciónde un puntero a un tipo de estructura
Struct nombre_plantilla *nombre_puntero;
Ejemplo:
Struct
cliente *pclient;
Struct
cliente *pclient;
b-
Asignar una dirección al puntero
Formato:
En el caso de una tabla de estructuras: Nombre_puntero =
nombre_tabla_estructuras
Ejemplo:
Pclient
=&client1;
Pclient =
clienttab;
c) Referencia a un valor de la variable
estructura apuntada
Se debe utilizar el valor de la variable estructura apuntada
->
Ejemplo:
Pclient
-> nom
Pclient[4]
-> direc
Pclient
-> direc.codpos
FUNCIONES Y ESTRUCTURAS
El uso de funciones en relación con las estructuras puede
ser de dos formas, que dependen de los casos de pasar solamente elementos de la
estructura o la estructura completa.
a)Paso de elementos de una estructura
Paso por valor:
Se pasa a la función el valor de cada uno de los elementos.
Llamada a la función:
Funcion(client1.cuenta, client1.dni);
Definición de la función:
Paso por referencia:
Se pasa a la función la dirección de cada uno de los
elementos.
Llamada al a función:
Funcion2(cliente1.nom, &empleado1.cuenta);
Definición de la función:
b) Paso de toda la estructura
Es conveniente que la plantilla de la estructura esté
declarada a nivel global.
Paso por valor:
Se pasa a la función el valor de todos los elementos de la
estructura.
Funcion3(cliente1);
Definición de la función:
Paso por referencia:
Se pasa a la función la dirección de la estructura.
Llamada a la función.
Funcion4(&cliente1);
Definición de la función:
Llamada a la función:
Cliente1 =
funcion5();
Definición dela función:
{
struct
cliente client;
....
return
client;
}
CAMPO DE BITS
Los campos de bits son estructuras compuestas de elementos
cuyo tamaño se expresa con uno o más bits. El compilador guarda la información
de los campos de bits en la menor unidad de memoria posible. Con este tipo de
estructura es posible acceder a los bits de un byte o de una palabra, almacenar
variables lógicas en el menor espacio posible y realizar tratamientos sobre los
bits deun dispositivo.
La
definición de estructura con campos de bits se realiza de forma similar a las
estructuras pero expresando la longitud de cada campo con un número de bits.
Tipo
campo1:longitud1;
Tipo
campo2:longitud2;
......
Tipo
campon:longitudn;
}Lista_variables;
El tipo de dato de cada campo de bits debe ser un int o unsigned int y la longitud es el tamaño en bits que tiene cada campo( en un PC es de 1 a 16 bits). Si la longitud es 1 el tipo del campo debe ser necesariamente unsigned, pues no puede contener un valor y un signo al mismo tiempo.
Ejemplo:
Con la variable funcionario (utilizando campos de
bits) se ha reunido información en un solo byte, mientras que si hubieran
utilizado campos de tipo int se habrian necesitado por lo menos 8 bytes.
Para referenciar un campo de bits se emplea el mismo
procedimiento que en las estructuras.
No es obligatorio expresar todos los bits de un byte o de una palabra:
Ejemplo:
Struct func{
Unsigned
departamento: 4;
Unsigned
situación: 1:
}funcionario;
El uso de los campos de bits tiene una serie de
limitaciones:
1. No se
puede obtener la direcciçon de un campo de bits, pues la menor unidad
direccionable es el byte.
2.
Se pueden producir problemas con la portabilidad, pues en
cada mçaquina puede ser distinto el orden de funcionamiento de los campo, de
izquierda a derecha o viceversa.
3.
En algunos compiladores, los
campos de bits no pueden formarse como arrays.
LAS UNIONES
Una uniçon es una estructura en la
que sus elementos ocupan la misma posiciçon de memoria. El tamaño de la memoria
es el correspondiente al elemento mayor de la uniçon y los demças elementos
comparten dicha memoria. En cada momento de la ejecución