Menu
Coddy logo textTech

Ponteiros para Structs

Parte da seção Logic & Flow do Journey de C da Coddy — lição 44 de 63.

Agora que você 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, você 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 de 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 o ponteiro realmente apontar para a nossa variável struct, você usa o operador de endereço (address-of):

ptr = &p1;

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 construir estruturas de dados mais complexas e escrever programas em 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
    • Name: "Laptop"
    • Price: 899.99
    • Quantity: 15
  3. Declarar um ponteiro para uma struct Product chamado itemPtr
  4. Atribuir o endereço da variável item ao itemPtr usando o operador de endereço (address-of)
  5. Imprimir as informações originais do produto acessando os membros da struct diretamente (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 através 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 de endereço, imprima 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, atribuição de endereço usando o operador de endereço e acesso a membros de struct através 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.

Folha de consulta

Você pode criar ponteiros para structs usando a mesma sintaxe de outras declarações de ponteiros:

struct StructureName *pointerName;

Para fazer um ponteiro apontar para uma variável struct, use o operador de endereço (address-of):

struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;

Acesse membros de uma struct através de um ponteiro usando o operador de desreferência e a notação de ponto:

(*ptr).member

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 Logic & Flow