Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2013, 13:55   #1
skad0
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 11
По умолчанию Вопросы с массивами

Доброго времени суток.
В универе начали учить C++, возник вопрос о передаче массивов в функцию.

Когда мы передаем указатель на начало массива - его можно изменять в функции и изменения коснутся всей программы.
А как передавать массив, чтобы его изменение оставалось в пределах 1й функции?

Имеется ввиду, передача массива, как параметра-значения
skad0 вне форума Ответить с цитированием
Старый 07.04.2013, 13:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А в чем собственно задача?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2013, 14:04   #3
skad0
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 11
По умолчанию

Конкретной задачи нет, просто заинтересован можно ли реализовать такое и как.
Т.е. передать в функцию массив так, чтобы его изменение касалось конкретной функции, а не всей программы

Последний раз редактировалось skad0; 07.04.2013 в 14:12.
skad0 вне форума Ответить с цитированием
Старый 07.04.2013, 14:23   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Первое, что пришло в голову - использование вектора:
Код:
#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

void
f(vector<int> b)
{
    cout << "copy of vector a in f:" << endl;
    for (vector<int>::iterator i = b.begin(); i != b.end(); ++i) {
        cout << *i << " ";
    }
    for (vector<int>::iterator i = b.begin(); i != b.end(); ++i) {
        *i = rand() % 100;
    }
    cout << endl << "copy of vector a in f:" << endl;
    for (vector<int>::iterator i = b.begin(); i != b.end(); ++i) {
        cout << *i << " ";
    }
}

int
main()
{
    vector<int> a;
    for (int i = 0; i < 10; ++i) {
        a.push_back(i);
    }
    cout << "vector a in main:" << endl;
    for (vector<int>::iterator i = a.begin(); i != a.end(); ++i) {
        cout << *i << " ";
    }
    cout << endl;
    f(a);
    cout << endl << "vector a in main:" << endl;
    for (vector<int>::iterator i = a.begin(); i != a.end(); ++i) {
        cout << *i << " ";
    }
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.04.2013, 14:25   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от skad0 Посмотреть сообщение
Доброго времени суток.
В универе начали учить C++, возник вопрос о передаче массивов в функцию.

Когда мы передаем указатель на начало массива - его можно изменять в функции и изменения коснутся всей программы.
А как передавать массив, чтобы его изменение оставалось в пределах 1й функции?

Имеется ввиду, передача массива, как параметра-значения
Нельзя передать массив по значению в качестве аргумента функции.
Но ничего не мешает сделать локальную копию массива внутри самой функции.

Пример:

Код:
template<class T, size_t N> 
void Foo ( const T (&src)[N] ) //<--- так выглядит передача ссылки на массив T[N]
{
    T dst[N]; //<--- создаешь копию массива
     for(size_t n=0;n<N;++n)
     {
        dst[n]=src[n]; //<--- заполняешь копию так, как это нужно по задаче. В данном случае - поэлементная копия исходного массива
     }

     ... //<--- дальше работаешь с копией
}
Заодно, выучи как выглядит корявый синтаксис объявления функции, которая возвращает ссылку на массив:

Код:
    template<class T, size_t N>
    T (&GetArray(  /*здесь могут быть аргументы функции*/  )[N]
    {
        static T tmp[N]; //<---- ссылку на этот массив мы вернем
        for(size_t i=0;i<N;++i ) { tmp[i]= 333; }
        return tmp; 
    }
Суть приведенных выше примеров: передача массивов и их возвращение таким образом, что бы сохранялась информация о типе и размерности массива.

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

Последний раз редактировалось _Bers; 07.04.2013 в 14:27.
_Bers вне форума Ответить с цитированием
Старый 07.04.2013, 15:24   #6
skad0
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 11
По умолчанию

Спасибо большое!
skad0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы BubbleBee Общие вопросы C/C++ 2 08.06.2011 02:37
Вопросы по С++ Fantazerishka Общие вопросы C/C++ 2 19.05.2010 06:52
Вопросы ReaktiV Общие вопросы C/C++ 52 03.05.2010 16:38