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!