Médio C
Somar elementos de um array com aritmética de ponteiros
Enunciado
Dado o array int v[5] = {3, 8, 1, 7, 4};, calcule a soma dos elementos usando apenas aritmética de ponteiros, sem usar v[i]. Imprima a soma.
Requisitos
- Percorrer o array com um ponteiro e o operador
+. - Não usar a sintaxe
v[i]dentro do laço. - Imprimir a soma total.
Código inicial
#include <stdio.h>
int main(void) {
int v[5] = {3, 8, 1, 7, 4};
int soma = 0;
/* percorra com ponteiro e some os valores */
return 0;
}
Saída esperada
soma = 23
Ver dica
Use int *p = v; e um laço for (int i = 0; i < 5; i++), somando *(p + i).
Mostrar solução
#include <stdio.h>
int main(void) {
int v[5] = {3, 8, 1, 7, 4};
int soma = 0;
int *p = v; /* v decai para &v[0] */
for (int i = 0; i < 5; i++) {
soma += *(p + i); /* equivalente a v[i] */
}
printf("soma = %d\n", soma);
return 0;
}
Passo a passo
int *p = v;fazpapontar para o primeiro elemento do array.- O laço percorre os índices
0a4. *(p + i)avançaielementos a partir depe lê o valor correspondente.soma += ...acumula cada valor.- No fim,
printfmostra o total.
Por que funciona
O nome do array decai para um ponteiro para o primeiro elemento, então p + i calcula o endereço do elemento de índice i. Como p é int *, cada incremento anda sizeof(int) bytes, exatamente o necessário para chegar ao próximo int. Isso é a aritmética de ponteiros.
Erros comuns
- Escrever
*p + iem vez de*(p + i): a precedência faz(*p) + i, somandoiao valor, não avançando no array. - Usar
p++dentro de um laço que também usap + i: o deslocamento fica inconsistente. - Esquecer de inicializar
soma = 0.
Outra forma de resolver
Percorrer com incremento direto do ponteiro:
for (int *p = v; p < v + 5; p++) {
soma += *p;
}
Essa forma é idiomática quando não precisamos do índice.
Saída esperada
soma = 23