Acessando Membros de Estruturas e Classes via Ponteiro em C/C++ com '->'

O oeprador de seta -> em linguagens como C e C++ é uma conveniência sintática utilizada para acessar membros de uma estrutura ou classe através de um ponteiro. Ele combina duas operações essenciais: desreferenciamento do ponteiro e acesso ao membro.

Considere um ponteiro p_objeto que aponta para uma instância de uma estrutura ou classe. Para acessar um membro chamado campo dessa instância, a notação p_objeto->campo é empregada. Essa sintaxe é equivalente a desreferenciar o ponteiro primeiro para obter o objeto e, em seguida, usar o operador de ponto . para acessar o membro: (*p_objeto).campo.

A utilização do operador -> simplifica a escrita de código, tornando-o mais legível e conciso quando se lida com ponteiros para estruturas ou objetos.

Exemplo Prático

Vamos ilustrar com um exemplo envolvendo uma estrutura Livro que armazena o título e o autor:


   struct Livro {
       char titulo[100];
       char autor[100];
   };
   

Agora, criaremos um ponteiro para essa estrutura e o utilizaremos para popular seus campos:


   #include <iostream>
   #include <string>

   struct Livro {
       char titulo[100];
       char autor[100];
   };

   int main() {
       int quantidade;
       std::cout << "Quantos livros deseja registrar? ";
       std::cin >> quantidade;
       std::cin.ignore(); // Limpa o buffer do newline após a leitura do inteiro

       Livro* catalogo[10]; // Array de ponteiros para Livro

       for (int i = 0; i < quantidade; ++i) {
           catalogo[i] = new Livro(); // Aloca memória dinamicamente para um novo Livro

           std::cout << "\n--- Livro " << i + 1 << " ---" << std::endl;

           std::cout << "Digite o título: ";
           std::cin.getline(catalogo[i]->titulo, 100); // Usa '->' para acessar o membro 'titulo'

           std::cout << "Digite o autor: ";
           std::cin.getline(catalogo[i]->autor, 100);  // Usa '->' para acessar o membro 'autor'
       }

       std::cout << "\n--- Catálogo Registrado ---" << std::endl;
       for (int i = 0; i < quantidade; ++i) {
           std::cout << "Livro " << i + 1 << ":\n";
           std::cout << "  Título: " << catalogo[i]->titulo << "\n";
           std::cout << "  Autor: " << catalogo[i]->autor << std::endl;
       }

       // Libera a memória alocada dinamicamente
       for (int i = 0; i < quantidade; ++i) {
           delete catalogo[i];
       }

       return 0;
   }
   

Neste exemplo, catalogo[i] é um ponteiro para uma estrutura Livro. O operador -> permite que acessemos diretamente os membros titulo e autor do livro apontado, sem a necessidade de desreferenciar explicitamente o ponteiro com *.

A linha catalogo[i] = new Livro(); demonstra a alocação dinâmica de memória em C++. O operador new cria uma nova instância de Livro na heap e retorna um ponteiro para ela. É crucial liberar essa memória posteriormente usando delete catalogo[i]; para evitar vazamentos de memória.

Tags: C++ ponteiros estruturas C alocação de memória

Publicado em 6-25 16:42