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

функция возвращающая аргументу его значение сама по себе - C++

Восстановить пароль Регистрация
 
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
22.02.2013, 16:00     функция возвращающая аргументу его значение сама по себе #1
Глупость, но не иначе не могу объяснить это явление.

гуляя по сайтам наткнулся на пузырьковую сортировку и увидел данный код:
Кликните здесь для просмотра всего текста
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
void BubbleSort (int* a)
{
      int top = 8;
      while (top != 0)
      {
            for (int i = 0; i < top; i++)
            {
                  if (a[i] > a[i+1])
                  {
                    int temp;
                    temp = a[i];
                    a[i] = a[i+1];
                    a[i+1] = temp;
                  }
            }
            top--;
      }
}
 
int arr[9] = { 3, 7, 8, 6, 4, 1, 9, 5, 2};
BubbleSort(arr);
 
for (int i = 0; i < 9; i++)
{
    cout << arr[i] << ", ";
}


внимательно изучив его я заметил одну деталь и решил проверить и что удивительно сработало:
я тут немного изменил чтобы вы поняли суть...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void bla(int* a)
{
     a[0]=11;
     a[1]=12;
}
 
main()
{
  int arr[2]={0,0};
  bla(arr);  
 
  cout<<arr[0]<<" "<<arr[1]; //на выходе получаем что arr[0]=11,а arr[1]=12  почему?
 
 return 0;
}



скомпилировав код можно понять, что переменные arr[0 и 1] станут 11 и 12, но только неизвестно почему?
И почему такой "метод" не работает с обычными переменными(не массивами)?


Вот кратко вопросы:

1) Почему и как это происходит?
2)Почему это работает только на массиве?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 16:00     функция возвращающая аргументу его значение сама по себе
Посмотрите здесь:

C++ что сделать чтобы прога сама по себе открылась?
Функция возвращающая массив C++
C++ Задать аргументу значение по умолчанию
Рекурсивная функция, не возвращающая значение C++
функция, возвращающая ссылку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NIch
 Аватар для NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
22.02.2013, 16:08     функция возвращающая аргументу его значение сама по себе #2
Наверное потому, что "а" это указатель на ячейку памяти, где расположен первый элемент массива.
Ты изменяешь память по данным адресам.
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
22.02.2013, 16:14  [ТС]     функция возвращающая аргументу его значение сама по себе #3
NIch, а по подробнее можно? потому что я даже назвав все переменные словами(разными), то всеравно происходит такая фигня...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.02.2013, 16:18     функция возвращающая аргументу его значение сама по себе #4
Xipxop, Можно вопрос? Для чего пытаться программировать, не попытавшись погуглить/почитать книжку (второе приоритетнее). Указатель описывается в ЛЮБОЙ книге. Имя массива - указатель на его первый элемент. Если вы передадите переменную по указателю/ссылке вы тоже сможете ее изменить.
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
22.02.2013, 16:46  [ТС]     функция возвращающая аргументу его значение сама по себе #5
Тогда осталось несколько вопросов:
1) Как передать значение этой переменной другой функции, НО ЗАЩИТИВ её! (чтобы переменная arr была НЕ тронута)
2) Как сделать это, с обычной переменной?(не массив)

не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void spawn(int *mana)
{
    *mana=9;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int bgs=0;
    spawn(bgs);
    cout << "\nc="<<bgs;
 
 
 
 
    system("pause");
    return 0;
}

так тоже не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void spawn(int *mana)
{
    &mana=9;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int bgs=0;
    spawn(bgs);
    cout << "\nc="<<bgs;
 
 
 
 
    system("pause");
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.02.2013, 16:56     функция возвращающая аргументу его значение сама по себе #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void spawn(int *mana)
{
    *mana=9;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int bgs=0;
    spawn(&bgs);
    cout << "\nc="<<bgs;
 
 
 
 
    system("pause");
    return 0;
}
или

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void spawn(int& mana)
{
    mana=9;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int bgs=0;
    spawn(bgs);
    cout << "\nc="<<bgs;
 
 
 
 
    system("pause");
    return 0;
}
Передать массив защитив от изменения элементарно.

либо

C++
1
void f(int arr[]) { }
либо
C++
1
void f(const int* const* arr) {}
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.02.2013, 17:10     функция возвращающая аргументу его значение сама по себе #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Передать массив защитив от изменения элементарно.
либо
C++
1
void f(int arr[]) { }
И как это защитит массив?

Автор, думаю, хочет изменять элементы массива в функции так, чтобы это не затронуло исходный массив. Так что const тоже вряд ли подойдет. Или копию массива создать и ее передавать, или уж тогда std::vector использовать.
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
22.02.2013, 18:45  [ТС]     функция возвращающая аргументу его значение сама по себе #8
Спасибо!
Не знал бы что без вас делать, раньше ведь думал что так нельзя...

ключевые слова для поиска: указатель на массив.
Тема закрыта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 19:03     функция возвращающая аргументу его значение сама по себе
Еще ссылки по теме:

C++ Функция, возвращающая указатель
C++ Задача (функция возвращающая значение и массивы данных)
C++ Функция возвращающая массив

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.02.2013, 19:03     функция возвращающая аргументу его значение сама по себе #9
Schizorb, Да. В обоих случаях я не прав. Погорячился.
Yandex
Объявления
22.02.2013, 19:03     функция возвращающая аргументу его значение сама по себе
Ответ Создать тему
Опции темы

Текущее время: 21:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru