Veja: 		http://www.ead.eee.ufmg.br/cursos/C/

Estruturas

Uma estrutura agrega diversas variáveis (de tipos distintos) numa só - formando um novo tipo de dados

Criando

Para se criar uma estrutura usa-se o comando struct. Sua forma geral é: 

struct nome_do_tipo_da_estrutura 
{ 
tipo_1 nome_1; 
tipo_2 nome_2; 
... 
tipo_n nome_n; 
} variáveis_estrutura; 

Exemplo: Vamos criar uma estrutura de endereço: 

struct tipo_endereco
{
        char rua [50];
        int numero;
        char bairro [20];
        char cidade [30];
        char sigla_estado [3];
        long int CEP;
};

Vamos agora criar uma estrutura chamada ficha_pessoal com os dados pessoais de uma pessoa: 

struct ficha_pessoal
{
        char nome [50];
        long int telefone;
        struct tipo_endereco endereco;
};

Usando

Vamos agora utilizar as estruturas declaradas na seção anterior para escrever um programa que preencha uma ficha. 

#include <stdio.h>
#include <string.h>

struct tipo_endereco
{
        char rua [50];
        int numero;
        char bairro [20];
        char cidade [30];
        char sigla_estado [3];
        long int CEP;
};

struct ficha_pessoal
{
        char nome [50];
        long int telefone;
        struct tipo_endereco endereco;
};

main ()
{
	struct ficha_pessoal ficha;

	strcpy (ficha.nome,"Luiz Osvaldo Silva");
	ficha.telefone=4921234;
	strcpy (ficha.endereco.rua,"Rua das Flores");
	ficha.endereco.numero=10;
	strcpy (ficha.endereco.bairro,"Cidade Velha");
	strcpy (ficha.endereco.cidade,"Belo Horizonte");
	strcpy (ficha.endereco.sigla_estado,"MG");
	ficha.endereco.CEP=31340230;

	return 0;
}

O programa declara uma variável ficha do tipo ficha_pessoal e preenche os seus dados. O exemplo mostra como podemos acessar um elemento de uma estrutura: basta usar o ponto (.). Por exemplo, para acessar o campo telefone de ficha, escrevemos:

	ficha.telefone = 4921234;		/* atribuicao */

Como a struct ficha pessoal possui um campo, endereco, que também é uma struct, podemos fazer acesso aos campos desta struct interna da seguinte maneira:

ficha.endereco.numero = 10;
ficha.endereco.CEP=31340230;

Desta forma, estamos acessando, primeiramente, o campo endereco da struct ficha e, dentro deste campo, estamos acessando o campo numero e o campo CEP.

A função strcpy possui a sintaxe:

	strcpy (strdest, strorigem)

e copia o conteúdo da string apontada por strorigem para a string apontada por strdest.

Arrays de estruturas

Um estrutura é como qualquer outro tipo de dado no C. Podemos, portanto, criar arrays de estruturas. Vamos ver como ficaria a declaração de um vetor de 100 fichas pessoais: 

struct ficha_pessoal fichas [100];

Poderíamos então acessar a segunda letra da sigla de estado da décima terceira ficha fazendo: 

fichas[12].endereco.sigla_estado[1];

Ponteiros

Podemos ter um ponteiro para uma estrutura. Vamos ver como poderia ser declarado um ponteiro para as estruturas de ficha que estamos usando nestas seções: 

struct ficha_pessoal *p;

Os ponteiros para uma estrutura funcionam como os ponteiros para qualquer outro tipo de dados no C. Para usá-lo, basta apontá-lo para uma variável struct (ou para um array struct) já existente, das seguintes maneiras:

struct ficha_pessoal ficha;
struct ficha_pessoal fichario[100];
struct ficha_pessoal *p1, *p2;

p1 = &ficha;	 
p2 = &fichario[5]; 

Na primeira atribuicao (p1 = &ficha), o ponteiro p1 aponta para a variável ficha. 

Na segunda atribuição (p2 = &fichario[5]), o ponteiro p2 aponta para o 6o elemento do array fichario - que corresponde à 6a ficha pessoal. Lembre-se que os índices de arrays em C começam em 0, por isso temos a 6a ficha (e nao a 5a).

Para acessar um elemento da estrutura utilizando o ponteiro (por exemplo, p1), podemos fazer:

(*p1).nome

Os parênteses são necessários, porque o operador . tem precedência maior que o operador * . Porém, este formato não é muito usado. O que é comum de se fazer é acessar o elemento nome através do operador seta, que é formado por um sinal de "menos" (-) seguido por um sinal de "maior que" (>), isto é: -> . Assim faremos:
 
p1->nome

A declaração acima é muito mais fácil e concisa. Para acessarmos o elemento CEP dentro de endereco faríamos: 

p1->endereco.CEP

O Comando Typedef

O comando typedef permite ao programador definir um novo nome para um determinado tipo. Sua forma geral é: 

typedef antigo_nome novo_nome; 

Como exemplo vamos dar o nome de inteiro para o tipo int: 

typedef int inteiro;

Agora podemos declarar o tipo inteiro: 

inteiro n, i, j;

O comando typedef também pode ser utilizado para dar nome a estruturas. As estruturas criadas nos exemplos acima poderiam ser definidas como tipos através do comando typedef. O exemplo ficaria: 

#include <stdio.h> 

typedef struct tipo_endereco 
{ 
	char rua [50]; 
	int numero; 
	char bairro [20]; 
	char cidade [30]; 
	char sigla_estado [3]; 
	long int CEP; 
} TEndereco; 

typedef struct ficha_pessoal { 
	char nome [50]; 
	long int telefone; 
	TEndereco endereco; 
}TFicha; 

void main(void) 
{ 
	TFicha ficha;
	TFicha fichario[100];
	TFicha *p1, *p2;
	... 
} 

Veja que não é mais necessário usar a palavra chave struct para declarar variáveis do tipo ficha pessoal. Basta agora usar o novo tipo definido TFicha.