Повернути масив у функції


212

У мене є масив, int arr[5]який передається функції fillarr(int arr[]):

int fillarr(int arr[])
{
    for(...);
    return arr;
}
  1. Як я можу повернути цей масив?
  2. Як я буду користуватися ним, скажімо, що я повернув покажчик, як я збираюся отримати доступ до нього?

46
строго кажучи в цьому контексті, вам не потрібно повертати масив, оскільки масив передається посиланням, тому будь-які зміни елементів всередині 'arr' будуть помічені поза функцією.
BuggerMe

12
повернення масиву зручно для ланцюжка функцій.
Seand

5
Поки ви не помилитесь, створивши масив на стеці та повернувши вказівник на нього.
detly

2
@ismail: Він не може повернути новий масив, якщо цей масив не був розподілений динамічно. І якщо це так, використовуйте std::vector.
GManNickG

4
@BuggerMe: Масиви НЕ передаються по посиланню (якщо ви не відправите його з великим кількістю синтаксису смішніше), в коді, масив розпади в покажчик на перший елемент і який передається функції. 5У підписі функції відкидається компілятором.
Девід Родрігес - дрибес

Відповіді:


204

У цьому випадку змінна масиву arrможе насправді також трактуватися як покажчик на початок блоку вашого масиву в пам'яті шляхом неявного перетворення. Цей синтаксис, який ви використовуєте:

int fillarr(int arr[])

Це різновид просто синтаксичного цукру. Ви дійсно можете замінити його цим і воно все одно спрацює:

int fillarr(int* arr)

Тож у тому ж сенсі те, що ви хочете повернути зі своєї функції, насправді є вказівником на перший елемент масиву:

int* fillarr(int arr[])

І ви все одно зможете використовувати його так само, як і звичайний масив:

int main()
{
  int y[10];
  int *a = fillarr(y);
  cout << a[0] << endl;
}

45
Щоб уточнити, що "класичне твердження C ++" є помилковим; масиви не є покажчиками.
GManNickG

25
пам'ятайте правило [i] == * (a + i)
південь

8
@Brent Nash, ні. масив - це масив. Покажчик на початок масиву - це вказівник. Просто трапляється, що у компілятора є синтаксичний цукор, який робить переклад для вас у деяких ситуаціях. arrayі &arrayє взаємозамінними у багатьох випадках.
Карл Норум

20
@Brent: Ні. Масив - це власний тип, це не особливий вид вказівника. Тип aін int a[10]є int[10]. Що ви можете сказати - це масиви "розпадаються" на покажчики на їх перший елемент. (Це неявна конверсія масиву-вказівника.) Тоді ваша відповідь буде йти по лініях, які моя. Якщо ви відредагуєте свою відповідь, щоб розмежувати масиви, перетворення масиву на вказівники та покажчики, я видалю свою відповідь, оскільки вони мали б однакову основну інформацію, і ви були першими.
GManNickG

8
@ пам'ятайте правило [i] == * (a + sizeof (a) * i)
Амір

114

Функції C ++ не можуть повернути масиви у стилі C за значенням. Найближче - повернути вказівник. Крім того, тип масиву зі списку аргументів просто перетворюється на покажчик.

int *fillarr( int arr[] ) { // arr "decays" to type int *
    return arr;
}

Ви можете покращити його, використовуючи посилання масиву для аргументу та повернення, що запобігає розпаду:

int ( &fillarr( int (&arr)[5] ) )[5] { // no decay; argument must be size 5
    return arr;
}

З Boost або C ++ 11 перехід посилань є лише необов’язковим, а синтаксис - менш вигинним:

array< int, 5 > &fillarr( array< int, 5 > &arr ) {
    return arr; // "array" being boost::array or std::array
}

arrayШаблон просто генерує structмістить масив C-стилі, так що ви можете застосувати об'єктно-орієнтованої семантикою ще зберігають первісну простоту масиву.


4
+1 для прикладу того, як масив можна передавати за посиланням. Але ви помиляєтеся в тому, що не можете повернути масив за посиланням. Найпростіший синтаксис для її досягнення є використанням ЬурейеЕ: typedef int array[5]; array& foo();Але ви навіть не потрібні ЬурейеЕ , якщо ви дбаєте , щоб написати це: int (&foo())[5] { static int a[5] = {}; return a; }, приклад в цьому питанні буде: int (&foo( int (&a)[5] ))[5] { return a; }. Просто, чи не так?
Девід Родрігес - дрибес

