#include <stdio.h>
int soma(const int* const ptr, int length) {
int total = 0;
for (int i = 0; i < length; i++) {
// a mesma coisa que array[i]. Implicitamente o que está
// ocorrendo é pegar o valor armazenado em ['endereço base' + i * sizeof(int)]
total += *(ptr + i);
}
return total;
}
int main(int argc, char *argv[]) {
// quando a inicialização é feita em linha, o compilador é capaz
// de determinar o tamanho do array, e portanto podemos
// omiti-lo.
int array[] = { 0, 1, 2, 3, 4 };
printf("total: %d\n", soma(array, 5));
return 0;
}
Teste o código acima. O que você perceberá é que arrays comportam-se de forma análoga a ponteiros, isto é, o nome do array é um alias para o índice 0, e os demais índices são alocados em posições adjacentes de memória, e o acesso se dá por aritmética de ponteiros. Você declarou na função main um array de 3 posições, mas na função soma está lendo 10 posições. Você está acessando posições de memória que não foram inicializadas, e portanto contém lixo (valores residuais aleatórios). Neste caso, em que você está apenas lendo os danos potenciais são menores, contudo, este é um erro grave, que incorre em comportamento indefinido, o que significa que em certas circunstâncias pode fazer o programa acabar prematuramente, em outras pode corromper a memória e gerar resultados inesperados. Altere o limite de iterações do laço para coincidir com o comprimento do array.
#include <stdio.h>
void soma(int numeros[10]) {
int total = 0;
for(int i = 0; i < 3; i++) {
total += numeros[i];
}
printf("total: %d", total);
}
int main() {
int numeros[3];
numeros[0] = 4;
numeros[1] = 9;
numeros[2] = 5;
soma(numeros);
}