В чем разница между следующими обозначениями?
Первый выделяет динамический массив и дает вам указатель на него. Вам понадобится удалить массив (delete [] p
), когда он вам больше не понадобится, иначе память просочится. Обычно лучше не использовать исходные указатели для управления динамическими ресурсами, так как сложно проверить, правильно ли они удалены. Предпочитают RAII классы, такие как std::vector<int>
для управления ресурсом автоматически.
Второй объявляет массив в любой области видимости, в которой появляется объявление. Если это внутри функции, оно имеет время автоматического хранения и будет автоматически уничтожено, когда оно выходит за рамки. Если он находится вне функции, он имеет статический срок хранения и будет автоматически уничтожен в конце программы.
Как бы программно определить количество элементов массива B?
В C образом:
size_t arrayB_size = sizeof arrayB/sizeof arrayB[0];
или в C++ образом:
template <typename T, size_t N> size_t array_size(T(&)[N]) {return N;}
size_t arrayB_size = array_size(arrayB);
Обратите внимание, что вы не можете определить размер динамического массива - эта информация теряется. Первый стиль даст фиктивный результат (основанный на размере указателя, а не массива), а второй не скомпилируется. Это еще одна причина для переадресации vector
, которая знает его размер.
'int [5] arrayB;' не является законным, вы имеете в виду 'int arrayB [5];' – john
@john: Упс, исправлено. – Daniel
Вы не можете определить длину массива во время выполнения ... В C, в отличие от Java, массивы не отслеживают их собственные длины. Вы должны сами отслеживать длину. – Alderath