2014-09-11 3 views
0

Я хотел бы знать - есть ли способ скопировать массив в функцию в C/C++? Не передавайте его только по адресу, а создайте копию ... Как для значения int. Например здесь мы посылаем не копию (((:.Копировать массив в функцию C++

void arrayAbs(int array[], int size) { 
    for (int i = 0; i < size; i++) { 
     if (array[i] < 0) { 
      array[i] *= -1; 
     } 
    } 
} 
+4

Использование 'станд :: массив ' ([см ссылки] (http://en.cppreference.com/w/cpp/container/array)), или 'станд :: вектор ' – Borgleader

+0

Вам нужно написать функцию для создания копии вашего необработанного массива. В противном случае используйте 'std :: vector' или (лучше)' std :: array' (только для C++ 11) – Galik

ответ

1

C и массивы C++ не копируемыми Но вы можете использовать массив типа стандартного типа библиотеки контейнеров, таких как std::array:

template <size_t N> 
void arrayAbs(std::array<int, N> a) 
{ 
    for (int i = 0; i < a.size(); i++) { 
     if (a[i] < 0) { 
      a[i] *= -1; 
     } 
    } 
} 

Здесь a передается по значению, поэтому это копия массива, переданного вызывающим.

1

Это невозможно для массивов - по крайней мере, когда размер массива неизвестен во время компиляции. вы проходите size как отдельный p arameter, похоже, что решение с массивом фиксированного размера не будет работать в вашей ситуации.

Вместо этого вы можете использовать std::vector<int>. Этот контейнер будет скопирован, когда вы передадите его по значению. В качестве дополнительного преимущества он знает свой размер, поэтому передача int size станет ненужной.

0

Вы не можете сделать это с помощью массивов. Либо массивы преобразуются в указатели на свои первые элементы при передаче функции (в C и C++), либо если параметр определен как ссылка на массив, тогда эта ссылка передается. в любом случае не создается копия массива.

В C++ вы можете использовать стандартный класс std::array. в этом случае вы действительно могли бы работать с копией исходного массива. В C вы можете использовать аналогию с std::array в C++, обернув массив в структуру.

+0

Обратите внимание, что OP передает массив 'size' в качестве отдельного параметра. Импликация заключалась бы в том, что его 'arrayAbs' станет общим по размеру' std :: array', переданному в него (см. Ответ Хуана). – dasblinkenlight

+0

@ dasblinkenlight это только детали. –

+0

Возможно, это «только детали» для человека с многолетним опытом работы на C++ и глубоким знанием стандартной библиотеки C++. Тем не менее, для читателя, который хочет узнать, можно ли передавать массивы по стоимости, это не было бы очевидно вообще. – dasblinkenlight

Смежные вопросы