Как передаются массивы?
-
23-09-2019 - |
Вопрос
Передаются ли массивы по умолчанию по ссылке или значению?Спасибо.
Решение
Они передаются как указатели.Это означает, что вся информация о размере массива теряется.Вам было бы гораздо лучше посоветовать использовать std::vectors, которые могут передаваться по значению или по ссылке, по вашему выбору, и которые, следовательно, сохраняют всю свою информацию.
Вот пример передачи массива в функцию.Обратите внимание, что мы должны конкретно указать количество элементов, так как sizeof(p) задаст размер указателя.
int add( int * p, int n ) {
int total = 0;
for ( int i = 0; i < n; i++ ) {
total += p[i];
}
return total;
}
int main() {
int a[] = { 1, 7, 42 };
int n = add( a, 3 );
}
Другие советы
Во-первых, вы не можете передать массив по значению в том смысле, что создается копия массива.Если вам нужна эта функциональность, используйте std::vector
или boost::array
.
Обычно указатель на первый элемент передается по значению.Размер массива теряется в этом процессе и должен быть передан отдельно.Все следующие подписи эквивалентны:
void by_pointer(int *p, int size);
void by_pointer(int p[], int size);
void by_pointer(int p[7], int size); // the 7 is ignored in this context!
Если вы хотите передать по ссылке, размер является частью типа:
void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here!
Часто вы комбинируете передачу по ссылке с шаблонами, поэтому вы можете использовать функцию с различными статически известными размерами:
template<size_t size>
void by_reference(int (&a)[size]);
Надеюсь, это поможет.
Массивы - это нечто особенное:они всегда передаются как указатель на первый элемент массива.