Aritmética de ponteiros em C e C++
Nesta lição, você vai percorrer os elementos de um array com aritmética de ponteiros em C e com iteradores em C++.
Introdução
Ao somar 1 a um ponteiro, ele não avança 1 byte, mas sim para o próximo elemento do array, porque o compilador calcula o deslocamento pelo tamanho do tipo. Assim, você pode usar ponteiros para percorrer uma área de memória contínua, como um array.
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++
#include <stdio.h>
int main(void) {
int values[] = {10, 20, 30, 40};
int sum = 0;
for (int *p = values; p < values + 4; ++p) sum += *p;
printf("sum=%d distance=%td\n", sum, (values + 4) - values);
return 0;
}
sum=100 distance=4
#include <iostream>
#include <vector>
int main() {
std::vector values{10, 20, 30, 40};
int sum = 0;
for (auto it = values.begin(); it != values.end(); ++it) sum += *it;
std::cout << "sum=" << sum << " distance="
<< std::distance(values.begin(), values.end()) << '\n';
}
sum=100 distance=4
Comparação entre C e C++
O laço começa com o ponteiro p no primeiro elemento e avança até p chegar à posição values + 4. Em cada passo, *p pega o valor atual e o soma ao total. A aritmética de ponteiros só é válida dentro do mesmo array, ou logo após o último elemento. Em C++, os iteradores permitem percorrer da mesma forma muitos tipos diferentes de contêineres.
A posse e a liberação da memória ficam totalmente por conta do programador.
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