Справа в тому що в C ++ в функцію можна передати тільки покажчик (або посилання) на масив, відповідно ви завжди будете працювати з вихідним масивом, а не з його копією (і повернете також покажчик на вихідний масив):
Так само цей код не враховує розмір масиву (цикл проходить строго три рази), що може привести до наступного:
- якщо довжина вхідного масиву більше 3: оброблені будуть тільки перші три елементи масиву;
- якщо довжина вхідного масиву менше 3: програма впаде з гуркотом і помилкою доступу до пам'яті.
Проблему з розміром можна вирішити двома шляхами: передавати в функцію додатково розмір масиву або передавати масив за посиланням (якщо передавати масив за посиланням, помилки з тим, що ви передали або повернули масив неправильного розміру будуть виявлені на стадії компіляції):
Щоб повернути новий масив, доведеться просто всередині функції виділити пам'ять під новий масив і повернути покажчик на неї (головне потім не забути очистити пам'ять):
Але у нас же C ++, чорт візьми, так що варто замість стандартних сішних масивів скористатися тими контейнерами, які надає Батьківщина STL:
- std :: vector
такий "масив" із змінним розміром; - std :: array
масив фіксованого розміру.
Тепер ми можемо використовувати ітератори, Range-based for loop (починаючи з C ++ 11) та інші принади:
Чи не знавець в C ++ але можу сказати, що ви не передаєте масив, а передаєте функии покажчик на його перший елемент. В такому випадку ви працюєте ні з локальною копією масиву, а з його покажчиком.
Якщо завдання функції int Func (int Array []) полягає в тому щоб модифікувати "переданий масив" вам зовсім не обов'язково возващать його, а якщо вам дуже вже хочеться щось повернути в місце виклику (що в даному випадку немає сенсу) - то потрібно змінити сіганатуру функції:
Зауважте, що повертається тип int * це покажчик на int.
Передається покажчик на масив і робота ведеться безпосередньо з ним, отже, зовсім необов'язково робити повернення, наприклад: