🧮 Aritmética de Ponteiros
"Aritmética de ponteiros é o conjunto de operações que permitem manipular endereços de memória. Quando você adiciona 1 a um ponteiro, ele avança para o próximo elemento do tipo apontado, não necessariamente 1 byte."
A aritmética de ponteiros é uma das características mais poderosas — e perigosas — de C/C++. Ela permite percorrer arrays, manipular strings e acessar estruturas de dados de forma extremamente eficiente. Compreender como os endereços são calculados é essencial para usar ponteiros corretamente.
📌 O Básico: Ponteiro + Inteiro
Quando você adiciona um inteiro n a um ponteiro, o endereço resultante é deslocado por n * sizeof(tipo) bytes.
📊 Visualização do Deslocamento
| Expressão | Endereço (exemplo) | Valor |
|---|---|---|
p (p + 0) | 0x1000 | 10 |
p + 1 | 0x1004 | 20 |
p + 2 | 0x1008 | 30 |
p + 3 | 0x100C | 40 |
p + 4 | 0x1010 | 50 |
🔢 Operações Válidas com Ponteiros
| Operação | Exemplo | Resultado |
|---|---|---|
| Ponteiro + Inteiro | p + 3 | Endereço do 4º elemento |
| Inteiro + Ponteiro | 3 + p | Mesmo que p + 3 |
| Ponteiro - Inteiro | p - 1 | Endereço do elemento anterior |
| Ponteiro - Ponteiro | q - p | Número de elementos entre eles |
| Incremento | p++ ou ++p | Avança para o próximo elemento |
| Decremento | p-- ou --p | Retrocede para o elemento anterior |
- Ponteiro + Ponteiro (não faz sentido)
- Ponteiro * Ponteiro
- Ponteiro / Ponteiro
- Ponteiro % Ponteiro
📈 Incremento e Decremento
Os operadores ++ e -- são frequentemente usados para percorrer arrays.
➖ Subtração de Ponteiros
A diferença entre dois ponteiros do mesmo tipo retorna o número de elementos entre eles (não o número de bytes).
📏 Aritmética com Diferentes Tipos
O deslocamento em bytes depende do tamanho do tipo apontado.
📊 Tamanhos Típicos e Deslocamentos
| Tipo | sizeof | p + 1 desloca |
|---|---|---|
char | 1 byte | 1 byte |
short | 2 bytes | 2 bytes |
int | 4 bytes | 4 bytes |
long long | 8 bytes | 8 bytes |
float | 4 bytes | 4 bytes |
double | 8 bytes | 8 bytes |
🔄 Aritmética com void*
Ponteiros void* não permitem aritmética diretamente, pois o compilador não sabe o tamanho do tipo apontado. É necessário converter para um tipo específico primeiro.
⚖️ Comparação de Ponteiros
Ponteiros podem ser comparados usando operadores relacionais (==, !=, <, >, <=, >=).
📝 Exemplo Prático: Implementando strlen
Aritmética de ponteiros é a base para implementar funções de manipulação de strings.
📋 Exemplo Prático: Copiando Arrays
💡 Boas Práticas
- ✅ Prefira iteradores a ponteiros brutos em C++ moderno (mais seguro e genérico).
- ✅ Verifique limites ao fazer aritmética — nunca ultrapasse o final do array.
- ✅ Use
nullptrpara ponteiros que não apontam para nada válido. - ✅ Evite aritmética com
void*— converta para o tipo correto primeiro. - ✅ Documente quando uma função espera um intervalo de ponteiros (início e fim).
🔗 Conclusão
A aritmética de ponteiros é uma ferramenta poderosa que permite manipular memória de forma eficiente e expressiva. Compreender como os deslocamentos funcionam, as operações válidas e as armadilhas comuns é essencial para escrever código C/C++ robusto. Embora em C++ moderno muitos desses padrões sejam encapsulados por iteradores e containers da STL, o conhecimento de aritmética de ponteiros permanece fundamental para entender o que acontece "sob o capô".
0 Comentários