@David: спасибі, я отримав неправильне вираження у повідомленні Comeau, error: function returning array is not allowedяке виникає, якщо ви залишите зовнішні паролі в синтаксисі non-typedef. На щастя, сьогодні я ознайомився з правим лівим правилом для іншого питання і зумів побудувати правильну річ… після того, як побачив, що ти кажеш, що це можливо… перш ніж побачити, що ти дав код: vP.
Potatoswatter

1
Відповідь chubsdad містить правильну цитату зі стандарту: ви не можете повернути масив, але ви можете повернути посилання або вказівник на масив. Масиви не можна скопіювати (як тип), тому вони не можуть бути повернені - що означало б копію - і коли цей синтаксис присутній, компілятор перетворить аргумент у покажчик.
Девід Родрігес - дрибес

3
@David: Так і є. Ця сторінка стає химерно довгою. Ніколи так багато людей добровільно не написали стільки тривіальних функцій, що повертають масив в одному місці.
Potatoswatter

@Potatoswatter Я новачок у cpp, чи можете ви детально пояснити другий фрагмент коду? Я не в змозі розбити це на частини заради розуміння.
KPMG

23

У C ++ 11 можна повернутися std::array.

#include <array>
using namespace std;

array<int, 5> fillarr(int arr[])
{
    array<int, 5> arr2;
    for(int i=0; i<5; ++i) {
        arr2[i]=arr[i]*2;
    }
    return arr2;
}

2
Цитуючи OP:(...) you can consider the array returned arr2, totally another array (...)
cubuspl42

22

8,3,5 дол. США / 8 штатів-

"Функції не повинні мати тип повернення типу масиву або функції, хоча вони можуть мати тип повернення вказівника типу або посилання на такі речі. Масивів функцій не повинно бути, хоча можуть бути масиви покажчиків на функції."

int (&fn1(int (&arr)[5]))[5]{     // declare fn1 as returning refernce to array
   return arr;
}

int *fn2(int arr[]){              // declare fn2 as returning pointer to array
   return arr;
}


int main(){
   int buf[5];
   fn1(buf);
   fn2(buf);
}

7
Ваша друга функція повертає вказівник на intмасив, а не на масив.
GManNickG

знову ж таки, навіщо повертати тип, коли фактичний масив оновлюється всередині функції? Це питання найкращої практики?
Dan

14

відповідь може трохи залежати від того, як ви плануєте використовувати цю функцію. Для найпростішої відповіді давайте вирішити, що замість масиву, що ви дійсно хочете, це вектор. Вектори приємні тим, що зовнішній вигляд у всьому світі, як нудні, звичайні значення, ви можете зберігати у звичайних покажчиках. Ми розглянемо інші варіанти та чому ви їх хочете потім:

std::vector<int> fillarr( std::vector<int> arr ) {
    // do something
    return arr;
}

Це зробить саме те, що ви від нього очікуєте. Перевернення полягає в тому, що std::vectorпотрібно піклуватися про те, щоб все було оброблено чисто. Мінус полягає в тому, що це копіює дуже великий обсяг даних, якщо ваш масив великий. Фактично він копіює кожен елемент масиву двічі. спочатку він копіює вектор, щоб функція могла використовувати його як параметр. потім він знову копіює його, щоб повернути його абоненту. Якщо ви можете впоратися з керуванням вектором самостійно, ви можете робити речі трохи простіше. (він може скопіювати його втретє, якщо абонентові потрібно зберегти його в змінній якоїсь форми, щоб зробити більше обчислень)

Схоже, те, що ви насправді намагаєтеся зробити, це просто заповнити колекцію. якщо у вас немає конкретної причини повернути новий екземпляр колекції, не робіть цього. ми можемо це зробити так

void fillarr(std::vector<int> &  arr) {
    // modify arr
    // don't return anything
}

таким чином ви отримуєте посилання на масив, переданий функції, а не приватну його копію. будь-які зміни, внесені в параметр, переглядаються абонентом. Ви можете повернути посилання на нього, якщо хочете, але це насправді не чудова ідея, оскільки це начебто означає, що ви отримуєте щось інше від того, що ви передали.

Якщо вам дійсно потрібен новий екземпляр колекції, але ви хочете уникнути наявності його в стеці (і всі копії, що тягнуть за собою), вам потрібно створити якийсь контракт для того, як обробляється цей екземпляр. найпростіший спосіб зробити це - використовувати розумний вказівник, який зберігає посилання на екземпляр довкола, поки хтось тримається за нього. Це зникає чисто, якщо виходить із сфери застосування. Це виглядатиме так.

