Está en la página 1de 23

Definicin de estructura

Una estructura (struct) permite agrupar variables de varios tipos bajo un mismo nombre. A estos componentes individuales de la estructura se le denomina miembros. De esta forma es posible crear elementos de datos complejos, basndose en los tipos bsicos que suministra el lenguaje de programacin.

Por ejemplo, se puede utilizar una estructura para almacenar diferentes tipos de informacin sobre una persona, tal como nombre, estado civil, edad y fecha de nacimiento. Cada uno de estos elementos se denominan nombre del miembro.

Declaracin de una estructura


Una declaracin tpica de estructuras sera:

struct nombre_de_la_estructura{ miembro1 ; miembro2 ; ... miembroN ; };

Una declaracin 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.

Ejemplo
Supngase que se desea disear una estructura que guarde los datos correspondientes a un alumno. Esta estructura, a la que se llamar alumno, deber guardar el nombre, la direccin, el nmero de matrcula, el telfono, y las notas en las 10 asignaturas. Cada uno de estos datos se denomina miembro de la estructura.

La estructuras sera

struct alumno { char nombre[31]; char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; };

El cdigo anterior crea el tipo de dato alumno, pero an no hay ninguna variable definida con este nuevo tipo.

Definicin de variables de estructura


Al igual que a los datos enumerados, a una estructura se accede utilizando una variable o variables que se deben definir despus de la declaracin de la estructura. En C existen dos conceptos similares a considerar: declaracin y definicin. Declaracin: una declaracin especifica simplemente el nombre y el formato de la estructura de datos, pero no reserva almacenamiento en memoria. La declaracin especifica un nuevo tipo de dato: struct <nombre_estructura> Definicin: A diferencia del concepto anterior. Cada definicin de variable para una estructura dada crea un rea en memoria donde los datos se almacenan de acuerdo al formato estructurado declarado.

Definicin de variables
Las variables de estructuras se pueden definir de dos formas: 1. Listado el tipo de la estructura creada seguido por las variables correspondientes en cualquier lugar del programa antes de utilizarlas Ejemplo: Para declarar dos variables de tipo alumno en C se debe utilizar la sentencia incluyendo las palabras struct y el nombre de la estructura.

struct nombre_estructura alumno1, alumno2;


Donde tanto alumno1 como alumno2 son una estructura, que podr almacenar un nombre de hasta 30 caracteres, una direccin de hasta 20 caracteres, el nmero de matrcula, el nmero de telfono y las notas de las 10 asignaturas. Segn el ejemplo de estructura anterior.

Definicin de variables
2. Tambin podran haberse definido las variables inmediatamente despus de la llave de cierre de la declaracin de la estructura.
Ejemplo: alumno1 y alumno2 al mismo tiempo que se defina la estructura de tipo alumno: struct alumno { char nombre[31]; char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; } alumno1, alumno2;

Acceso a los elementos de la estructura


Se accede a una estructura, bien para almacenar informacin en la estructura o bien para recuperar dicha informacin . Y se puede acceder a los miembro de una de estas dos formas:
1. Utilizando el operador punto (.) 2. Utilizando el operador puntero(->)

Almacenamiento de informacin en estructura


Se pude almacenar informacin de una estructura mediante: 1. Inicializacin. 2. asignacin directa o lectura del teclado.

Acceso a los elementos de la estructura


1. Almacenamiento en estructura mediante INICIALIZACION:
Una estructura puede inicializarse en el momento de la declaracin de modo anlogo a como se inicializan los vectores y matrices, por medio de valores encerrados entre llaves {}.

Por ejemplo, una forma de declarar e inicializar a la vez la estructura alumno_nuevo podra ser la siguiente:

struct alumno { Donde, como no se proporciona valor para las char nombre[31]; notas, stas se inicializan a cero. char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; } alumno_nuevo = {"Mike Smith", "San Martn 87, 2 A", 62419, 421794};

Acceso a los elementos de la estructura


Acceso mediante le operador punto (.) :

2. Almacenamiento en estructura mediante ASIGNACION DIRECTA:


La asignacin de datos a los miembros de una variable estructura se hace mediante el operador punto (.), precedido por el nombre de la estructura y seguido del nombre del miembro. Mediante la notacin:

struct nombre_estructura.nombre_miembro = datos; Por ejemplo, para dar valor al telfono del alumno alumno1 el valor 903456, se escribir:
Para guardar la direccin de este mismo alumno, se escribir:

alumno1.telefono = 903456;

alumno1.direccion = "C/ Penny Lane 1,2-A";

Acceso a los elementos de la estructura


Acceso mediante le operador punto (.) :

3. Almacenamiento en estructura mediante LECTURA DEL TECLADO:


