Вы можете передавать массив по значению, но вы должны сначала обернуть его в структуру или класс. Или просто используйте тип, такой как std :: vector.
Я думаю, что решение было ради эффективности. Никто не хотел бы делать это большую часть времени. Это то же самое рассуждение, что и почему нет беззнаковых двойников. Нет связанной инструкции CPU, поэтому вы должны сделать то, что неэффективно, очень сложно в таком языке, как C ++.
Как упомянул @litb: «C ++ 1x и boost оба обернули собственные массивы в структуры, обеспечивающие std :: array и boost :: array, что я всегда предпочел бы, потому что это позволяет передавать и возвращать массивы в структурах»
Массив - это указатель на память, в которой хранится этот массив и его размер. Обратите внимание, что это не то же самое, что указатель на первый элемент массива.
Большинство людей считают, что вы должны передать массив в качестве указателя и указать размер в качестве отдельного параметра, но это не нужно. Вы можете передать ссылку на сам фактический массив, сохраняя его статус sizeof ().
//Here you need the size because you have reduced
// your array to an int* pointing to the first element.
void test1(int *x, int size)
{
assert(sizeof(x) == 4);
}
//This function can take in an array of size 10
void test2(int (&x)[10])
{
assert(sizeof(x) == 40);
}
//Same as test2 but by pointer
void test3(int (*x)[10])
{
assert(sizeof(*x) == 40);
//Note to access elements you need to do: (*x)[i]
}
Некоторые люди могут сказать, что размер массива неизвестен. Это неправда.
int x[10];
assert(sizeof(x) == 40);
Но как насчет распределений в куче? Выделения в куче не возвращают массив. Они возвращают указатель на первый элемент массива. Таким образом, новый тип не является безопасным. Если у вас действительно есть переменная массива, то вы будете знать размер ее содержимого.