std::auto_ptr<std::vector<int> > fillarr( const std::vector<int> & arr) {
    std::auto_ptr<std::vector<int> > myArr(new std::vector<int>);
    // do stuff with arr and *myArr
    return myArr;
}

Здебільшого, використовуючи *myArrтвори ідентично, використовуючи звичайний ванільний вектор. Цей приклад також змінює список параметрів, додаючи constключове слово. Тепер ви отримуєте посилання, не копіюючи його, але ви не можете його змінити, тому абонент знає, що він буде таким же, як і до того, як функція отримала його.

Все це набухає, але ідіоматичний c ++ рідко працює з колекціями в цілому. Більш нормально ви будете використовувати ітератори для цих колекцій. це виглядало б приблизно так

template <class Iterator>
Iterator fillarr(Iterator arrStart, Iterator arrEnd) {
    Iterator arrIter = arrStart;
    for(;arrIter <= arrEnd; arrIter++)
       ;// do something
    return arrStart;
}

Використання цього виглядає трохи дивним, якщо ви не звикли бачити цей стиль.

vector<int> arr;
vector<int>::iterator foo = fillarr(arr.begin(), arr.end());

foo зараз "вказує на" початок модифікованого arr.

Що насправді приємно в тому, що він працює однаково добре у векторному, як на звичайних масивах C, і багатьох інших типах колекції, наприклад

int arr[100];
int *foo = fillarr(arr, arr+100);

Що зараз виглядає дуже багато, як приклади простого вказівника, наведені в іншому місці цього питання.


Синтаксис неправильний, &символ повинен з’являтися після типу:void fillarr(std::vector<int> & arr)
David Rodríguez - dribeas

9

Це:

int fillarr(int arr[])

насправді трактується так само, як:

int fillarr(int *arr)

Тепер, якщо ви дійсно хочете повернути масив, ви можете змінити цей рядок на

int * fillarr(int arr[]){
    // do something to arr
    return arr;
}

Це насправді не повертає масив. ви повертаєте вказівник на початок адреси масиву.

Але пам’ятайте, коли проходите в масиві, ви проходите лише вказівником. Отже, коли ви змінюєте дані масиву, ви фактично змінюєте дані, на які вказує вказівник. Тому перед тим, як пройти в масив, ви повинні усвідомити, що у вас вже є зовні модифікований результат.

напр

int fillarr(int arr[]){
   array[0] = 10;
   array[1] = 5;
}

int main(int argc, char* argv[]){
   int arr[] = { 1,2,3,4,5 };

   // arr[0] == 1
   // arr[1] == 2 etc
   int result = fillarr(arr);
   // arr[0] == 10
   // arr[1] == 5    
   return 0;
}

Я пропоную вам розглянути можливість введення такої функції фільтра, як ця.

int * fillarr(int arr[], int length)

Таким чином ви можете використовувати довжину для заповнення масиву до його довжини, незалежно від того, яка вона є.

Насправді правильно його використовувати. Зробіть щось подібне:

int * fillarr(int arr[], int length){
   for (int i = 0; i < length; ++i){
      // arr[i] = ? // do what you want to do here
   }
   return arr;
}

// then where you want to use it.
int arr[5];
int *arr2;

arr2 = fillarr(arr, 5);

// at this point, arr & arr2 are basically the same, just slightly
// different types.  You can cast arr to a (char*) and it'll be the same.

Якщо все, що ви хочете зробити, це встановити масив на деякі значення за замовчуванням, подумайте про використання вбудованої функції memset.

щось на кшталт: memset ((int *) & arr, 5, sizeof (int));

Поки я на тему, хоча. Ви кажете, що використовуєте C ++. Погляньте на використання stl векторів. Ваш код, ймовірно, буде більш надійним.

Підручників багато. Ось такий, який дає вам уявлення про те, як ними користуватися. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html


Використовуйте std::copyбільше memset, це безпечніше і простіше. (І так само швидко, якщо не швидше.)
GManNickG

5

щоб повернути масив з функції, визначимо цей масив у структурі; Так виглядає приблизно так

struct Marks{
   int list[5];
}

Тепер давайте створимо змінні структури типів.

typedef struct Marks marks;
marks marks_list;

Ми можемо передати масив функції таким чином і призначити їй значення:

void setMarks(int marks_array[]){
   for(int i=0;i<sizeof(marks_array)/sizeof(int);i++)
       marks_list.list[i]=marks_array[i];
}

