Resumen de Sintaxis de Estructuras en C
Deciembre 31 2008 :: Apuntes, c ::
Declaración de estructuras y acceso a miembros.
#include <string.h>
#include <stdio.h>
struct ejemplo {
int miembro1;
char miembro2[30];
};
main () {
struct ejemplo var1;
var1.miembro1 = 10;
strcpy(var1.miembro2, “Hola que Tal.”);
printf(”miembro 1: %d \t miembro 2: %s\n”, var1.miembro1, var1.miembro2);
}
Usando Typedef para simplificar la declaración de estructuras.
#include <string.h>
#include <stdio.h>
struct ejemplo {
int miembro1;
char miembro2[30];
};
typedef struct ejemplo ejemp;
main () {
ejemp var2;
var2.miembro1 = 20;
strcpy(var2.miembro2, “Otro string.”);
printf(”miembro 1: %d \t miembro 2: %s\n”, var2.miembro1, var2.miembro2);
}
Se puede hacer la misma declaración del typedef de la siguiente manera:
typedef struct ejemplo {
int miembro1;
char miembro2[30];
} ejemp;
Punteros a estructuras
#include <string.h>
#include <stdio.h>
struct ejemplo {
int miembro1;
char miembro2[30];
};
main () {
struct ejemplo var1, *var2;
//var2 es un puntero a var1
var2 = &var1;
var1.miembro1 = 10;
strcpy(var1.miembro2, “Hola que Tal.”);
printf(”miembro 1: %d \t miembro 2: %s\n”, (*var2).miembro1, (*var2).miembro2);
//O lo que es equivalente y mas usual
printf(”miembro 1: %d \t miembro 2: %s\n”, var2->miembro1, var2->miembro2);
}
Nota: (*var2).miembro1 es equivalente a var2->miembro1
Asignar memoria para un puntero a estructura.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct ejemplo {
int miembro1;
char miembro2[30];
};
main () {
struct ejemplo *var1;
var1 = (struct ejemplo*)malloc( sizeof(struct ejemplo));
var1->miembro1 = 10;
strcpy(var1->miembro2, “Hola que Tal.”);
printf(”miembro 1: %d \t miembro 2: %s\n”, var1->miembro1, var1->miembro2);
}
Estructuras dentro de estructuras.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct ejemplo {
int miembro1;
char miembro2[30];
};
struct ejemplo2 {
struct ejemplo ej;
}
main () {
struct ejemplo2 var1, *var2;
var1.ej.miembro1 = 10;
strcpy(var1.ej.miembro2, “Hola que Tal.”);
printf(”miembro 1: %d \t miembro 2: %s\n”, var1.ej.miembro1, var1.ej.miembro2);
//var2 es puntero a var1
var2 = &var1;
printf(”miembro 1: %d \t miembro 2: %s\n”, var2->ej.miembro1, var2->ej.miembro2);
}
Espacio de memoria ocupado por una estructura.
#include <string.h>
#include <stdio.h>
struct ejemplo {
int miembro1;
int miembro2;
int miembro3;
char miembro4[30];
char miembro5[30];
};
main () {
struct ejemplo var1;
var1.miembro1 = 10;
printf(”Dirección de miembro 1: %u \t Dirección de miembro 2: %u \t Dirección de miembro 3: %u\n”, &var1.miembro1, &var1.miembro2, &var1.miembro3);
printf(”Dirección de miembro 4: %u \t Dirección de miembro 5: %u\n”, &var1.miembro4, &var1.miembro5);
}
Resultados
Dirección de miembro 1: 3219667864 Dirección de miembro 2: 3219667868 Dirección de miembro 3: 3219667872
Dirección de miembro 4: 3219667876 Dirección de miembro 5: 3219667906
Explicación: Las direcciones utilizadas por una estructura son continuas. En este caso tomo una dirección especifica 3219667864 para el comienzo de la misma, la dirección del primer miembro. Como los ints en mi implementación de C en Ubuntu tienen como tamaño 4 bytes, el segundo, tercer y cuarto miembro tienen las direcciones 3219667868, 3219667872, 3219667876 respectivamente. Como el cuarto miembro es un array de chars y los chars tiene tamaño de 1 byte, el quinto miembro tiene dirección 30 bytes luego del cuarto en 3219667906.
Referencias
The C Programming Language, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991
C & Data Structures, Deshpande, Kakde; Charles River Media, 2004
Autor: Emiliano Martínez Luque.


Deja un Comentario
Guía de los comentarios
Tu Email es requerido pero no sera publicado.
Podes usar los siguientes tags de HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>Si no comentastes antes tu comentario debera ser aprovado antes de que se lo muestre. Perdón, pero hay demasiado spam.