Estruturas em linguagem C

Estruturas em linguagem C

Uma Estrutura (Structure) em C é uma coleção de variáveis relacionadas, usando um nome comum. As estruturas em linguagem C podem conter variáveis de tipos diferentes de dados, ao contrário de um array, que só pode conter dados de um mesmo tipo.

As estruturas são usadas para definir registros que são armazenados em arquivos, e, juntamente com os ponteiros, simplificam a criação de estruturas de dados mais complexas, como por exemplo pilhas, listas ligadas, filas e árvores.

Definindo um modelo de Estrutura

As estruturas são um tipo de dados derivado, o que significa que são construídas com o uso de objetos de outros tipos existentes. Definimos um modelo de estrutura da forma como mostra a sintaxe seguinte:

struct identificador {
 tipo variável;
 tipo variável;
 tipo variável;
 tipo variável;
};

O exemplo a seguir mostra a definição de uma estrutura de nome endereco, contendo os membros rua, numero, CEP e bairro:

struct endereco {
 char *rua;
 char *numero;
 char *CEP;
 char *bairro;
};

A palavra-chave struct inicia o bloco de definição da estruturas. Logo após vem o nome que desejamos atribuir a ela (tag da estrutura), e então são abertas chaves { para iniciar a seção do corpo da estrutura.

A figura a seguir ilustra a , com suas variáveis-membro:

estrutura endereco na memória do sistema

Fig. 1: Estrutura endereco na memória do sistema

No corpo da estrutura são definidas as variáveis (membros) do tipo structure, cada uma com seu próprio nome, sem repetições, e que podem ser de qualquer tipo básico de dados (int, float, char, etc.), ou ainda tipos de dados agregados, como arrays ou até mesmo outras estruturas - desde que não contenha uma instância de si mesma. É comum chamar os membros de elementos ou ainda campos.

Ao definirmos uma estrutura com um código como o mostrado acima, um novo tipo de dados será criado e poderá ser utilizado para declarar variáveis, sem no entanto ocupar espaço na memória ainda.

Declarando variáveis do tipo estrutura

Declaramos variáveis de um tipo estrutura da mesma forma que declaramos variáveis de outros tipos quaisquer. Por exemplo, vamos declarar a variável x para que seja do tipo struct endereco com a declaração a seguir:

struct endereco x;

Operações em estruturas

Podemos realizar algumas operações em estruturas, listadas a seguir:

  • Atribuir uma variável estrutura a outra variável estrutura do mesmo tipo
  • Ler o endereço de uma variável estrutura
  • Acessar os membros da estrutura
  • Determinar o tamanho da estrutura com o operador sizeof.

Inicialização de estruturas

As estruturas podem ser inicializadas de várias formas:

1 - Usando uma lista de inicialização, como um array. Por exemplo, podemos inicializar a estrutura endereco usando a declaração a seguir:

struct endereco x = {"Av. Paulista", "1029", "05560-034", "Cerqueira César"};

Os elementos do array são passados aos membros da estrutura na ordem em que foram declarados.

2 - Atribuindo uma variável estrutura do mesmo tipo, já inicializada

3 - Atribuindo valores aos membros individuais da estrutura. Por exemplo, suponha que desejamos atribuir o valor "Av. Atlântica" ao membro rua da estrutura endereco. Podemos usar a declaração a seguir:

endereco.rua = "Av. Atlântica";

Acessando os Membros de uma Estrutura

Usamos dois operadores para acessar os membros de uma estrutura: 

  • Operador de membro de estrutura . (operador ponto)
  • Operador de Ponteiro de estrutura -> (operador seta)

Acessamos um membro de uma estrutura usando o operador ponto por meio do nome da estrutura, seguido por um ponto e pelo nome do membro que se quer acessar. Por exemplo, podemos acessar e visualizar o membro rua da estrutura x (endereco) usando a seguinte declaração:

printf("%s", x.rua);

Já com o operador de ponteiro de estrutura, o acesso é feito via um ponteiro para a estrutura. Por exemplo, suponha que um ponteiro xptr tenha sido declarado e aponte para a estrutura endereco, e que o endereço de uma estrutura x tenha sido atribuído ao ponteiro xprt. Para acessar o membro rua da estrutura endereco via operador de ponteiro usamos a declaração a seguir:

printf("%s", x->rua);

A instrução typedef

A instrução typedef permite criar aliases (apelidos / sinônimos) para tipos de dados definidos previamente. É muito comum usarmos typedef para definir nomes de tipos estrutura, pois assim conseguimos usar nomes mais curtos ao usar as estruturas no programa. Veja o exemplo a seguir:

typedef struct endereco Endereco;

Essa instrução define o tipo de nome Endereco  como sendo um sinônimo do tipo struct endereco. Também é possível usar typedef diretamente na declaração da estrutura, dispensando a necessidade de criar uma tag, como no exemplo a seguir:

typedef struct {
 char *rua;
 char *numero;
 char *CEP;
 char *bairro;
} Endereco;

Desta forma, podemos usar a palavra Endereco para declarar variáveis do tipo estrutura endereco que usamos anteriormente, como segue:

Endereco x;

Também podemos criar um array de estruturas:

Endereco x[20];

Neste caso, foi criado um array de nome x, contendo 20 estruturas do tipo Endereco.

Exemplo

No exemplo a seguir é declarada um modelo de estrutura de nome Endereco, usando a instrução typedef, e no código principal esse modelo é usado para declarar uma estrutura "x", do tipo Endereco, a qual é inicializada na sequência.

O conteúdo de cada membro da estrutura é então mostrado na tela com o uso da instrução printf():

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

typedef struct {
 char rua[40];
 char numero[5];
 char CEP[10];
 char bairro[30];
} Endereco;

int main()
{
 setlocale(LC_ALL,"");

 Endereco x = {"Av. Paulista", "1029", "05560-034", "Cerqueira César"};
 printf("%s\n", x.rua);
 printf("%s\n", x.numero);
 printf("%s\n", x.CEP);
 printf("%s\n", x.bairro);

 return 0;
}

A imagem a seguir mostra o resultado da execução deste programa:

Exemplo de estruturas em linguagem C

É isso aí! Na próxima lição vamos nos aprofundar no assunto de estruturas em linguagem C. Até!

 

Sobre Fábio dos Reis (1193 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Astronomia, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*