Ми також можемо повернути масив. Для повернення масиву тип повернення функції повинен мати тип структури, тобто знаки. Це тому, що насправді ми передаємо структуру, яка містить масив. Отже, кінцевий код може виглядати приблизно так.

marks getMarks(){
 return marks_list;
}

5

Це досить давнє запитання, але я збираюся поставити свої 2 центи, оскільки відповіді дуже багато, але жоден не показує всі можливі методи чітко і лаконічно (не впевнений у лаконічному шматочку, оскільки це отримало трохи від руки. TL; DR 😉).

Я припускаю, що ОП хотів повернути масив, який передали без копіювання, як деякий засіб прямої передачі цього виклику, щоб передати його іншій функції, щоб зробити вигляд красивішим.

Однак використовувати такий масив - це дозволити йому розкладатись на покажчик і компілятор розглянути його як масив. Це може призвести до тонких помилок, якщо ви переходите в масив, як функція, очікуючи, що у нього буде 5 елементів, але ваш абонент насправді передає інше число.

Є кілька способів, як можна краще впоратися з цим. Передайте std::vectorабо std::array(не впевнений, чи std::arrayбуло в 2010 році, коли було задано питання). Потім ви можете передати об'єкт як довідник без копіювання / переміщення об'єкта.

std::array<int, 5>& fillarr(std::array<int, 5>& arr)
{
    // (before c++11)
    for(auto it = arr.begin(); it != arr.end(); ++it)
    { /* do stuff */ }

    // Note the following are for c++11 and higher.  They will work for all
    // the other examples below except for the stuff after the Edit.

    // (c++11 and up)
    for(auto it = std::begin(arr); it != std::end(arr); ++it)
    { /* do stuff */ }

    // range for loop (c++11 and up)
    for(auto& element : arr)
    { /* do stuff */ }

    return arr;
}

std::vector<int>& fillarr(std::vector<int>& arr)
{
    for(auto it = arr.begin(); it != arr.end(); ++it)
    { /* do stuff */ }
    return arr;
}

Однак якщо ви наполягаєте на грі з масивами С, тоді використовуйте шаблон, який зберігатиме інформацію про кількість елементів у масиві.

template <size_t N>
int(&fillarr(int(&arr)[N]))[N]
{
    // N is easier and cleaner than specifying sizeof(arr)/sizeof(arr[0])
    for(int* it = arr; it != arr + N; ++it)
    { /* do stuff */ }
    return arr;
}

За винятком того, що виглядає неподалік потворно, і важко читати. Зараз я використовую щось, щоб допомогти з тим, чого не було в 2010 році, і який я також використовую для покажчиків функцій:

template <typename T>
using type_t = T;

template <size_t N>
type_t<int(&)[N]> fillarr(type_t<int(&)[N]> arr)
{
    // N is easier and cleaner than specifying sizeof(arr)/sizeof(arr[0])
    for(int* it = arr; it != arr + N; ++it)
    { /* do stuff */ }
    return arr;
}

Це переміщує тип, де можна було б очікувати, що це буде, роблячи це набагато легше для читання. Звичайно, використання шаблону є зайвим, якщо ви не збираєтесь використовувати нічого, крім 5 елементів, тож ви, звичайно, можете жорстко кодувати його:

type_t<int(&)[5]> fillarr(type_t<int(&)[5]> arr)
{
    // Prefer using the compiler to figure out how many elements there are
    // as it reduces the number of locations where you have to change if needed.
    for(int* it = arr; it != arr + sizeof(arr)/sizeof(arr[0]); ++it)
    { /* do stuff */ }
    return arr;
}

Як я вже сказав, моя type_t<>хитрість не спрацювала б на той час, коли це питання було задано. Найкраще, на що ви могли сподіватися, - це використовувати тип у структурі:

template<typename T>
struct type
{
  typedef T type;
};

typename type<int(&)[5]>::type fillarr(typename type<int(&)[5]>::type arr)
{
    // Prefer using the compiler to figure out how many elements there are
    // as it reduces the number of locations where you have to change if needed.
    for(int* it = arr; it != arr + sizeof(arr)/sizeof(arr[0]); ++it)
    { /* do stuff */ }
    return arr;
}

Що знову починає виглядати досить потворно, але, принаймні, ще читабельніше, хоча, typenameможливо, воно було необов’язковим і тоді, залежно від компілятора, в результаті чого:

