Как проходят массивы? - PullRequest
21 голосов
/ 01 апреля 2010

Массивы передаются по умолчанию по ref или значению? Спасибо.

Ответы [ 3 ]

28 голосов
/ 01 апреля 2010

Они передаются как указатели. Это означает, что вся информация о размере массива теряется. Вам было бы гораздо лучше использовать 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 );
}
26 голосов
/ 01 апреля 2010

Во-первых, вы не можете передать массив по значению в том смысле, что сделана копия массива. Если вам нужна эта функциональность, используйте 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]);

Надеюсь, это поможет.

6 голосов
/ 01 апреля 2010

Массивы особые: они всегда передаются как указатель на первый элемент массива.

...