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: %sn", 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: %sn", 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: %sn", (*var2).miembro1, (*var2).miembro2);
	//O lo que es equivalente y mas usual
	printf("miembro 1: %d t miembro 2: %sn", 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: %sn", 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: %sn", var1.ej.miembro1, var1.ej.miembro2); 		

	//var2 es puntero a var1
	var2 = &var1;

	printf("miembro 1: %d t miembro 2: %sn", 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: %un", &var1.miembro1, &var1.miembro2, &var1.miembro3);
	printf("Dirección de miembro 4: %u t Dirección de miembro 5: %un", &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