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[50];
 char numero[5];
 char CEP[8];
 char bairro[30];
};

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. Note que nenhuma variável é realmente declarada com este comando – apenas definimos o formato dos dados da estrutura; basicamente, um tipo complexo de variável.

A figura a seguir ilustra a estrutura endereco, 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;

Também é possível declarar uma ou mais variáveis durante a definição da própria estrutura. Por exemplo, podemos declarar três variáveis de nomes livro1, livro2 e livro3 a partir de uma estrutura de nome livro:

struct livro {
  char nome[30];
  char autor[50];
  int paginas;
  float preco;
} livro1, livro2, livro3;

Caso apenas uma variável do tipo estrutura seja necessária no programa, não precisamos  declarar um identificador, bastando definir o nome da variável que será criada. Por exemplo, podemos criar uma variável estrutura chamada livro da seguinte forma:

struct {
  char nome[30];
  char autor[50];
  int paginas;
  float preco;
} livro;

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, referenciando o nome da variável estrutura, seguida por um ponto e pelo nome do membro (campo) que receberá a atribuição do dado:

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[40];
 char numero[5];
 char CEP[10];
 char bairro[30];
} 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 (1192 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

2 Comentários em Estruturas em linguagem C

  1. Em primeiro lugar parabéns pelo trabalho que faz!
    Eu tenho uma dúvida, que acredito que possa talvez estar errado em seu artigo.
    Como sou aprendiz posso não estar conseguindo fazer.

    Você informa no artigo o seguinte:
    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, referenciando o nome da variável estrutura, seguida por um ponto e pelo nome do membro (campo) que receberá a atribuição do dado:

    endereco.rua = “Av. Atlântica”;

    Porém de nenhuma forma eu consegui fazer essa linha funcionar, logo não sei se é um erro do artigo ou alguma coisa que eu não entendi em sua explicação, ou alguma coisa que tenha faltado para isso funcionar!
    Tentei o código abaixo

    // O gcc dá o erro abaixo e não compila!
    #include
    int main(){
    typedef struct{
    char rua[40];
    } endereco;

    endereco.rua = “Av. Atlântica”; // ERROR: expected identifier or ‘(’ before ‘.’ token endereco.rua = “Av. Atlântica”
    }

    Pode me ajudar?

  2. Gostou de aprender I stalar programas

Escreva um comentário

Seu e-mail não será divulgado


*