Carregando
0xC0Lição 13 de 20

Structs: os seus próprios tipos

Agrupe valores relacionados num único tipo com struct, dê um nome a ele com typedef e acesse por ponteiros com ->.

14 min Questionário com 5 perguntas 2 exercícios de código
Ao final desta lição, você saberá
  • Definir uma struct e criar valores dela
  • Dar nome a tipos struct com typedef
  • Acessar membros por meio de um ponteiro com ->

Os dados reais vêm em pacotes: um ponto tem um x e um y; um aluno tem um nome, uma matrícula e uma nota. Uma struct agrupa vários valores - os seus membros - num único tipo novo, para você poder passar o pacote adiante como uma coisa só.

point.c
1#include <stdio.h>
2
3struct Point {
4    int x;
5    int y;
6};
7
8int main(void) {
9    struct Point p = {3, 4};
10    p.x = p.x + 10;
11    printf("(%d, %d)\n", p.x, p.y);
12    return 0;
13}
Saída
(13, 4)

A definição cria um tipo chamado struct Point; ela não cria nenhuma variável. struct Point p = {3, 4}; então cria uma, com os membros inicializados em ordem. O operador ponto acessa um membro: p.x. Você também pode nomear os membros no inicializador, o que fica mais claro: struct Point p = {.x = 3, .y = 4};.

typedef

Escrever struct em todo lugar cansa. O typedef dá um nome mais curto a um tipo:

student.c
1#include <stdio.h>
2
3typedef struct {
4    char name[32];
5    int id;
6    double gpa;
7} Student;
8
9int main(void) {
10    Student s = {.name = "Grace", .id = 1906, .gpa = 3.9};
11    printf("%s (#%d): %.1f\n", s.name, s.id, s.gpa);
12    return 0;
13}
Saída
Grace (#1906): 3.9

Structs e funções

As structs são passadas por valor como qualquer outra variável: a função recebe uma cópia da struct inteira. Isso não tem problema para structs pequenas, mas para as grandes - ou quando a função precisa modificar o original - passe um ponteiro. O C tem um operador especial para membros por meio de um ponteiro: p->x significa (*p).x.

bank.c
1#include <stdio.h>
2
3typedef struct {
4    char owner[32];
5    long balance_cents;
6} Account;
7
8void deposit(Account *account, long cents) {
9    account->balance_cents += cents;
10}
11
12void print_account(const Account *account) {
13    printf("%s: $%ld.%02ld\n", account->owner,
14           account->balance_cents / 100, account->balance_cents % 100);
15}
16
17int main(void) {
18    Account a = {.owner = "Linus", .balance_cents = 1050};
19    deposit(&a, 275);
20    print_account(&a);
21    return 0;
22}
Saída
Linus: $13.25

Arrays de structs

As structs combinam naturalmente com arrays - um array de Student é um banco de dados minúsculo. Percorra-o como qualquer outro array e use . em cada elemento: students[i].gpa.

Principais conclusões

  • Uma struct agrupa membros relacionados num único tipo; o typedef dá a ela um nome conveniente.

  • Use . numa struct e -> por meio de um ponteiro para uma struct (p->x é (*p).x).

  • As structs são copiadas ao serem passadas; passe T * para modificar e const T * para ler structs grandes sem custo.

Quiz da aula

5 perguntas · aprovação com 4 acertos · até 50 XP

Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.

Pratique: escreva código em C

Estes exercícios rodam de verdade. Escreva o programa, clique em “Executar testes” e leia o que o compilador informa: aprender a ler as mensagens do compilador é metade do aprendizado de C.

Exercício 1

Distância entre pontos

+25 XP

Defina um tipo Point com os membros double x e y e escreva double distance(Point a, Point b), que devolve a distância em linha reta, sqrt((ax - bx)² + (ay - by)²). Leia quatro números (x1 y1 x2 y2) e imprima a distância com 2 casas decimais.

Para 0 0 3 4, imprima 5.00.

  • Triângulo 3-4-5
  • Mesmo ponto
  • Coordenadas negativas
main.c
Carregando editor…

Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.

Exercício 2

O melhor da turma

+25 XP

A entrada começa com uma quantidade n (no máximo 50) e depois n linhas de name score. Guarde-as num array de uma struct Student e imprima o nome e a nota do aluno com a maior nota (em caso de empate, vence o primeiro):

Top: Ada 97
  • Três alunos
  • O empate mantém o primeiro
main.c
Carregando editor…

Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.

Dúvidas sobre esta lição

Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.

Carregando publicações…