Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Crie um programa em C que demonstre o trabalho com ponteiros para estruturas. Seu programa deve:

  1. Definir uma struct chamada Product com os seguintes membros:
    • Um inteiro id para armazenar o ID do produto
    • Um array de caracteres name com tamanho 25 para armazenar o nome do produto
    • Um float price para armazenar o preço do produto
    • Um inteiro quantity para armazenar a quantidade disponível
  2. Na função main, criar uma variável Product chamada item e inicializá-la com os seguintes valores:
    • ID: 501
    • Nome: "Laptop"
    • Preço: 899.99
    • Quantidade: 15
  3. Declarar um ponteiro para uma Product struct chamado itemPtr
  4. Atribuir o endereço da variável item a itemPtr usando o operador de obtenção de endereço
  5. 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]
  6. 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]
  7. 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;
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de C online