Ponteiros para Structs
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 44 de 63.
Agora que você já está confortável trabalhando com structs, é hora de combiná-las com outro conceito poderoso de C: ponteiros. Assim como você pode criar ponteiros para tipos de dados básicos, como int ou char, também pode criar ponteiros que armazenam o endereço de uma variável struct.
A sintaxe para declarar um ponteiro para uma struct segue o mesmo padrão que outras declarações de ponteiros:
struct StructureName *pointerName;Por exemplo, usando nossa conhecida struct Point:
struct Point p1 = {10, 20};
struct Point *ptr;Isso cria um ponteiro chamado ptr que pode armazenar o endereço de uma struct Point. Para fazer com que o ponteiro realmente aponte para nossa variável de struct, você usa o operador de endereço:
ptr = &p1;Para ler um membro por meio do ponteiro, desreferencie-o e, em seguida, use o operador ponto. Os parênteses são obrigatórios, porque . tem precedência maior que *:
printf("%d", (*ptr).x); // igual a p1.xAgora ptr contém o endereço de memória da variável struct p1. Isso abre novas possibilidades para trabalhar com structs, especialmente ao passá-las para funções ou gerenciar a memória dinamicamente. Ponteiros para structs são essenciais para criar estruturas de dados mais complexas e escrever programas C eficientes.
Desafio
FácilCrie um programa em C que demonstre o trabalho com ponteiros para structs. Seu programa deve:
- Definir uma
structchamadaProductcom os seguintes membros:- Um inteiro
idpara armazenar o ID do produto - Um array de caracteres
namecom tamanho 25 para armazenar o nome do produto - Um float
pricepara armazenar o preço do produto - Um inteiro
quantitypara armazenar a quantidade disponível
- Um inteiro
- Na função main, criar uma variável
Productchamadaiteme inicializá-la com os seguintes valores:- ID: 501
- Nome: "Laptop"
- Preço: 899.99
- Quantidade: 15
- Declarar um ponteiro para uma
structProductchamadoitemPtr - Atribuir o endereço da variável
itemaitemPtrusando o operador de obtenção de endereço - Imprimir as informações originais do produto acessando diretamente os membros da struct (usando o operador ponto) neste formato exato:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Imprimir as mesmas informações do produto acessando os membros da struct por meio do ponteiro (usando o operador de desreferência e a notação de ponto:
(*itemPtr).member) neste formato exato:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Verificar se o ponteiro está apontando corretamente para a struct, imprimindo os endereços de memória neste formato exato:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Para a verificação do endereço, imprima Match se os endereços forem iguais ou No Match se forem diferentes.
Este desafio testa seu entendimento sobre a declaração de ponteiros para structs, a atribuição de endereços usando o operador de obtenção de endereço e o acesso aos membros de structs por meio de ponteiros, usando o operador de desreferência combinado com a notação de ponto. Você também verificará se o ponteiro contém corretamente o endereço da variável struct.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
// TODO: Defina a struct Product aqui
int main() {
// TODO: Escreva seu código aqui
// 1. Crie e inicialize a variável Product 'item'
// 2. Declare um ponteiro para Product chamado 'itemPtr'
// 3. Atribua o endereço de 'item' a 'itemPtr'
// 4. Exiba as informações originais do produto usando o operador ponto
// 5. Exiba as informações do produto por meio do ponteiro usando (*itemPtr).member
// 6. Exiba e verifique os endereços
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 Lógica e Fluxo
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 ContatoPratique por conta própria: Compilador de C online