En el siguiente ejemplo se leen del teclado los datos de una variable estructura corredor: struct corredor cr; printf(Nombre: ); gets(cr.nombre); printf(Edad: ); scanf(%d, &cr.edad); if(cr.edad <=18) strcpy(cr.categoria, Juvenil); else if(cr.edad <=40) strcpy(cr.categoria, Senior); else strcpy(cr.categoria, Veterano);

Acceso a los elementos de la estructura


Acceso mediante le operador puntero(->) : Almacenamiento en estructura mediante el operador flecha (->): Es utilizado desde un puntero a estructura. El operador puntero sirve para acceder los datos de la estructura a partir de un puntero. Para utilizar este operador se debe definir una variable de tipo puntero para apuntar a la estructura. La asignacin de datos a estructuras utilizando el operador puntero tiene el formato: puntero _estrutura -> nombre_miembro = datos; Su finalidad ser comprendida cuando se explique puntero a estructura.

Recuperacin de informacin de una estructura


Se recupera informacin de una estructura utilizando el operador de asignacin o una sentencia de salida (printf () , puts (), ... ). Igual que antes, se puede emplear el operador punto o el operador flecha (puntero). El formato general toma una de estas dos formas:

Por asignacin:
<nombre variable> = nombre _variable _estructura>. <nombre _miembro>;

o bien
<nombre variable> = <puntero _de _structura> -> <nombre _miembro>;

