Structs
Na disciplina de Estrutura de Dados, aprendemos sobre structs, um recurso fundamental da linguagem C que permite agrupar diferentes tipos de dados sob um único nome, criando assim nossos próprios tipos de variáveis.
O que são Structs?
Structs (estruturas) são tipos de dados definidos pelo programador que permitem combinar variáveis de tipos diferentes em uma única unidade lógica. Enquanto arrays armazenam múltiplos valores do mesmo tipo, structs organizam dados relacionados de tipos diferentes.
- Permitem representar objetos complexos (como alunos, produtos, pessoas);
- Organizam dados relacionados de forma lógica;
- Criam novos tipos de dados personalizados;
- São a base para estruturas de dados mais complexas.
Por que usar Structs?
As structs trazem vários benefícios para a organização e manipulação de dados em programas complexos:
"Structs são como caixinhas que agrupam informações relacionadas, tornando o código mais legível e organizado."
- Organização: Mantém dados relacionados juntos;
- Clareza: Facilita a compreensão do que cada grupo representa;
- Reutilização: Permite criar múltiplas instâncias do mesmo tipo;
- Evolução: Abre caminho para estruturas mais complexas como listas e árvores.
Sintaxe Básica
A definição e uso de structs seguem uma sintaxe específica em C:
struct pessoa { int idade; float altura; char nome[50]; };
Podemos ainda usar typedef para criar um apelido para a struct:
typedef struct pessoa Pessoa;
Acesso aos Membros
Existem duas formas principais de acessar os campos de uma struct:
- Com variável normal: Usa-se o operador ponto (
.) - Com ponteiro: Usa-se o operador seta (
->)
Pessoa p; p.idade = 25; // Acesso direto
Pessoa *ptr = &p;
ptr->idade = 25; // Acesso via ponteiro
Structs Aninhadas
Podemos incluir uma struct dentro de outra para criar estruturas mais complexas:
struct endereco { char rua[50]; int numero; };
struct pessoa {
char nome[50];
struct endereco end;
};
O acesso aos campos aninhados segue a mesma lógica:
Pessoa p; p.end.numero = 100;
Passagem de Structs para Funções
Structs podem ser passadas para funções de duas formas principais:
- Por valor: Uma cópia da struct é passada (menos eficiente)
- Por referência (ponteiro): Passa-se apenas o endereço (mais eficiente)
// Por valor (cópia) void funcao(Pessoa p) { ... }
// Por referência (ponteiro)
void funcao(Pessoa *p) { ... }
Alocação Dinâmica com Structs
Podemos alocar structs dinamicamente usando ponteiros e funções como malloc:
Pessoa *p = (Pessoa*) malloc(sizeof(Pessoa)); p->idade = 30; free(p); // Não esquecer de liberar a memória!
Conclusão
As structs são uma ferramenta fundamental em C para organização de dados complexos. Seu domínio é essencial para o desenvolvimento de estruturas de dados mais avançadas e para a criação de programas bem organizados e eficientes. O conceito de structs também prepara o terreno para a programação orientada a objetos, onde a organização de dados atinge níveis ainda mais sofisticados.
Exemplo Completo
Veja um exemplo completo de uso de structs com todas as características discutidas:
#include <stdio.h> #include <stdlib.h>
typedef struct {
char rua[50];
int numero;
} Endereco;
typedef struct {
char nome[50];
int idade;
Endereco end;
} Pessoa;
void imprimirPessoa(Pessoa *p) {
printf("Nome: %s\nIdade: %d\nEndereço: %s, %d\n",
p->nome, p->idade, p->end.rua, p->end.numero);
}
int main() {
Pessoa p1 = {"João Silva", 25, {"Rua das Flores", 100}};
imprimirPessoa(&p1);
Pessoa *p2 = (Pessoa*) malloc(sizeof(Pessoa));
strcpy(p2->nome, "Maria Souza");
p2->idade = 30;
strcpy(p2->end.rua, "Avenida Central");
p2->end.numero = 500;
imprimirPessoa(p2);
free(p2);
return 0;
}