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 ->.
- Definir uma
structe 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ó.
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}(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:
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}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.
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}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
structagrupa membros relacionados num único tipo; otypedefdá 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 econst 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.
Distância entre pontos
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
Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.
O melhor da turma
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
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…