UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

2.2. Tipos de datos estructurados

C permite definir estructuras de datos que agrupan campos de otros tipos de datos. La sintaxis se muestra a continuación:

struct nombre_de_la_estructura 
{
    tipo_1 nombre_del_campo1;
    tipo_2 nombre_del_campo2;
    ...
    tipo_N nombre_del_campoN;
};

La construcción anterior sólo define un nuevo tipo de datos, no se declara variable alguna. Es decir, la construcción anterior tiene la misma entidad que el tipo int o float. El nombre del nuevo tipo estructurado definido es struct nombre_de_la_estructura. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define FIRST_SIZE 100
#define LAST_SIZE 200
#define CONTACTS_NUM 100

/* Definición de la estructura */
struct contact_information 
{
    char firstname[FIRST_SIZE];
    char lastname[LAST_SIZE];
    unsigned int homephone;
    unsigned int mobilephone;
};

/* Declaración de variables con esta estructura */
struct contact_information person1, person2, contacts[CONTACTS_NUM];

Las líneas 6 a 12 definen un nuevo tipo de datos estructurado que contiene cuatro campos, los dos primeros son tablas de letras y los dos últimos son enteros. A pesar de que estos campos tienen nombres y tamaños, hasta el momento no se ha declarado ninguna variable. Es en la línea 15 en la que se sí se declaran tres variables de este nuevo tipo estructurado. La última de ellas es una tabla de 100 de estas estructuras. Asegúrate de que tienes clara la diferencia entre la definición de un tipo de datos y la declaración de variables de ese tipo. La siguiente figura muestra estos conceptos para una estructura y un tipo básico.

Sugerencia

Copia y pega en un fichero de texto en tu entorno de trabajo el código del ejemplo anterior. Compila para comprobar que es correcto. Realiza cambios en la estructura: número de campos, tipos de datos, declaración de nuevas variables, etc. Comprueba que todos ellos mantienen el texto correcto utilizando el compilador.

La definición de una estructura y la declaración de variables se pueden combinar en la misma construcción, pero preferimos que lo hagas por separado, por legibilidad:

struct contact_information 
{
    char firstname[FIRST_SIZE];
    char lastname[LAST_SIZE];
    unsigned int homephone;
    unsigned int mobilephone;
} person1, person2 contacts[CONTACTS_NUM];

El acceso a los campos de una variable estructurada se denota por el nombre de la variable seguido de un punto y del nombre del campo tal y como se muestra en el siguiente ejemplo..

#define FIRST_SIZE 100
#define LAST_SIZE 200
#define CONTACTS_NUM 100
    
struct contact_information 
{
    char firstname[FIRST_SIZE];
    char lastname[LAST_SIZE];
    unsigned int homephone;
    unsigned int mobilephone;
};

int main(int argc, char *argv[]) 
{
    struct contact_information person1;

    person1.firstname[0] = 'A';
    person1.firstname[1] = 0;
    person1.lastname[0] = 'B';
    person1.lastname[1] = 0;
    person1.homephone = 975556768;
    person1.mobilephone = 666555444;    
}

Los tipos estructurados pueden anidarse. El único requisito es que la definición de un tipo preceda a su uso. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
#define SIZE 100
struct point_data 
{
    int coord_x;
    int coord_y;
};

struct polygon {
    char description[SIZE];
    struct point_data points[SIZE;
};

struct polygon p;

¿Cuántas variables se han declarado en el código anterior? ¿Cuántos tipos de datos se han definido? Imagínate que eres el compilador y que debes reservar memoria para almacenar los datos que se acaban de declarar. ¿Cuáles de estas líneas se traducirían en reserva de memoria? ¿De qué tamaño?