Struct e typedef


Neste post veremos como utilizar e ver alguns exemplos de struct (Geralmente livros em português chamam de registro) e como utilizar o typedef .

Registros (struct):

Os tipos de dados fundamentais do C são dados homogêneos(int, float, char, etc), com struct o programador pode combinar esses tipos fundamentais para criar novos tipos. Sua forma de utilização é a seguinte:

struct IDENTIFICADOR{
    lista de dados fundamentais;
}Nome_da_variavel;

IDENTIFICADOR: Não da pra ser mais claro, é um nome que identifica o tipo de registro que você está criando. É isso.

Nome_da_variavel: Este campo é opcional, ele associa uma variável ao tipo de registro que você criou.

Exemplos de struct:

struct nome{
    int a;
    float b;
    char c;
};
/* Neste caso struct nome passa a ser um tipo de dados, abaixo vemos a declaração de uma variável deste tipo */
 
struct nome var;
struct {
    int a;
    float b;
    char c;
}var;
 
/* Neste caso a struct não tem identificação, no entanto a variável var já está associada a este tipo, a desvantagem deste tipo de declaração é não poder ter mais variáveis deste tipo */
struct nome{
    int a;
    int b;
    int c;
}var1
 
/* Neste caso a variável var1 é associada a struct, mas como a struct possui identificador é possível declarar mais variáveis deste tipo */
 
struct nome var2;

Acessando campos de uma struct:

Existem duas formas de acessar campos de uma struct, cada uma é usada em uma situação diferente. A primeira delas é o “.”, este operador é usado quando a variável em questão é alocada pelo compilador. Vamos supor a seguinte struct:

struct nome{
    int a;
    float b;
};

Agora vamos declarar uma variável associada a ela:

struct nome var;

Como var foi alocada pelo compilador podemos acessar seus elementos assim:

var.a = 2;
var.b = 3.2;

Aqui vai um pequeno exemplo do uso do operador “.”:

#include <stdio.h>
 
struct nome{
    int a;
    float b;
};
 
int main(void)
{
    struct nome var;
 
    var.a = 2;
    var.b = 3.5;
 
    printf("%d\n",var.a);
    printf("%f\n",var.b);
 
    return 0;
}

Quando há um ponteiro apontando para um registro se usa o operador “->”. Exemplo:

#include <stdio.h>
 
struct nome{
    int a;
    float b;
};
 
int main(void)
{
    struct nome *var; /* Ponteiro para o registro */
 
    var = (struct nome *)malloc(sizeof(struct nome)); /* Aloca espaço para a estrutura e retorna o endereço de memória para o ponteiro */
 
    var->a = 2;
    var->b = 3.5;
 
    printf("%d\n",var->a);
    printf("%f\n",var->b);
 
    return 0;
}

Obviamente as duas formas são importantes, aqui vai um trecho de código em que uma estrutura é tratada de ambas as formas:

#include <stdio.h>
 
struct nome{
    int a;
    float b;
};
 
void mudaValores(struct nome *v, int a, float b)
{
    v->a = a;
    v->b = b;
 
    printf("%d\n",v->a);
    printf("%.2f\n",v->b);
}
 
int main(void)
{
    struct nome var; /* Ponteiro para o registro */
 
    var.a = 2;
    var.b = 3.5;
 
    printf("%d\n",var.a);
    printf("%.2f\n\n",var.b);
 
    mudaValores(&var,21,43.2);
 
    return 0;
}

Uma estrutura pode conter qualquer tipo de dados, inclusive outra estrutura. Veja um exemplo:

struct nome1{
    int a;
    int b;
};
 
struct nome2{
    int c;
    struct nome1 d;
};

Para acessar os elementos da estrutura interna usam-se os mesmos operadores, exemplos:

struct nome1 var1;
struct nome1 *var2
 
var1.d.a = 2;
var2->d.a = 2; /* Supondo que var2 já esteja alocada */

Uma estrutura não pode conter um elemento do próprio tipo, no entanto ela pode conter um ponteiro para um elemento do seu próprio tipo.
Permitido:

struct nome{
    int a;
    struct nome *p;
};

Não permitido:

struct nome{
    int a;
    struct nome p;
};

Typedef:

O comando typedef serve para renomear um tipo de dado, seja ele fundamental (int, float, etc) ou criado por você (uma estrutura ou um tipo criado por outro typedef).
Sua utilização é bastante simples:

typedef tipo novo_nome;

Um exemplo bem simples é a tradução dos tipos para o portugûes:

typedef int inteiro;
typedef float real;
 
inteiro a;
real b;

Typedef é muito utilizado em conjunto com struct:

#include <stdio.h>
 
struct _Data
{
    int dia;
    int mes;
    int ano;
};
 
typedef struct _Data data;
 
int main(void)
{
    data nasc;
 
    nasc.dia = 31;
    nasc.mes = 5;
    nasc.ano = 1989;
 
    return 0;
}

Outra forma de utilizar typedef e struct em conjunto:

#include <stdio.h>
 
typedef struct
{
    int dia;
    int mes;
    int ano;
}data;
 
int main(void)
{
    data nasc;
 
    nasc.dia = 31;
    nasc.mes = 5;
    nasc.ano = 1989;
 
    return 0;
}

Leave a Reply