Длина массива с указателями - PullRequest
8 голосов
/ 17 марта 2010

Как в C ++ получить длину массива только с указателями? Я знаю, что имя вкладки является указателем на первый элемент, но что дальше?

Ответы [ 4 ]

15 голосов
/ 17 марта 2010

Вы не можете сделать это. Вам нужно передать длину массива вместе с указателем массива или использовать объект-контейнер, такой как std::vector.

9 голосов
/ 17 марта 2010

Вы не можете. Указатель - это просто область памяти, которая не содержит ничего особенного, что могло бы определить размер.

Поскольку это 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), /* ... */);

Время от времени я использую эти служебные функции.

3 голосов
/ 17 марта 2010

Вы имеете в виду что-то вроде:

int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
0 голосов
/ 17 марта 2010

Вы не можете, если не знаете, на что ссылается указатель конца. В случае массивов символов это '\ 0', поэтому вы можете зацикливаться, пока не прочитаете этот символ, чтобы определить длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...