Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 120, средняя оценка - 4.93
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
#1

Передача массива по ссылке - C++

07.09.2010, 00:10. Просмотров 16693. Ответов 6
Метки нет (Все метки)

Здравствуйте, помогите разобраться с проблемой: Задание состоит в том, чтобы написать две встраиваемые функции сортировки массива с выбором варианта обмена элементов. Первый вариант это передача массива с помощью указателя (это я понял), а вот передача по ссылке никак не получается, получается только передать первый элемент, а вот как дальше перемещаться по массиву не пойму. А в различных темах на форумах разбираются только варианты передачи массива по указателю, а по ссылке везде объясняют, как передаются переменные, а с массивами ничего.Помогите пожалуйста.

Вот что пока получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
 
void random_mass(int *a,int n);
void print_disp(int *a,int n);
void sort(int *a,int n);
void sort1(int &a,int n);
 
 void sort1(int &a,int n)
{
    
}
 
main(){
     clrscr();
     int size;
     cout<<"Введите размерность массива: ";
     cin>>size;
     int choice;
     int *a=new int[size];
     
     random_mass(a,size);
     cout<<"Массив:\n";
     print_disp(a,size);
     cout<<"\n\nВыберите варант обмена (0-по ссылке 1-по указателю): ";
     cin>>choice;
     if (choice) sort(&a[0],size);
///непонятно     else sort(a[0],size);
     cout<<"\nОтсортированный массив:\n";
     print_disp(a,size);
    delete [] a;
    getch();
    return 0;
}
 
void random_mass(int *a,int n)
{
     randomize();
     for (int i=0;i<n;i++)
     a[i]=random(100)-50;
}
 
