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á se sente à vontade 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 do tipo struct.
A sintaxe para declarar um ponteiro para uma struct segue o mesmo padrão das outras declarações de ponteiros:
struct StructureName *pointerName;Por exemplo, usando nossa conhecida estrutura 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 a nossa variável de struct, você usa o operador de endereço:
ptr = &p1;Agora ptr contém o endereço de memória da variável de estrutura p1. Isso abre novas possibilidades para trabalhar com estruturas, especialmente ao passá-las para funções ou gerenciar memória dinamicamente. Ponteiros para estruturas 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 estruturas. 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
Productstruct chamadoitemPtr - 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) exatamente neste formato:
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 desreferenciação e a notação de ponto:
(*itemPtr).member) exatamente neste formato: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 exatamente neste formato:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Para a verificação do endereço, imprimir Match se os endereços forem iguais ou No Match se forem diferentes.
Este desafio testa sua compreensão da declaração de ponteiro para struct, da atribuição de endereço usando o operador de obtenção de endereço e do acesso aos membros da struct por meio de ponteiros usando o operador de desreferenciação 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' para 'itemPtr'
// 4. Imprima as informações originais do produto usando o operador ponto
// 5. Imprima as informações do produto via ponteiro usando (*itemPtr).member
// 6. Imprima 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