Menu
CoddyTech

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.x

Agora 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.

challenge icon

Desafio

Fácil

Crie um programa em C que demonstre o trabalho com ponteiros para structs. 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 struct Product 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) neste formato exato:
    • 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 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]
  7. 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;
}
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