2016-02-03 4 views
0

У меня возникают трудности с передачей динамически выделенного массива функции по ссылке. «Массив должен быть передан функции по ссылке». Моя программа должна принимать n количество целых чисел и узнать минимум. Этот минимум должен быть добавлен ко всем массивам, введенным пользователем. Но часть BY REFERENCE меня убивает. Я попробовал (int & x [], int & n), но не удалось. PLease помогите, большое спасибо.Динамически распределенный массив, передающий функцию по ссылке

void add_min(int x[], int n) 
{ 
    int add[n]; 
    int mini = x[0]; 
    int i; 

    for(i = 0; i < n; i++) 
    { 
     if(x[i] < mini) 
     { 
      mini = x[i]; 
     } 
    } 

    for(i = 0; i < n; i++) 
    { 
     add[i] = x[i] + mini; 
    } 

    for(i = 0; i< n ; i++) 
    { 
     cout<<add[i]<<endl; 
    } 
} 

int main() 
{ 
    int *x; 
    int n; 
    cout<<"Enter the amount of integers"<<endl; 
    cin>>n; 
    x = new int[n]; 

    cout<<"Enter the integers"<<endl; 
    for(unsigned i = 0; i < n; i++) 
    { 
     cin>>x[i]; 
    } 

    add_min(x,n); 

    delete x; 

    return 0; 
} 
+0

есть два варианта: а) использовать 'станд :: VECTOR' вместо массивов B) это домашнее задание и вам не разрешено использовать 'std :: vector', в этом случае ... ну ... вы должны использовать' std :: vector' – user463035818

+0

Если вы используете ссылку, она должна быть ссылкой на известный размер массив, например 'void add_min (int (& x) [10], int n)'. Вы должны использовать ссылку на указатель 'void add_min (int * & x, int n)'. –

+0

Массивы всегда передаются как ссылка, не так ли? Поэтому, если у вас есть функция, которая принимает указатель на массив, вы можете просто передать массив. Не имеет значения, является ли это '& x [0]' или 'x', поскольку они означают одно и то же. Однако я не уверен на 100%. – Zimano

ответ

0

Проблема, которую я вижу здесь следующее пройти в через эталонным а:

динамически распределяемой массив

Единственный способ может иметь динамическое распределение, чтобы случиться через возвращение указатель. Синтаксис для передачи массива в функцию, как вы правильно догадались, это:

void add_min(int x[], int n) { ... } 

Конечно, вы можете рассматривать массив как указатель, а затем вы получите:

void add_min(int* x, int n) { ... } 

Сейчас идет проблема со ссылкой

синтаксис для прохождения в массиве с помощью ссылки на приложения:

void add_min(int (&x)[3]) { ... } 

, но в этом случае вам нужно знать его размер, поэтому массив не распределяется динамически.

Чтобы обойти необходимость знать размер массива, мы можем сделать некоторый шаблон магию, как:

template<int n> 
void add_min(int (&x)[n]) { ... } 

, но опять же, это нужно будет называться со статический выделяемым массивом (int x[124]), не динамический.

Но массивы всегда передаются через ссылку, они никогда не копируются в стек, поэтому ваша версия кода верна.

+0

«Синтаксис для передачи в массив функции, как вы правильно догадались:« Нет, это синтаксис для передачи указателя на функцию. Это уже довольно запутывает. Лучше не путать вещи дальше. – juanchopanza

+0

@juanchopanza Да, вы правы. Я лично предпочитаю писать 'void f (int x [])', если я ожидаю передать что-то, что я знаю, это массив (т. Е. Более одного элемента, выделенного в указателе или фактическом массиве) и 'void f (int * x) ', если я знаю, что то, что я пройду, является адресом единственного' int', обычно предназначенного для возврата значения. Извините за путаницу. – fritzone

2

Динамически выделяемые массивы не могут быть в именованной переменной, и вы не можете ссылаться на них.

Когда вы вызываете new[], массив выделяется где-то в памяти, а вызов возвращает адрес первого объекта в этом массиве. Вы храните адрес в переменной указателя. Указатель не является массивом, он просто указывает на первый элемент.

Вы можете передать указатель со ссылкой на функцию, как это:

void foo(int*& ptr) 

Если ваше задание просит вас передать массив по ссылке, то вы не можете выделить массив динамически. В этом случае, это то, как вы объявляете аргумент, чтобы быть ссылкой на массив:

void foo(int (&arr)[10]) 

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

Если задание требует динамического распределения массива, то они, вероятно, намерены передать указатель по ссылке.

+0

«Динамически выделенные массивы не могут быть в переменной», что вы имеете в виду? – user463035818

+0

@ tobi303 Я изменил это, чтобы указать * named variable *, хотя это может быть излишним. Википедия определяет переменную как * переменная или скаляр - это место хранения в паре с ассоциированным символическим именем *. Динамически выделенные объекты имеют место хранения, но не имеют символического имени. В C++ переменные, имеющие символическое имя, могут иметь статическое или автоматическое хранилище, но, насколько я знаю, вы не можете иметь переменные с динамическим хранилищем. – user2079303

+0

Технически определение википедии исключает ссылки как переменные, поскольку они не определены для хранения, но ссылочные переменные определяются стандартом явно. Я не мог найти общее определение переменной из стандарта. – user2079303

0

Прежде всего, вы используете C++, поэтому вам не следует использовать указатели, но std::vector. Это будет проще, и вы не будете создавать утечки памяти.

Во-вторых, вы передаете указатель, а не массив. Там не то же самое: https://stackoverflow.com/a/1641963/1351828

Значит, вы pssing указатель на первый элемент. Если вы хотите изменить элементы в «массиве», вы можете просто передать указатель по значению. Если вы хотите выделить новый «массив» и изменить его в функции, передать указатель по ссылке:

void add_min(int &x[], int n) 
Смежные вопросы