Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

C Tipos Intermediário

Structs

Em C, uma struct agrupa variáveis de tipos diferentes em um único tipo composto. Cada campo tem nome e pode ser acessado com o operador ponto (.). É a base para representar entidades do mundo real, como um ponto, uma data ou um aluno.

O typedef cria um apelido para o tipo, evitando escrever struct Nome repetidamente. Já o operador seta (->) é usado quando temos um ponteiro para struct: ele desreferencia e acessa o campo numa única expressão.

Por fim, o compilador pode inserir padding (preenchimento) entre campos para alinhar os dados na memória. Isso faz com que sizeof(struct) possa ser maior que a soma dos tamanhos dos campos. Entender isso evita surpresas ao serializar ou calcular offsets.

Pontos-chave

  • struct define um tipo composto com campos nomeados.
  • typedef cria um alias, simplificando a declaração de variáveis.
  • Use -> para acessar campos através de um ponteiro para struct.
  • O padding alinha campos na memória e pode aumentar sizeof.
  • A ordem dos campos influencia o tamanho total da struct.
structs.c
#include <stdio.h>
#include <string.h>

typedef struct {
    int id;
    char nome[20];
    float nota;
} Aluno;

void imprime(const Aluno *a) {
    printf("ID: %d | Nome: %s | Nota: %.1f\n", a->id, a->nome, a->nota);
}

int main(void) {
    Aluno a1 = {1, "Ana", 9.5};
    Aluno a2;
    a2.id = 2;
    strcpy(a2.nome, "Bruno");
    a2.nota = 7.0;

    imprime(&a1);
    imprime(&a2);

    printf("sizeof(Aluno) = %zu bytes\n", sizeof(Aluno));
    return 0;
}

Exercícios

  1. 1
    Fácil

    Criando e imprimindo uma struct

    Defina uma struct chamada Ponto com dois campos int x e int y. No main, crie uma variável Ponto p = {3, 4} e imprima os valores no formato (x, y).

    Resolver
  2. 2
    Médio

    Ponteiro para struct e operador seta

    Usando typedef, crie o tipo Aluno com int id, char nome[20] e float nota. No main, crie um Aluno, preencha os campos e passe seu endereço para uma função void imprime(const Aluno *a) que usa -> para imprimir ID: X | Nome: Y | Nota: Z com uma casa decimal.

    Resolver
  3. 3
    Desafio

    Padding e tamanho de struct

    Crie duas structs com os mesmos campos, mas em ordens diferentes: A com char c; int i; char d; e B com int i; char c; char d;. Imprima sizeof(A) e sizeof(B) e explique a diferença causada pelo padding. Use typedef para ambas.

    Resolver

Continue estudando