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

  1. int *p = v; faz p apontar para o primeiro elemento do array.
  2. O laço percorre os índices 0 a 4.
  3. *(p + i) avança i elementos a partir de p e lê o valor correspondente.
  4. soma += ... acumula cada valor.
  5. No fim, printf mostra 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 + i em vez de *(p + i): a precedência faz (*p) + i, somando i ao valor, não avançando no array.
  • Usar p++ dentro de um laço que também usa p + 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