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; }