Para salida:
printf(" ",<nombre _variable _estructura>.<nombre _miembro;

o bien
printf(" ",<puntero _de_estructura> -> <nombre_miembro;

Ejemplo
struct complejo z struct complejo *pz; pz = &z; x = z.pr; y = z.pi; printf("\nNmero complejo (%.lf,%.lf), mdulo: %.2f", pz ->pr ,pz->pi, pz->modulo);

Arreglos de estructura
Se puede crear un arreglo de estructura tal como se crea un arreglo de otro tipo. Los arreglos de estructura son idneos para almacenar una archivo completo de empleados, un archivo de inventarios, o cualquier otro conjunto de datos que se adapte aun formato de estructura. Muchos programadores de C utilizan arreglos de estructuras como un mtodo para almacenar datos en un archivo de disco. Se pueden introducir y calcular sus datos de disco en arreglos de estructuras y a continuacin almacenar esas estructuras en memoria. Los arreglos de estructuras proporcionan tambin un medio de guardar datos que se leen del disco. La declaracin de un arreglo de estructuras info_libro se puede hacer de un modo similar a cualquier arreglo, es decir: struct info_libro libros [100];

Asigna un arreglo de 100 elementos denominado libros

Ejemplo
Para acceder a los miembros de cada uno de los elementos estructura se utiliza una notacin de arreglo. Para inicializar el primer elemento de libros, por ejemplo, su cdigo debe hacer referencia a los miembros de libros [0] de la forma siguiente: strcpy(libros[0].titulo, "C++ a su alcance"); strcpy(libros[0] .autor, "Luis Joyanes"); strcpy (libros[0] . editorial, "McGraw-Hill"); libros[0].ao = 1999; Tambin puede inicializarse un arreglo de estructuras en el punto de la declaracin encerrando la lista de inicializadores entre llaves, { }. Por ejemplo: struct info_libro libros [3] = { "C++ a su alcance", "Luis Joyanes", McGraw-Hill, 1999, Estructura de datos, Luis Joyanes, McGraw-Hill, 1999, Problemas en Pascal, ngel Hermoso, McGraw-Hill, 1997};

Punteros a estructuras
Tambin se pueden usar punteros con estructuras. Primero hay que definir la estructura de igual forma que hacamos antes. La diferencia est en que al declarar la variable de tipo estructura debemos ponerle el operador * para indicarle que es un puntero. Antes de acceder a los miembros de una estructura con una variable puntero y el operador puntero (->), es preciso crear espacio de almacenamiento en memoria; por ejemplo con la funcin malloc().

De no ser as, debemos darle una direccin vlida donde apuntar. No podemos por ejemplo crear un puntero estructura y meter los datos directamente mediante ese puntero, no sabemos dnde apunta el puntero y los datos se almacenaran en un lugar cualquiera. No debemos olvidar el operador & que significa 'dame la direccin donde est almacenado...'. Y si se trabaja con punteros se debe usar el operador '->'. Este operador viene a significar algo as como: "dame acceso al miembro... del puntero ...".

Ejemplo 1
Declaracin de la estructura estrutura_amigo

#include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; struct estructura_amigo *p_amigo; int main() {

Definicin de la variable amigo como tipo estrutura_amigo e inicializada Definicin de la variable puntero p_amigo de tipo estructura_ amigo

Se le da una direccin hacia donde apuntar a la variable puntero p_amigo Se acceden a los miembros de la variable amigo a travs de la variable puntero p_amigo

p_amigo = &amigo; printf( "%s tiene ", p_amigo->apellido ); printf( "%i aos ", p_amigo->edad ); printf( "y su telfono es el %s.\n" , p_amigo->telefono ); }

Ejemplo 2
Utilizar los punteros para introducir datos en las estructuras.

#include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; int edad; }; struct estructura_amigo amigo, *p_amigo; int main() { p_amigo = &amigo; /* Introducimos los datos mediante punteros */ printf("Nombre: ");fflush(stdout); gets(p_amigo->nombre); printf("Apellido: ");fflush(stdout); gets(p_amigo->apellido); printf("Edad: ");fflush(stdout); scanf( "%i", &p_amigo->edad ); /* Mostramos los datos */ printf( "El amigo %s ", p_amigo->nombre ); printf( "%s tiene ", p_amigo->apellido ); printf( "%i aos.\n", p_amigo->edad ); }

Se introducen los datos mediante puntero

Paso de estructura a funciones

C permite pasar estructuras a funciones, bien por valor o bien por referencia utilizando el operador &. Si la estructura es grande, el tiempo necesario para copiar un parmetro struct, en el paso por valor, puede ser prohibitivo o muy deficiente. En tales casos, se debe considerar el mtodo de pasar la direccin de la estructura.

Ejemplo

Solicitados datos de entrada de una estructura que represente a una persona y mostrarlos por pantalla, una funcin entrada y otra de salida.
void entrad_pna(struct info_persona* pp) { puts(\n Entrada de los datos de una persona\n); printf (Nombre : ); gets (pp- >nombre) ; printf(Calle: ); gets(pp->calle); printf (Ciudad: ); gets (pp->ciudad); printf (Provincia: ); gets (pp->provincia) ; printf(Codigo postal: ); gets(pp->codigopostal); } void ver_info(struct info_persona p) { puts("\n\tlnformacin relativa a la persona); puts(p.nombre); puts (p.calle) ; put s (p.ciudad) ; puts(p.provinciaJ; puts(p.codigopostal); }

#include <stdio,h> /* Define el tipo estructura info_persona */ struct info_persona {char nombre [20] ; char calle [30] ; char ciudad [25] ; char provincia [25] ; char codigopostal[61]; }; /* prototipos de funciones */ void entrad_pna(struct info_persona* pp); Void ver_info(struct info_persona p); Void main(void) { struct info_ persona reg_dat; /*Pasa por referencia la varibale*/ Entrad_pna(&reg_data); /*Pasa por valor*/ ver_info(reg_data); Printf(\nPulsa cualquier caracter para continuar\n); Getchar(); }

Uniones
Las uniones son similares a las estructuras en cuanto que agrupan a una serie de variables, pero la forma de almacenamiento es diferente y, por consiguiente, tiene efectos diferentes.

Una estructura (struct) permite almacenar variables relacionadas almacenadas en posiciones contiguas en memoria.

juntas

Las uniones se declaran con la palabra reservare unin, almacenan tambin miembros mltiples en un paquete; sin embargo, en lugar de situar sus miembros unos detrs de otros, en una unin, todos los miembros se solapan entre s en la misma posicin. El tamao ocupado por una unin se determina analizando el tamao de cada variable de la unin: el mayor tamao de variable ser el tamao de la unin.

Uniones
La sintaxis de una unin es la siguiente:
union nombre { tipo1 miembro1; tipo2 miembro2; };

Ejemplo:
union PruebaUnion { float Item1; int Item2; };
La cantidad de memoria reservada para una unin es igual a la anchura de la variable ms grande. En el tipo union, cada uno de los miembros dato comparten memoria con los otros miembros de la unin. La cantidad total de memoria utilizada por la unin es de 8 bytes, ya que el elemento double es el miembro dato mayor de la unin y ocupa 8 bytes.

Uniones
Una razn para utilizar una unin es que se ahorra memoria. En muchos programas se deben tener varias variables, pero no es necesario utilizar todas al mismo tiempo. Considrese la situacin en que se requieren tener diversas cadenas de caracteres de entrada. Se pueden crear varios arreglos de caracteres, tales como los siguientes: Estas tres variables ocupan 240 bytes de memoria. Sin embargo, si su programa no necesita utilizar las tres variables simultneamente, por qu no permitirle compartir la memoria utilizando una unin. Cuando se combinan en el tipo unin frases, estas variables ocupan un total de slo 80 bytes. Para referirse a los miembros de una unin, se utiliza el operador punto (.), o bien el operador (->) si se hace desde un puntero a unin. char linea_ordenes[80]; char mensaJe error[80]; char ayuda [80] ;

union frases { char linea ordenes [80] ; char mensaJe error[80]; char ayuda [80] ; } cadenas, *pc;

cadenas.ayuda; cadenas.mensaje error; pc -> mensaje error;

También podría gustarte