Вы не можете. Указатель - это просто область памяти, которая не содержит ничего особенного, что могло бы определить размер.
Поскольку это C ++, вы можете передать массив по ссылке следующим образом:
template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
// the size is N
pX[0] = /* blah */;
// ...
pX[N - 1] = /* blah */;
}
// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
// the size is N
int i = pX[0]; // etc
}
Но в противном случае вам нужно пройти начало и конец и сделать вычитание, как предполагает Алок, начало и размер, как вы предлагаете, или отказаться от статического массива и использовать вектор, как предлагает Тайлер.
Если вы знаете размер массива, с которым будете работать, вы можете сделать typedef
:
typedef int int_array[10];
void handle_ten_ints(int_array& pX)
{
// size must be 10
}
И только для размера:
template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
return N;
}
template <typename T, size_t N>
T* endof(T (&pX)[N])
{
return &pX[0] + N;
}
// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);
Время от времени я использую эти служебные функции.