O Operador Seta (->)
Parte da seção Logic & Flow do Journey de C da Coddy — lição 45 de 63.
Ao trabalhar com ponteiros para structs, acessar os membros da struct requer uma sintaxe especial. Embora você possa usar o operador de desreferência e a notação de ponto juntos, C fornece um operador mais conveniente especificamente para esse propósito: o operador de seta (->).
O operador de seta permite que você acesse membros de uma struct através de um ponteiro de uma forma limpa e legível:
ptr->memberIsso é equivalente a escrever (*ptr).member, mas muito mais conciso.
Veja como funciona na prática:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Usando o operador de seta
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Isso é o mesmo que:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);O operador de seta torna seu código mais limpo e fácil de ler, especialmente ao trabalhar com estruturas de dados complexas. É a forma padrão de acessar membros de struct através de ponteiros na programação C.
Desafio
FácilCrie um programa em C que demonstre o uso do operador de seta para acessar membros de uma struct através de ponteiros. Seu programa deve:
- Definir uma
structchamadaBookcom os seguintes membros:- Um inteiro
idpara armazenar o ID do livro - Um array de caracteres
titlecom tamanho 40 para armazenar o título do livro - Um array de caracteres
authorcom tamanho 30 para armazenar o nome do autor - Um float
pricepara armazenar o preço do livro - Um inteiro
pagespara armazenar o número de páginas
- Um inteiro
- Na função main, crie uma variável
BookchamadamyBook - Declare um ponteiro para uma struct
BookchamadobookPtr - Atribua o endereço de
myBookparabookPtr - Leia os seguintes valores de entrada e atribua-os aos membros da struct usando o operador de seta através do ponteiro:
- Leia um inteiro para o ID e atribua-o usando
bookPtr->id - Leia uma string para o título e atribua-a usando
bookPtr->title - Leia uma string para o autor e atribua-a usando
bookPtr->author - Leia um float para o preço e atribua-o usando
bookPtr->price - Leia um inteiro para as páginas e atribua-o usando
bookPtr->pages
- Leia um inteiro para o ID e atribua-o usando
- Após ler todos os valores, realize as seguintes operações usando o operador de seta:
- Aplique um desconto de 10% ao preço:
bookPtr->price = bookPtr->price * 0.9; - Adicione 50 páginas de bônus:
bookPtr->pages += 50;
- Aplique um desconto de 10% ao preço:
- Imprima as informações do livro usando o operador de seta para acessar cada membro neste formato exato:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Calcule e imprima o preço por página usando o operador de seta no formato:
Price per page: [price_per_page]
Este desafio testa sua compreensão do operador de seta para acessar membros de struct através de ponteiros. Você praticará o uso da sintaxe ptr->member tanto para leitura quanto para escrita em membros de struct, demonstrando que ela é equivalente a (*ptr).member, porém muito mais conveniente e legível.
Folha de consulta
O operador de seta (->) fornece uma maneira conveniente de acessar membros de uma struct através de um ponteiro:
ptr->memberIsso é equivalente a (*ptr).member, mas mais conciso e legível.
Exemplo de uso:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Usando o operador de seta
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Isso é o mesmo que:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Experimente você mesmo
#include <stdio.h>
#include <string.h>
// TODO: Defina a struct Book aqui
int main() {
// TODO: Crie uma variável Book chamada myBook
// TODO: Declare um ponteiro para Book chamado bookPtr
// TODO: Atribua o endereço de myBook ao bookPtr
// Ler valores de entrada
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: Atribua os valores de entrada aos membros da struct usando o operador seta
// TODO: Aplique 10% de desconto ao preço usando o operador seta
// TODO: Adicione 50 páginas de bônus usando o operador seta
// TODO: Imprima as informações do livro usando o operador seta
// TODO: Calcule e imprima o preço por página usando o operador seta
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos8Structs e Ponteiros
Ponteiros para StructsO Operador Seta (->)Passagem de Structs por ValorPassagem de Ponteiros para StructsAlocação Dinâmica de StructsRecapitulação: Modificando Struct - Ptr3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato