Médio C

Ponteiro para struct e operador seta

Enunciado

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.

Requisitos

  • Definir typedef struct { ... } Aluno;.
  • A função imprime recebe const Aluno * e usa ->.
  • Imprimir no formato ID: 1 | Nome: Ana | Nota: 9.5.

Código inicial

#include <stdio.h>
#include <string.h>

// Defina o typedef Aluno aqui

// Implemente imprime

int main(void) {
    // Crie o aluno e chame imprime
    return 0;
}

Saída esperada

ID: 1 | Nome: Ana | Nota: 9.5
Ver dica

Dentro de imprime, a->id é equivalente a (*a).id.

Mostrar solução
#include <stdio.h>
#include <string.h>

// typedef cria o alias Aluno para a struct anônima
typedef struct {
    int id;
    char nome[20];
    float nota;
} Aluno;

// Recebe ponteiro constante: não modifica o aluno apontado
void imprime(const Aluno *a) {
    // -> desreferencia e acessa o campo
    printf("ID: %d | Nome: %s | Nota: %.1f\n", a->id, a->nome, a->nota);
}

int main(void) {
    Aluno a;
    a.id = 1;
    // strcpy copia a string para o array de char
    strcpy(a.nome, "Ana");
    a.nota = 9.5f;

    // Passa o endereço da struct
    imprime(&a);
    return 0;
}

Passo a passo

  1. typedef struct { ... } Aluno; define a struct e já cria o apelido Aluno, evitando escrever struct Aluno.
  2. void imprime(const Aluno *a) recebe um ponteiro; const promete não alterar os dados apontados.
  3. a->id é açúcar sintático para (*a).id: primeiro desreferencia, depois acessa o campo.
  4. No main, a.id = 1 e strcpy(a.nome, "Ana") preenchem os campos; arrays de char não aceitam atribuição direta.
  5. imprime(&a) passa o endereço da variável local para a função.

Por que funciona

O operador -> combina desreferência e acesso ao campo, sendo obrigatório quando temos um ponteiro para struct. O typedef deixa o código mais limpo e o const documenta que a função é somente leitura.

Erros comuns

  • Fazer a.nome = "Ana"; gera erro de compilação: arrays não são atribuíveis. Use strcpy.
  • Esquecer o & na chamada: imprime(a) passa uma cópia e o compilador reclama de tipo incompatível.
  • Usar a->id no main quando a não é ponteiro: erro de compilação. Use a.id.

Outra forma de resolver

Passar a struct por valor (void imprime(Aluno a)) funciona, mas copia todos os bytes; para structs grandes, o ponteiro é mais eficiente.

Saída esperada

ID: 1 | Nome: Ana | Nota: 9.5