void print_disp(int *a,int n)
{
     for (int i=0;i<n;i++)
     cout<<a[i]<<" ";
}
 
 void sort(int *a,int n)
{
     for (int i = 1; i < n; i++)
     {
      int t = a[i];
      for (int j = i; j > 0 && a[j-1] > t; j--)
      a[j] = a[j-1];
      a[j] = t;
     }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2010, 00:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача массива по ссылке (C++):

Передача массива по ссылке - C++
Как правильно передавать двумерный статический массив в мои функции? #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; ...

Передача массива в функцию по ссылке - C++
Здравствуйте. Есть функция: void f(int &amp;a) { int *p=&amp;a; p=1; } Но почему-то при попытке передать ей массив ругается...

Передача двумерного массива в функцию по ссылке - C++
Требуется написать функцию, которая выделяет память для одномерного и двумерного динамического массива. Для первого варианта вопросов вроде...

Передача по ссылке двумерного динамического массива в функцию - C++
Приведите, пожалуйста, пример. Нигде не могу найти.

Возможна ли передача двумерного массива в качестве аргумента функции по ссылке - C++
Нужно передать двумерный массив в функцию. Понятно, что можно сделать так: void point_to_matrix(double**A,int n_row,int n_column){ ...

Создание динамического массива, передача аргументов функции по ссылке. Программа обрабатывает результаты матча - C++
Разработать программу, предназначенную для обработки информации о матчах, сыгранных футбольной командой. Количество сыгранных матчей и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.09.2010, 00:19 #2
Гм... Что-то вроде такого...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
void foo(int& a, int size)
{
   int* p=&a;
   for(int i=0; i<size; ++i)
   {
       p[i]=1;
   }
}   
 
 
int main()
{
   int Arr[]={1,2,3,4,5,6};
   foo(*Arr, sizeof(Arr)/sizeof(Arr[0]));
   for(int i=0; i<sizeof(Arr)/sizeof(Arr[0]); ++i)
      std::cout<<Arr[i]<<'\n';
   return 0;
}
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
07.09.2010, 00:55  [ТС] #3
Спасибо за помощь.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2010, 11:02 #4
Lavroff, у тебя ведь передача не массива, а первого элемента массива по ссылке
Vivo, а зачем Вам нужно передавать массив по ссылке?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.09.2010, 12:30 #5
Nameless One, Ну да. Ссылку на массив как-то проблемно организовать. Ссылка вроде как может быть только на элемент. Не?
Там вроде можно через указатель на ссылку или ссылку на указатель... Но утром думать лень
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
07.09.2010, 13:41  [ТС] #6
Nameless One в задании по ООП сказано сделать:
4) Описать функцию сортировки массива по неубыванию любым доступным способом (для обмена использовать функцию в зависимости от выбора пользователя: встраиваемую функцию с аргументами – указателями на меняемые ячейки или встраиваемую функцию с аргументами – ссылками на меняемые ячейки. Функции должны называться одинаково, отличаться лишь аргументами).

Я тоже не пойму зачем делать передачу по ссылке. Так вариант предложенный Lavroff не правильный?
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2010, 17:57 #7
Lavroff, Vivo, массив в С/С++ - это по сути указатель. Если нам необходимо изменить внутри функции содержимое массива (т.е. области памяти, на который он указывает), то нам достаточно передать его по указателю (пример - копирование строк (массивов символов) с помощью функции strcpy). Но если нам необходимо изменить значение самого указателя, то нам нужно передавать этот указатель по ссылке или опять-таки по указателю, так что предположение Lavroff'а верное (про ссылку на указатель). Вот пример - обмен двух значениями двух массивов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
template<class T>
void swapArray(T*& arr1, T*& arr2)
{
    T* temp = arr1;
    arr1 = arr2;
    arr2 = temp;
}
 
int main()
{
    size_t size1 = 5;
    size_t size2 = 3;
    int* arr1 = new int[size1];
    int* arr2 = new int[size2];
    std::cout << "---Before swapping---" << std::endl;
    std::cout << "First array:" << std::endl;
    for(size_t i = 0; i < size1; ++i)
    {
        arr1[i] = i + 1;
        std::cout << arr1[i] << std::endl;
    }
    std::cout << "Second array:" << std::endl;
    for(size_t i = 0; i < size2; ++i)
    {
        arr2[i] = (i + 1) * 2;
        std::cout << arr2[i] << std::endl;
    }
    swapArray(arr1, arr2);
    std::cout << std::endl;
    std::cout << "---After swapping---" << std::endl;
    std::cout << "First array:" << std::endl;
    for(size_t i = 0; i < size2; ++i) // Не забываем, что изменился размер массива arr1
        std::cout << arr1[i] << std::endl;
    std::cout << "Second array:" << std::endl;
    for(size_t i = 0; i < size1; ++i) // Не забываем, что изменился размер массива arr2
        std::cout << arr2[i] << std::endl;
    delete[] arr1;
    delete[] arr2;
    return 0;
}
По сути, здесь не происходит копирование элементов одного массива в другой - просто меняется значение двух указателей.
Nameless One в задании по ООП сказано сделать:
4) Описать функцию сортировки массива по неубыванию любым доступным способом (для обмена использовать функцию в зависимости от выбора пользователя: встраиваемую функцию с аргументами – указателями на меняемые ячейки или встраиваемую функцию с аргументами – ссылками на меняемые ячейки. Функции должны называться одинаково, отличаться лишь аргументами).
Здесь ничего не сказано про ссылку на массив - по сути, это задание на перегрузку функций. Твоя функция обмена должна принимать указатель или ссылку на меняемые ячейки, т.е. на элементы массива, а не на сам массив. Т.е. они должны выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<class T>
void swap(T* a, T* b)
{
    T temp = *a;
    *a = *b;
    *b = temp;
}
//... пример использования:
int a = 5, b = 6;
swap(&a, &b);
 
//...
template<class T>
void swap(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}
//... пример использования
int a = 5, b = 6;
swap(a, b);
Как видно из предыдущего примера, функции называются одинаково, но сигнатуры у них разные, поэтому для компилятора не возникает неопределенности в выборе, какую функцию когда вызвать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2010, 17:57
Привет! Вот еще темы с ответами:

Передача по ссылке - C++
Здравствуйте. 1.typedef struct { MATRIXX_LENTA&lt;double&gt;* MATR; //Ленточная матрица } DATA_LENTA, *PDATA_LENTA; DWORD WINAPI...

Передача по ссылке - C++
С помощью функции rand() округлить значение double и передать его по ссылке.

Передача по ссылке - C++
В учебнике написано, что можно использовать функцию с левой стороны операции присваивания, если она возвращает ссылку. Например, так: ...

Передача параметров по ссылке - C++
Стоит ли передавать все параметры (кроме скалярных и указателей) по сслыке? Т.е. вместо void doSomething(const int _count, const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.09.2010, 17:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru