Так мне ли достаточно рассматривать массив как класс с указателем, его размером и типом элементов в нем?
Нет, потому что это не так. Массив C -стилей - это просто кусок непрерывной памяти, содержащей элементы данного типа, не более, не менее.
Теперь, когда я думаю об этом, я не уверен, как C ++ знает размер массива в последнем коде, если он обрабатывается так же, как указатель.
Это не то, как обрабатываются массивы.
В первом примере функция принимает только указатель, ему все равно, откуда этот указатель. Передача в массиве распад массив в указатель на 1-й элемент. Вся информация о размере теряется, и размер массива нельзя определить только по указателю. Вот почему sizeof(arr)
не работает в этом контексте. Он знает только размер самого указателя, а не размер массива, из которого поступил указатель.
Во втором примере фактический массив находится в области видимости, где используется sizeof()
. Компилятор знает объявление массива, поэтому sizeof(arr)
может знать фактический размер байта массива.
Если вы действительно хотите знать размер переданного массива в функции и не хотите передать размер явно в качестве параметра, а затем передать массив по ссылке вместо указателя , чтобы размер массива не терялся:
template<size_t N>
int GetSize(int (&arr)[N]){
return N;
}