Этого нельзя сделать только с помощью указателей. Указатели не содержат информации о размере массива - они являются только адресом памяти. Поскольку массивы распадаются на указатели при передаче в функцию, вы теряете размер массива.
Однако можно использовать шаблоны:
template <typename T, size_t N>
size_t foo(const T (&buffer)[N])
{
cout << "size: " << N << endl;
return N;
}
Затем вы можете вызвать функцию следующим образом (как и любую другую функцию):
int main()
{
char a[42];
int b[100];
short c[77];
foo(a);
foo(b);
foo(c);
}
Выход:
size: 42
size: 100
size: 77