type<int(&)[5]>::type fillarr(type<int(&)[5]>::type arr)
{
    // Prefer using the compiler to figure out how many elements there are
    // as it reduces the number of locations where you have to change if needed.
    for(int* it = arr; it != arr + sizeof(arr)/sizeof(arr[0]); ++it)
    { /* do stuff */ }
    return arr;
}

І тоді, звичайно, ви могли вказати конкретний тип, а не використовувати мого помічника.

typedef int(&array5)[5];

array5 fillarr(array5 arr)
{
    // Prefer using the compiler to figure out how many elements there are
    // as it reduces the number of locations where you have to change if needed.
    for(int* it = arr; it != arr + sizeof(arr)/sizeof(arr[0]); ++it)
    { /* do stuff */ }
    return arr;
}

Тоді вільних функцій std::begin()і std::end()не було, хоча можна було легко реалізувати. Це дозволило б ітерацію над масивом безпечнішим чином, оскільки вони мають сенс на масиві C, але не вказівник.

Що стосується доступу до масиву, ви можете або передати його іншій функції, яка приймає той же тип параметра, або зробити псевдонім йому (що не мало б сенсу, оскільки у вас вже є оригінал у цій області). Доступ до посилання на масив - це подібно до доступу до вихідного масиву.

void other_function(type_t<int(&)[5]> x) { /* do something else */ }

void fn()
{
    int array[5];
    other_function(fillarr(array));
}

або

void fn()
{
    int array[5];
    auto& array2 = fillarr(array); // alias. But why bother.
    int forth_entry = array[4];
    int forth_entry2 = array2[4]; // same value as forth_entry
}

Підводячи підсумок, найкраще не допускати розпаду масиву в покажчик, якщо ви маєте намір повторити його. Це просто погана ідея, оскільки вона перешкоджає компілятору захищати вас від стрілянини в ногу і робить ваш код важчим для читання. Завжди намагайтеся допомогти компілятору допомогти вам, зберігаючи типи якомога довше, якщо у вас немає дуже вагомих причин цього не робити.

Редагувати

О, і для повноти ви можете дозволити його погіршити до вказівника, але це відокремлює масив від кількості елементів, які він містить. Це робиться багато в C / C ++ і зазвичай пом'якшується, передаючи кількість елементів у масиві. Однак компілятор не може допомогти вам, якщо ви помилитесь і передаєте неправильне значення кількості елементів.

// separate size value
int* fillarr(int* arr, size_t size)
{
    for(int* it = arr; it != arr + size; ++it)
    { /* do stuff */ }
    return arr;
}

Замість передачі розміру ви можете передавати кінцевий покажчик, який буде вказувати на один минулий кінець вашого масиву. Це корисно, оскільки це робить для чогось, що ближче до алгоритмів std, які починають і вказувати кінець, але те, що ви повертаєтесь, - це лише те, що ви повинні пам’ятати.

// separate end pointer
int* fillarr(int* arr, int* end)
{
    for(int* it = arr; it != end; ++it)
    { /* do stuff */ }
    return arr;
}

Крім того, ви можете задокументувати, що ця функція займе лише 5 елементів і сподіваєтесь, що користувач вашої функції не зробить нічого дурного.

// I document that this function will ONLY take 5 elements and 
// return the same array of 5 elements.  If you pass in anything
// else, may nazal demons exit thine nose!
int* fillarr(int* arr)
{
    for(int* it = arr; it != arr + 5; ++it)
    { /* do stuff */ }
    return arr;
}

Зауважте, що повернене значення втратило початковий тип і деградує до покажчика. Через це, ви тепер самостійно переконаєтесь, що ви не збираєтеся перевиконувати масив.

Ви можете передати a std::pair<int*, int*>, який ви можете використовувати для початку та кінця і пропустити його навколо, але тоді він справді перестає виглядати як масив.

std::pair<int*, int*> fillarr(std::pair<int*, int*> arr)
{
    for(int* it = arr.first; it != arr.second; ++it)
    { /* do stuff */ }
    return arr; // if you change arr, then return the original arr value.
}

void fn()
{
    int array[5];
    auto array2 = fillarr(std::make_pair(&array[0], &array[5]));

    // Can be done, but you have the original array in scope, so why bother.
    int fourth_element = array2.first[4];
}

або

void other_function(std::pair<int*, int*> array)
{
    // Can be done, but you have the original array in scope, so why bother.
    int fourth_element = array2.first[4];
}

void fn()
{
    int array[5];
    other_function(fillarr(std::make_pair(&array[0], &array[5])));
}

Як не дивно, це дуже схоже на те, як std::initializer_listпрацюють (c ++ 11), але вони не працюють у цьому контексті.


