Как в C++ получить длину массива только с указателями? Я знаю, что имя вкладки является указателем на первый элемент, но что дальше?Длина массива с указателями
ответ
Вы не можете. Указатель - это просто место в памяти и не содержит ничего особенного, которое могло бы определить размер.
Поскольку это 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
}
Но в противном случае вам нужно пройти начать & конца и сделать вычитание, как предполагает Alok, старт & размер, как вы предлагаете, или вырезать статический массив и использовать вектор, как предлагает Тайлер.
Если вы знаете размер массива вы будете работать, вы можете сделать 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), /* ... */);
Я использую эти функции полезности время от времени.
Вы не можете этого сделать. Вам нужно передать длину массива вместе с указателем массива, или вам нужно использовать объект-контейнер, например std::vector
.
И вскоре std :: array :) – coelhudo
На данный момент я ожидаю, что к моменту завершения C++ 4x будет собираться социальное обеспечение. –
Я не понимаю, в чем дело: вы можете использовать boost :: array прямо сейчас. –
Вы имеете в виду что-то вроде:
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
Нет, указатель «конец» условно один-на-конец (что является законным), так что end-start = length, и поэтому вы можете делать такие вещи, как 'for (int * i = start; i! = end; ++ i)'. –
@ Тайлер: спасибо. –
Вы не можете, если вы не знаете, что в разыменовывает конец указатель на. В случае массивов символов это '\ 0', поэтому вы можете зацикливаться до тех пор, пока не прочитаете этот символ, чтобы выяснить длину.
В случае * строк * это обычно '\ 0'. Не каждый массив символов является строкой. – Potatoswatter
- 1. длина строки между указателями
- 2. Установка массива с двумя указателями
- 3. Длина массива
- 4. Длина массива
- 5. Длина массива с фиксированным индексом
- 6. Длина многомерного массива с smarty
- 7. Длина массива с учетом аномалии
- 8. длина массива с ключом, js
- 9. длина массива с помощью указателей
- 10. Длина массива с прямой вставкой
- 11. C++ ячейки памяти с указателями массива
- 12. Инициализация массива _C++ _ объектов с указателями индекса
- 13. Создание динамического массива с указателями класса
- 14. Код сортировки 2D-массива с указателями
- 15. Создание временного массива с указателями C++
- 16. Создание 2d динамического массива с указателями
- 17. Найти EOF массива с указателями в C++
- 18. Использование массива с указателями в C
- 19. Сортировка выбора с указателями на элементы массива
- 20. Получить элемент двумерного массива с указателями
- 21. Индексирование массива символов - выпуск с указателями
- 22. C++ Передача динамически созданного массива с указателями
- 23. Длина массива в параметрах массива
- 24. Vue.js: длина массива часов
- 25. Длина массива неверна
- 26. PHP максимальная длина массива
- 27. Предельная длина массива Angular.js
- 28. Наименьшая длина массива
- 29. Какова длина моего массива?
- 30. node - недопустимая длина массива
Вам лучше использовать 'typedef' для создания типа массива и принять ссылку на него, чтобы исключить« шаблон », если только эти методы не будут находиться в файле заголовка, и размер массива фактически меняется (но остается время деления на компиляцию). – Potatoswatter
@Potatoswatter: Я не знаю, как сделать такой тип typedef. N не известен функции до тех пор, пока она не будет создана при вызове. Я добавлю пример typedef, это то, что вы имели в виду? – GManNickG
Да, пример typedef, который вы добавили, - это то, что я имел в виду. 'template' приятно с автоматическим размером 'int ary [] = {...};', но создание экземпляра может быть неудобным/запутанным, а преимущество мало AFAIK, если массив не объявлен таким образом. Или пользователь работает с несколькими фиксированными размерами. –
Potatoswatter