Já vimos em nosso curso de programação C como criar nosso tipo de dado com typedef struct e preenche-lo com informações lidas do teclado. Nesta aula veremos que é possível ter uma STRUCT dentro de outra STRUCT, deixando as informações ainda mais organizadas.
Imagine que agora queremos também salvar a data de nascimento do usuário. Poderíamos incluir mais três inteiros dentro do nosso tipo Pessoa, um para o dia, um para o mês e outro para o ano. Contudo, quanto mais organizados os dados estiverem melhor. Então, uma outra opção é criar um novo tipo para data, assim:
// tipo data de nascimento typedef struct{ int dia, mes, ano; }DataNas;
Tendo agora um tipo data, podemos incluir esse tipo dentro do nosso tipo Pessoa, assim:
// tipo pessoa agora com uma data de nascimento typedef struct{ DataNas dataNas; int idade; char sexo; char nome[100]; }Pessoa;
Um ponto importante a ser observado é que apenas podemos usar um tipo depois dele ser criado. Isso significa que, se colocarmos o tipo data abaixo do tipo pessoa nós teremos um erro ao tentar compilar nosso código.
Código de exemplo em C para struct de struct
#include <stdio.h> #include <stdlib.h> /* Aula 169: Posso ter struct de struct? Escrito por Wagner Gaspar Abril de 2021 */ typedef struct{ int dia, mes, ano; }DataNas; typedef struct{ DataNas dataNas; int idade; char sexo; char nome[100]; }Pessoa; int main() { Pessoa pessoa; printf("Digite se nome: "); fgets(pessoa.nome, 100, stdin); printf("Digite sua idade: "); scanf("%d", &pessoa.idade); scanf("%c"); printf("Digite f ou m para o sexo:"); scanf("%c", &pessoa.sexo); // leitura do novo campo data de nascimento printf("Digite sua data de nascimento no formato dd mm aaaa:"); scanf("%d%d%d", &pessoa.dataNas.dia, &pessoa.dataNas.mes, &pessoa.dataNas.ano); printf("Nome: %s\nIdade: %d\nSexo: %c\n", pessoa.nome, pessoa.idade, pessoa.sexo); printf("Data de nas.: %d/%d/%d\n", pessoa.dataNas.dia, pessoa.dataNas.mes, pessoa.dataNas.ano); return 0; }