Ponteiros e memória

Ponteiros e endereços em C e C++

Nesta lição, você vai guardar o endereço de uma variável em um ponteiro, acessar o valor pelo ponteiro e alterar a variável original.

Introdução

Um ponteiro (pointer) é uma variável que guarda o endereço de memória de outra variável. O operador & obtém o endereço de uma variável, e o operador * (chamado de desreferência) acessa o valor que está no endereço apontado. Ponteiros são um dos conceitos mais importantes de C e C++.

Pontos importantes

  • Um ponteiro só deve apontar para um objeto que ainda existe, do tipo certo, ou ser nulo.
  • Cada área de memória alocada deve ser liberada exatamente uma vez.
  • Deixe claro qual função é dona da memória (ownership) e quais dados são apenas lidos (const).

Exemplos de código C e C++

C
Executar →
main.c
#include <stdio.h>

int main(void) {
    int score = 70;
    int *score_ptr = &score;
    *score_ptr += 5;
    printf("score=%d same-address=%s\n", score,
           score_ptr == &score ? "yes" : "no");
    return 0;
}
Resultado da execução
score=75 same-address=yes
C++
Executar →
main.cpp
#include <iostream>

int main() {
    int score = 70;
    int* score_ptr = &score;
    *score_ptr += 5;
    std::cout << "score=" << score << " same-address="
              << std::boolalpha << (score_ptr == &score) << '\n';
}
Resultado da execução
score=75 same-address=true

Comparação entre C e C++

O ponteiro score_ptr guarda o endereço de score, então *score_ptr += 5 na verdade soma 5 à própria variável score, que passa de 70 para 75. A comparação score_ptr == &score confirma que os dois endereços são o mesmo. C++ ainda usa ponteiros simples (raw pointers) quando só é preciso acessar dados sem gerenciar memória, mas prefere referências quando a variável nunca pode ficar vazia.

C

A posse e a liberação da memória ficam totalmente por conta do programador.

C++

Contêineres e RAII liberam os recursos automaticamente quando o objeto chega ao fim da vida.

Exercícios práticos

Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.

  • Teste ponteiros nulos e falhas na alocação de memória.
  • Execute o programa com AddressSanitizer e UndefinedBehaviorSanitizer para encontrar erros de memória.
  • Anote claramente qual ponteiro é dono da memória e qual só serve para leitura.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios