Ответ 1
Вы не можете, я боюсь. Вам нужно передать длину массива всем, кто в ней нуждается. Или вы можете использовать std::array
или std::vector
или подобные, которые сами отслеживают длину.
Мне трудно найти длину массива указателей. Скажем, у меня есть:
char array[40] = "hello"; // size 40
int length = sizeof array / sizeof array[0]; // no problem returns 40
//Как получить длину массива только с указателем на первый элемент в этом массиве?
char* pchar = array;
//если
std::strlen(pchar); // this returns the length of 5... i want length 40
//если
int count = 0;
while(true)
{
if(*(pchar + count) == '\0') // returns 5...
break;
count++;
}
Как мне получить, чтобы вернуть длину 40 только с указателя на первый элемент в массиве?
Я обнаружил, что могу это сделать.
int count = 0;
while(true)
{
if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0')
break;
count++;
}
Это возвращает 39, это хорошо, но я чувствую, что в некоторых ситуациях это может быть ошибкой.
Вы не можете, я боюсь. Вам нужно передать длину массива всем, кто в ней нуждается. Или вы можете использовать std::array
или std::vector
или подобные, которые сами отслеживают длину.
С++ имеет правильный тип строки:
std::string
который вы можете найти здесь. Даже если вы передаете его функции, которая принимает const char*
, у нее есть метод .c_str()
, который позволяет передать его функции, принимающей указатель. Если другой функции необходимо изменить строку, вы можете использовать &str[0]
, которая действительна для многих реализаций С++ и должна работать для С++ 11. Просто убедитесь, что вы изменяете размер() до нужного размера.
Некоторые из других контейнеров в С++:
std::array
(С++ 11) Массив постоянного размера. Лучше, чем простой старый массив C, поскольку он имеет метод size()
.
std::vector
Динамический массив (эквивалент Java ArrayList
)
Что касается вашего вопроса - нет способа найти размер заостренного массива. Как вы могли это сделать? Это просто глупый указатель.
Вы не можете. И мораль - это не использование указателей и массивов, использование векторов. Вы всегда можете получить размер вектора.
Верно, что вы не можете получить размер массива от указателя на элемент массива.
Если причина, по которой у вас есть только указатель, заключается в том, что вы реализуете функцию, которая принимает параметр массива в качестве аргумента следующим образом:
void foo (T *p) {
// p is a pointer to T
}
то вы можете использовать функцию шаблона вместо этого, чтобы получить размер массива для функции.
template <unsigned N, typename T>
void foo (T (&p)[N]) {
// p is a reference to an array[N] of T
std::cout << "array has " << N << " elements" << std::endl;
std::cout << "array has "
<< sizeof(p)/sizeof(p[0])
<< " elements"
<< std::endl;
}
int main ()
{
int array[40];
char array2[25];
foo(array);
foo(array2);
return 0;
}
Если вы хотите сохранить простой и не использовать #include <array.h>
, вы можете создать структуру, в которой вы имеете размеры массива. Немного нравится:
struct
{
int* int_Array;
int array_Size;
}
Таким образом, вы можете делать все, что захотите (например, удалять свои экземпляры или что-то еще)