Pular para conteúdo

Aula 07 - Ponteiros e Referências 👆


O que é um Ponteiro?

  • Uma variável que armazena um endereço de memória.
  • "Aponta" para onde um dado está guardado na RAM.

Memória RAM (Abstração)

Endereço Descrição Valor
0x100 Variável 'x' 42
0x104 Ponteiro 'p' 0x100

Declaração de Ponteiros

int x = 10;
int* p = &x; // p aponta para o endereço de x
- int*: Tipo ponteiro para inteiro. - &: Operador de endereço (Address-of).


Desreferenciamento (*)

  • Acessar o valor que está no endereço apontado.
    cout << *p;  // Imprime 10
    *p = 20;     // Altera x para 20!
    

O Perigo de Ponteiros Não Inicializados

  • Ponteiros "selvagens" (wild pointers) apontam para lugares aleatórios.
  • Podem causar erros de segmentação (crash).

nullptr (C++11)

  • Sempre inicialize ponteiros vazios com nullptr.
  • Indica claramente que o ponteiro não aponta para nada válido.

Aritmética de Ponteiros

  • p++: Pula para o próximo endereço do tipo.
  • Se p é int* (4 bytes), p+1 pula 4 bytes.

Arrays e Ponteiros

  • O nome de um array é, na prática, um ponteiro para o primeiro elemento.
  • *(arr + 1) é o mesmo que arr[1].

O que é uma Referência?

  • Um apelido (alias) para uma variável existente.
  • Diferente do ponteiro, não pode ser nula e nem mudar de alvo.

Declaração de Referências

int x = 10;
int &ref = x; // ref é outro nome para x

Quando usar Referências?

  • Passagem de parâmetros em funções (Performance).
  • Retorno de objetos grandes.
  • Manter o código mais "limpo" que com ponteiros.

Stack vs Heap

  • Stack (Pilha): Memória automática, rápida, pequena.
  • Heap (Monte): Memória dinâmica, manual, grande.

Alocação Dinâmica (new)

int* p = new int; // Aloca no Heap
*p = 100;

Liberação de Memória (delete)

  • Todo new deve ter um delete.
    delete p; // Libera o espaço no Heap
    p = nullptr; // Boa prática
    

Vazamento de Memória (Memory Leak)

  • Quando perdemos o endereço de uma memória alocada sem dar delete.
  • O programa consome RAM até travar o sistema.

Arrays Dinâmicos

int* arr = new int[tamanho];
delete[] arr; // Use colchetes para arrays!

Ponteiro de Ponteiro (**)

  • Um ponteiro que aponta para outro ponteiro.
  • Usado em matrizes dinâmicas complexas.

Operador -> (Seta)

  • Atalho para acessar membros através de um ponteiro.
  • ptr->nome em vez de (*ptr).nome.

Passagem de Ponteiro para Funções

  • Permite alterar o valor original (como referência).
  • Permite passar "nada" (nullptr).

Resumo da Aula

  • Ponteiros oferecem poder total sobre a máquina.
  • Com grandes poderes vêm grandes responsabilidades (Gestão de RAM).
  • Use referências sempre que puder; use ponteiros só quando precisar.

Fim da Aula 07

  • Próxima aula: Estruturas e Arquivos!