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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Вывести простые числа от M до N http://www.cyberforum.ru/cpp-beginners/thread164015.html
здравствуйте. хочу понять есть ли у меня ошибки в файле 1.cpp. Условие задачи: вывести все простые числа от M до N включительно. в файле in.txt содержится два натуральных числа M и N (2 <= M <= N <= 10^6). В файле out.txt вывести в одной строке через пробел все простые числа от M до N в порядке возрастания. Если таких чисел нет, вывести «Absent».
C++ Чтение массива объектов и регистрация расширения файла Делаю небольшую программу. Она должна открывать некий файл и обрабатываются данные из него. В общем есть некая структура Object. Из файла считывается число n и нужно создать массив этих Object из n элементов. Плюс, желательно сделать, чтобы можно было открыть файл с помощью моей программы. То есть я дважды щелкаю по файлу и открывается моя программа, выполняя определенные действия с этим... http://www.cyberforum.ru/cpp-beginners/thread163966.html
C++ Алгоритм реализации двоичного дерева
Нужно написать реализацию двоичного дерева с использованием шаблонов в упрощенном виде следуя конвенциям STL контейнеров. Основные операции: вставка, удаление, поиск и итератор. >> Абстрактного шаблонного двоичного дерева? Да >> Вставка, удаление, поиск, итератор соответственно писать самому, не используя STL Да То есть. Суть в том, чтобы написать это все без использования STL, но чтобы...
C++ Чтение из файла и сортировка слов
здравствуйте. у меня вопрос по задаче 1.89:сортировка слов производить только по буквам или по буквам и по длине?
C++ Скрытый параметр - казатель this. http://www.cyberforum.ru/cpp-beginners/thread163946.html
Всё написал так. как было написано в листинге 8.8 книги Jessie Liberty. После нажатия на кноку "компилировать" компилятор выдаёт ошибку. #include <iostream> using namespace std; class Rectangle { public: Rectangle();
C++ Оператор выбора switch.C++. Не могу сообразить,как построить switch... По последним цифрам двух натуральных чисел определить последнюю цифру куба разности этих чисел. #include <iostream> #include <math.h> #include <conio.h> using namespace std; int main() { int x, y; подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2010, 17:57     Передача массива по ссылке
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);
Как видно из предыдущего примера, функции называются одинаково, но сигнатуры у них разные, поэтому для компилятора не возникает неопределенности в выборе, какую функцию когда вызвать.
 
Текущее время: 17:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru