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
imprimerecebeconst 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
typedef struct { ... } Aluno;define a struct e já cria o apelidoAluno, evitando escreverstruct Aluno.void imprime(const Aluno *a)recebe um ponteiro;constpromete não alterar os dados apontados.a->idé açúcar sintático para(*a).id: primeiro desreferencia, depois acessa o campo.- No
main,a.id = 1estrcpy(a.nome, "Ana")preenchem os campos; arrays de char não aceitam atribuição direta. 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. Usestrcpy. - Esquecer o
&na chamada:imprime(a)passa uma cópia e o compilador reclama de tipo incompatível. - Usar
a->idnomainquandoanão é ponteiro: erro de compilação. Usea.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