Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

O básico sobre tipo de dado struct foi visto em C Tipos de Dados: Struct. Nesta parte do tutoral vamos aprender a utilizar structs com funções, vetores e matrizes.

Os assuntos vetor/matriz podem ser vistos em C: Vetor/Matriz e C: Funções. O uso de ponteiro para struct pode ser visto em C Ponteiros: Ponteiro para struct

O tipo struct é um tipo de dado complexo que é composto de um ou mais membros de tipos de dados primitivos ou complexos diferentes .

A declaração de um tipo de dado complexo utilizando struct é feita da forma baixo:

Sintaxe
struct nome_struct
{
  tipo_dado nome_membro1;
  tipo_dado nome_membro2;
  tipo_dado nome_membroN;
};
Sintaxe

A declaração de uma variável do tipo struct é feito da seguinte forma:

struct nome_struct nome_variavel;
struct nome_struct nome_variavel = {valor_membro1, valor_membro2, valor_membroN};
struct nome_struct nome_variavel = {.nome_membro1 = nome_valor1, .nome_membro2 = valor2,.nome_membroN = valorN};

O corpo de uma struct é delimitado por "{" e "}" e seus membros são separados por (;) e podem ser iniciados ou não. Uma struct deve ser teminada utilizando (;).

O acesso aos membros de um struct é feita utilizando o operadore (.) seguido do nome do do membro como pode ver visto na sintaxe abaixo:

Sintaxe
variavel_struct.nome_membro;
Exemplo 1
#include <stdio.h>

struct teste
{
    int valor;
    char caracter;
};

int main()
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';
    printf("%d %c\n",variavel.valor,variavel.caracter);
}
Saída
10 A
            

O uso de struct como parâmetro de um função e a passagem como argumento, por valor, é semelhante aos outros exemplos de outros tipos de dados vistos.

Sintaxe
tipo_retorno nome_funcao(struct nome_struct nome_param)
{
  //corpo
}
Exemplo 2
#include <stdio.h>

struct teste
{
    int valor;
    char caracter;
};

void funcao(struct teste param)
{
      printf("%d %c\n",param.valor,param.caracter);
}

void main()
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';
    funcao(variavel);
}
Saída
10 A

A passagem de argumentos por referência, usando ponteiro, também são aplicados ao tipo de dado struct como parâmetro. Os membros de uma struct são acessados utilizando o operador (->). Esse assunto pode ser visto com mais detalhes em C Ponteiros: Struct.

Exemplo 3
#include <stdio.h>

struct teste
{
    int valor;
    char caracter;
};

void funcao(struct teste *param)
{
      printf("%d %c\n",param->valor,param->caracter);
}

void main()
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';
    funcao(&variavel);
}
Saída
10 A

O retorno do tipo de dado por uma função é feita da mesma forma utilizada como outros tipos de dados. Utilizamos a palavra reservada return seguido da uma variável do tipo struct.

Sintaxe
tipo_struct nome_funcao(parametros)
{
  //corpo omitido
   return variavel_tipo_struct;
}
Exemplo 3
#include <stdio.h>

struct teste
{
    int valor;
    char caracter;
};

struct teste funcao(void)
{
    struct teste variavel;
    variavel.valor = 10;
    variavel.caracter = 'A';
    return variavel;
}

void main()
{
    struct teste variavel = funcao();
    printf("%d %c\n",variavel.valor,variavel.caracter);;
}
Saída
10 A
            

O uso do tipo struct como matrizes ou vetores é feito da mesma forma que outros tipos de dados. Definimos suas dimensões utilizando []. O acesso aos seus elementos é utilizando seus índices ou linha e colunas.

Sintaxe
struct nome_struct vetor[dimensao] = {valores};
struct nome_struct vetor[dimensao];
struct nome_struct matriz[linhas][colunas] = {valores};
struct nome_struct vetor[linhas][colunas];
Exemplo 4
#include <stdio.h>

struct teste
{
    int valor;
    char caracter;
};

int main()
{
    struct teste var1;
    struct teste var2;
    
    var1.valor = 1;
    var1.caractere = 'A';
    
    var2.valor = 2;
    var2.caractere = 'B';
    
    struct teste vetor[2];
    vetor[0] = var1;
    vetor[1] = var2;
}
Saída
-

A linguagem C permite a declaração de structs aninhadas. Assim, podemos "agrupar" informações em nossos tipos de dados complexos.

Sintaxe
struct nome_struct {
 tipo_dado1 membro1;
 tipo_dado2 membro2;
     struct struct_aninhada
     {
       tipo_dado1 membro1;
       tipo_dado2 membro2;
     } nome_struct_aninhada;
};
Exemplo 5
#include <stdio.h>

struct Principal {
    int codigo;
    struct Aninhada {
        int codigo;
    }aninhada;
};

int main()
{
    struct Principal principal = { codigo: 1, aninhada:{2}};
    return 0;
}
Saída
-

Além do aninhamento de structs, podemos declarar structs compostas de structs tornando a leitura de struct aninhada mais simples e também reusar/segregar um tipo de dado complexo em outras structs.

Sintaxe
struct interna
{
  tipo_dado1 membro1;
  tipo_dado2 membro2;
};

struct pai
{
  tipo_dado1 membro1;
  struct interna filha; 
};
Exemplo 6
#include <stdio.h>

struct Aninhada {
        int codigo;
};
struct Principal {
    int codigo;
    struct Aninhada aninhada;
};

int main()
{
    struct Principal dado = { codigo: 1, aninhada:{codigo:2}};
    //struct Principal dado = { 1, {2}};
    
    printf("%d %d", dado.codigo,dado.aninhada.codigo);
    return 0;
}
Saída
1 2
  1. 05/05/2024 - revisão 4 - Adição de struct aninhada/composta
  2. 07/10/2024 - revisão 3 - Ajustes pontuais
  3. 30/08/2024 - revisão 2 - Correção em links de objetivos
  4. 29/09/2023 - revisão 1 - Correção em referências, erros gramaticais, sintaxe e remoção de texto lixo
  5. 19/05/2023 - versão inicial