Передача массива по значению С++

228
27 января 2020, 23:50

Говорят что в С++ нельзя передать массив по значению в функцию, тогда объясните что делает мой кусок кода: `

void f3(int A)
{
    (&A)[3] = 45;
    cout << (&A)[3] << endl;
}
int main()
{
    setlocale(LC_ALL, "ru");
    int A[5];
    f3(*A);
    cout << A[3]<<endl;
    system("pause");
    return 0; 
}
Answer 1

Ваш код передает в функцию значение нулевого элемента массива А. Далее, как тут уже сказали, у Вас будет неопределенное поведение и скорее всего затрется память.

Говорят что в С++ нельзя передать массив по значению в функцию

Передать массив по значению в С++ вполне можно (но, как правило, не нужно). Например так:

struct a{
int b[10];
};
void f3(a A){
A.b[3] = 45;
cout << A.b[3] << endl;
}

В этом случае в стеке создается копия структуры типа "a" и массива "b" в ней. В этой копии модифицируется третий элемент массива "b". После выхода из функции копия структуры, созданной в стеке (и соответственно копия массива в которой модифицировался третий элемент) теряется.

UPD1:

UPD1 удалено как ошибочное. Желающие могут посмотреть в правках.

UPD2:

Действительно, как подсказывает коллега HolyBlackCat, все равно передается только указатель на массив. Значит без структуры или класса не получится передать массив в функцию по значению. Это потому, что у массива нет конструктора копирования по умолчанию, а трансляторы теперь умные стали. А у структуры или класса есть конструктор копирования по умолчанию (побайтовое копирование).

Answer 2

Выражение (&A)[3] = 45; берет адрес локальной переменной и записывает по нему значение 45 со смещением 3, что является Неопределенным Поведением. Соответственно что реально произойдет - неизвестно. Зато однозначно известно, что тут нет никакой передачи массива.

READ ALSO
Как вызвать функцию из main()?

Как вызвать функцию из main()?

Я только начал изучать указатели (1 день) и не могу понять как передать указатель из функции create_matrix() в main(), а в ней уже вызвать другую функцию...

248
undefined reference to `Magick::Image::Image()&#39;

undefined reference to `Magick::Image::Image()'

Подскажите, чего не хватает?

217