Olá Pedro!
Na linguagem C, quando vc passa um vetor por parâmetro, na verdade vc está passando, de maneira implícita, um ponteiro para aquele vetor (passar um vetor por cópia pode reduzir muito o desempenho, então a linguagem faz isso para ter otimização).
Por se tratar de um ponteiro, não há como saber ao certo o tamanho do elemento que ele está apontando, ou seja, infelizmente não há como obter, em C, o tamanho de um elemento (array) dentro de uma função, sendo necessário passar o tamanho desse elemento por parâmetro na chamada da função.
#include <stdio.h>
int soma(int arg[], size_t size)
{
int soma = 0;
for(int i = 0; i < size; ++i)
{ soma += arg[i]; }
return soma;
}
int main()
{
int numeros[] = {1,2,3,4,5};
//posso determinar o tamanho de um array de maneira genérica,
//dividindo o tamanho total do array pelo do seu primeiro elemento
int tam_numeros = sizeof(numeros) / sizeof(numeros[0]);
printf("a soma do array eh: %d\n", soma(numeros,tam_numeros));
return 0;
}
Essa seria a solução. Em C++ vc consegue passar o array por referência, ou seja, vc não passa um ponteiro, mas sim o endereço de memória do array para a função, assim vc consegue, mesmo dentro de uma função, determinar o tamanho de um array, além disso, pode-se utilizar a sobrecarga de função para ter varias funções "soma()" para diferentes tipos ou utilizar os "templates" ( que "gera" essa sobrecarga de função de maneira "automática"), para receber tipos genéricos por parâmetro e retornar tbm esses tipos.
Veja um código de C++ fazendo o mesmo, mas de uma maneira mais versátil:
#include <iostream>
//com template a função recebe array de todos os tipos (int, float, ...)
template <typename T, size_t S>
T soma(T (&arg)[S]) //recebe uma referência de memória
{
T soma = 0;
//eh calculado o tamanho dentro da função "soma()"
size_t size = sizeof(arg) / sizeof(arg[0]);
for(int i = 0; i < size; ++i)
{
soma += arg[i];
}
return soma;
}
int main()
{
int numeros[] = {1,2,3,4,5};
//eh passado apenas o array, sem o seu tamanho!
std::cout << soma(numeros) << std::endl;
return 0;
}
espero ter ajudado! se sim, não esqueça de marcar esse post como solução!
Bons estudos irmão.