Estruturas em C são coleções de valores denominados variáveis membros. Cada membro pode ter um tipo distinto, permitindo a composição de objetos complexos a partir de tipos internos como char, short, int, long long, float e double.
Para representar entidades como pessoas (com nome, telefone, sexo e altura) ou livros (com título, autor, preço e ISBN), utiliza-se estruturas.
Definição e Sintaxe:
struct nome_etiqueta
{
declarações de membros
} variáveis_opcionais;
Exemplo de declaração:
struct Pessoa
{
char nome_completo[25];
char contato_telefonico[14];
char genero[6];
int estatura_cm;
} individuo1, individuo2; // Variáveis globais, prática desaconselhada
Criação de Instâncias:
struct Pessoa // Definição do tipo estrutura (modelo)
{
char nome_completo[25];
char contato_telefonico[14];
char genero[6];
int estatura_cm;
};
int main()
{
struct Pessoa individuo1 = { 0 }; // Instanciação com alocação de memória
return 0;
}
Tipos de Membros:
Membros podem ser escalares, arrays, ponteiros ou outras estruturas.
struct Pessoa
{
char nome_completo[25];
char contato_telefonico[14];
char genero[6];
int estatura_cm;
};
struct Estudante
{
struct Pessoa dados_pessoais;
int matricula;
float media_notas;
};
Inicialização:
struct Pessoa
{
char nome_completo[25];
char contato_telefonico[14];
char genero[6];
int estatura_cm;
};
struct Estudante
{
struct Pessoa dados_pessoais;
int matricula;
float media_notas;
};
int main()
{
struct Pessoa individuo1 = { "Ana Silva", "991234567", "Feminino", 165 };
struct Estudante aluno1 = { {"Carlos Souza", "988765432", "Masculino", 178}, 1001, 7.8f};
return 0;
}
Exibição de Dados:
printf("Nome: %s, Telefone: %s, Gênero: %s, Altura: %d cm\n",
individuo1.nome_completo, individuo1.contato_telefonico,
individuo1.genero, individuo1.estatura_cm);
printf("Nome: %s, Telefone: %s, Gênero: %s, Altura: %d cm, Matrícula: %d, Média: %.2f\n",
aluno1.dados_pessoais.nome_completo, aluno1.dados_pessoais.contato_telefonico,
aluno1.dados_pessoais.genero, aluno1.dados_pessoais.estatura_cm,
aluno1.matricula, aluno1.media_notas);
Acesso aos Membros:
Utiliza-se o operador ponto (.) para variáveis e seta (->) para ponteiros.
struct Pessoa
{
char nome_completo[25];
char contato_telefonico[14];
char genero[6];
int estatura_cm;
};
void exibir_dados_var(struct Pessoa p)
{
printf("Nome: %s, Telefone: %s, Gênero: %s, Altura: %d cm\n",
p.nome_completo, p.contato_telefonico, p.genero, p.estatura_cm);
}
void exibir_dados_ptr(struct Pessoa* p_ptr)
{
printf("Nome: %s, Telefone: %s, Gênero: %s, Altura: %d cm\n",
p_ptr->nome_completo, p_ptr->contato_telefonico,
p_ptr->genero, p_ptr->estatura_cm);
}
int main()
{
struct Pessoa individuo1 = { "Maria Oliveira", "912345678", "Feminino", 172 };
exibir_dados_var(individuo1);
exibir_dados_ptr(&individuo1);
return 0;
}
Passagem como Parâmetro:
Entre as funções exibir_dados_var e exibir_dados_ptr, a segunda é preferível. Quando se passa uma estrutura inteira por valor, cópias são feitas, o que pode gerar sobercarga significativa para estruturas grandes. Portanto, recomenda-se passar ponteiros para estruturas como argumentos em funções.