Ponteiros para objetos em C

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.

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

O seu computador está lento, travando ou dando tela azul… e você não faz ideia do que fazer?

Saiba que isso pode estar te fazendo perder dinheiro — seja com manutenção cara ou oportunidades que você está deixando passar.

Com o Super Técnico 2.0, você aprende na prática como diagnosticar defeitos, montar computadores do zero e fazer upgrades que realmente aumentam o desempenho, mesmo que você esteja começando do absoluto zero.

Você pode usar esse conhecimento para:

✔ Resolver seus próprios problemas sem depender de ninguém
✔ Ganhar dinheiro com manutenção e suporte técnico
✔ Ou até entrar de vez no mercado de TI

Tudo com aulas diretas ao ponto, sem enrolação e focadas no que realmente funciona no dia a dia.

👉 CLIQUE AQUI AGORA e veja todos os detalhes antes que essa oportunidade passe:

Super Técnico 2.0

Sobre o Autor

Benedito Silva Júnior
Benedito Silva Júnior

Bacharel em Sistemas de Informação e 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 *