3

Найпростіший спосіб зробити це - повернути його за посиланням, навіть якщо ви не пишете символ "&", він автоматично повертається за допомогою посилання

     void fillarr(int arr[5])
  {
       for(...);

  }

2
int *fillarr(int arr[])

Ви все одно можете використовувати такий результат

int *returned_array = fillarr(some_other_array);
if(returned_array[0] == 3)
    do_important_cool_stuff();

Я не думаю, що "int [] fillarr ..." є законним. 'Int * fillarr' - це те, що ви б використали завдяки еквівалентності масиву-вказівника.
морський пісок

1

Як зазначені вище шляхи правильні. Але я думаю, якщо ми просто повернемо локальну змінну масиву функції, іноді вона повертає значення сміття як її елементи.

щоб уникнути того, що мені довелося динамічно створювати масив і продовжувати. Що таке щось подібне.

int* func()
{
  int* Arr = new int[100];
  return Arr;
}

int main()
{
  int* ArrResult = func();
  cout << ArrResult[0] << " " << ArrResult[1] << endl;
  return 0;
} 




0

0

Джерело: https://www.tutorialspoint.com/cplusplus/cpp_return_arrays_from_functions.htm

C ++ не дозволяє повернути весь масив як аргумент функції. Однак ви можете повернути вказівник на масив, вказавши ім'я масиву без індексу.

  1. Якщо ви хочете повернути одновимірний масив з функції, вам доведеться оголосити функцію, що повертає вказівник, як у наступному прикладі:
int * myFunction()    {
   .
   .
   .
}
  1. C ++ не рекомендує повертати адресу локальної змінної за межі функції, тому вам доведеться визначити локальну змінну як статичну змінну.

Застосовуючи ці правила до поточного питання, ми можемо написати програму так:

# include <iostream>

using namespace std;

int * fillarr( );


int main ()
{

   int *p;

   p = fillarr();

   for ( int i = 0; i < 5; i++ )
       cout << "p[" << i << "] : "<< *(p + i) << endl;

    return 0;
}


int * fillarr( )
{
    static int  arr[5];

    for (int i = 0; i < 5; ++i)
        arr[i] = i;

    return arr;
 }

Вихід буде:

p[0]=0
p[1]=1
p[2]=2
p[3]=3
p[4]=4

0

а як щодо:

int (*func())
{
    int *f = new int[10] {1,2,3};

    return f;
}

int fa[10] = { 0 };
auto func2() -> int (*) [10]
{
    return &fa;
}

0

Насправді, коли ви передаєте масив всередині функції, вказівник на початковий масив передається в параметрі функції, і таким чином зміни, внесені до масиву всередині цієї функції, фактично вносяться в початковий масив.

#include <iostream>

using namespace std;

int* func(int ar[])
{
    for(int i=0;i<100;i++) 
        ar[i]=i;
    int *ptr=ar;
    return ptr;
}


int main() {
    int *p;
    int y[100]={0};    
    p=func(y);

    for(int i=0;i<100;i++) 
        cout<<i<<" : "<<y[i]<<'\n';
}

Запустіть його, і ви побачите зміни


1
Будь ласка, використовуйте належну англійську формулювання (ви замість ull) і пропустіть порожні фрази типу "приятель".
привіт

Також: "тоді насправді це передається як посилання" є неправильним. Сама змінна yпередається як копія самої себе, але оскільки це вказівник, ви будете безпосередньо працювати над масивом. Відредагуйте свою відповідь.
привіт

stackoverflow.com/questions/5573310/… TL; DR "Таким чином, дві форми однакові".
привіт

Так, це технічно масив, ви маєте рацію, але те, що скопійовано, - це вказівник на масив, а не на сам масив.
привіт

0

Ось повний приклад подібної проблеми для вирішення

#include <bits/stdc++.h>
using namespace std;
int* solve(int brr[],int n)
{
sort(brr,brr+n);
return brr;
}

int main()
{
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
{
    cin>>arr[i];
}
int *a=solve(arr,n);
for(int i=0;i<n;i++)
{
    cout<<a[i]<<endl;
}

return 0;
}

-2

Просто визначте тип [] як повернене значення, наприклад:

        private string[] functionReturnValueArray(string one, string two)
    {

        string[] x = {one, two};


        x[0] = "a";
        x[1] = "b";

        return x;
    }

. . . виклик функції:

string[] y;
y = functionReturnValueArray(stringOne, stringTwo)

5
Це не C ++
Адріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.