Na linguagem C, não temos “objetos” no sentido de orientação a objetos como em C++ ou Java, mas podemos usar estruturas (structs) para criar entidades com atributos e manipular seus dados por meio de ponteiros. Ponteiros para structs são fundamentais para desenvolver programas organizados e eficientes, pois permitem que dados complexos sejam passados por referência, economizando memória e melhorando a performance. Neste post entenda ponteiros para objetos em C.

Definindo uma Struct

Vamos criar uma struct para representar um objeto simples, como um Pessoa:

#include <stdio.h>
#include <string.h>

struct Pessoa {
    char nome[50];
    int idade;
};

Usando ponteiros para Structs

Com a struct criada, podemos declarar um ponteiro para ela e manipular os dados do objeto usando a notação de ponteiro (->).

Exemplo:

void exibirPessoa(struct Pessoa *p) {
    printf("Nome: %s\n", p->nome);
    printf("Idade: %d\n", p->idade);
}

int main() {
    struct Pessoa pessoa1;
    strcpy(pessoa1.nome, "Ana");
    pessoa1.idade = 25;

    exibirPessoa(&pessoa1); // Passa o endereço da struct
    return 0;
}

Explicação do código

  1. Definindo um ponteiro: struct Pessoa *p é um ponteiro que armazena o endereço de uma variável do tipo Pessoa.

  2. Acessando os membros com ->: O operador -> permite acessar os campos da struct através do ponteiro, facilitando o uso e mantendo o código limpo.

  3. Passagem por referência: Em exibirPessoa(&pessoa1), passamos o endereço da pessoa1 para a função, evitando a cópia da estrutura completa.

Vantagens de usar ponteiros para Structs

  • Economia de memória: Passar apenas o endereço é mais econômico do que duplicar estruturas grandes.

  • Flexibilidade e modificações: Podemos alterar o conteúdo do objeto diretamente dentro da função, o que é prático para gerenciar estruturas de dados complexas.

Outro exemplo prático

Um ponteiro é uma simples implementação do tipo referência da Ciência da computação.

Assim como é possível criar ponteiros para variáveis do tipo char, int ou float, também é possível criarmos ponteiros para objetos.

O código abaixo ilustra bem o uso desse conceito:

int nInt;
 
//ponteiro do tipo int - é inicializado para apontar ao inteiro nInt 
int* pInt = &nInt; 
    
class Savings {
	
    public:
   int nAccountNumber;
   double dBalance;
};
    
Saving s;
  
//declara ponteiro ao objeto Savings e o inicializa para o endereço de s 
Saving* pS = &s;	
 
/* O tipo pS é "ponteiro para Savings", o qual é escrito como Savings* */     
...
     
// designa valores ao número de conta e saldo do objeto Savings indicado por pS 
(*pS) .nAccountNumber = 2100;
(*pS) .dBalance = 2350;
     
/* Os parênteses são necessários devido à precedência de . ser maior que *. 
Sem os parênteses, *pS.nAccountNumber = 2100 seria interpretado como 
*(pS.nAccountNumber) = 2100, o que significa "armazenar 2100 no lugar apontado por 
pS.nAccountNumber". Isso gera um erro de compilador, pois nAccountNumber não é um 
ponteiro (nem pS um Savings). */ 
     
/* (*pS). dBalance = 2350 também pode ser escrito na forma "pS->dBalance = 2350". 

//Chama uma função com um ponteiro de objeto:

double withdraw(double dAmount);
double deposit(double dAmount);
     
//argumento para someOtherFunction() é "ponteiro para Savings" 
void someOtherFunction(Savings s) {
	
   s.deposit(140.0);
}
        
void someFunction() {
	
Savings s = {2100, 0.0};
someOtherFunction(s); //passagem do objeto à função 
        
//Para passar o endereço do objeto ao invés do próprio objeto: 
       
...
     
void someOtherFunction(Savings* pS) {
	
   pS->deposit(140.0);
}
        
void someFunction() {
	
   Savings s = {2500, 0.0};
   someOtherFunction(&s);  //passagem do endereço do objeto à funçao   
}

Ponteiros para structs em C são uma técnica poderosa para trabalhar com dados organizados em objetos.

Dominar essa prática é essencial para criar programas robustos e eficientes em C, especialmente em projetos que manipulam grande volume de dados.

QUER SER UM PROGRAMADOR FULL-STACK E DOMINAR AS PRINCIPAIS TECNOLOGIAS DO MERCADO?

Aprenda através de projetos reais e aulas práticas. São 20 cursos completos + cursos bônus. Grupos privados exclusivos, atualizações constantes e lives semanais.

Python, PHP, Java Script, CSS, Node, Angular JS, MySQL, Photoshop, Flutter, AWS, Apache e muito mais!

CLIQUE NA IMAGEM ABAIXO E CONFIRA MAIS DETALHES:

CLIQUE AQUI E SAIBA MAIS

Dúvidas ou sugestões? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits

Tags:

Quer receber GRÁTIS o e-book "Como Formatar um Computador em 5 Minutos"?

Não enviamos spam. Seu e-mail está 100% seguro!

Sobre o Autor

Bene Silva Júnior
Bene Silva Júnior

Bacharel em Sistemas de Informação pelo Instituto Paulista de Pesquisa e Ensino IPEP. Apaixonado por tecnologias e games do tempo da vovó!

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *