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

Не происходит обмена значениями. В чем проблема? - C++

Восстановить пароль Регистрация
 
Oleg_Brovko
 Аватар для Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
08.04.2012, 14:31     Не происходит обмена значениями. В чем проблема? #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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
using namespace std;
 
void change(int &a, int &b);
 
int main()
{
    int a=1,b=2;
 
    cout<<a<<endl;
    cout<<b<<endl;
 
    change(a,b);
 
    cout<<a<<endl;
    cout<<b<<endl;
 
 
 
 
    return 0;
 
 
 
}
 
void change(int &a, int &b)
{ 
    int* pa=&a;
    int* pb=&b;
    int* pc=NULL;
 
    pc=pa;
    pa=pb;
    pb=pc;
 
    a=*pb;
    b=*pa;
    
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.04.2012, 18:00     Не происходит обмена значениями. В чем проблема? #2
Вы сами себя запутали с этими указателями. Давайте посмотрим, как всё это будет располагаться в памяти:
Пусть переменные a и b лежат в памяти последовательно, в адресах 0x100 и 0x104 соответственно. Пусть мы ввели 10 и 20. Память будет выглядеть так:
Код
|-----|-----|
|0x000|@@@@@|
|-----|-----|
|~~~~~|~~~~~|
|-----|-----|
|0x100|  10 |
|-----|-----|
|0x104|  20 |
|~~~~~|~~~~~|
При передаче ссылок в функцию передаются фактически указатели, т.е. функция "видит" тот же участок памяти. При инициализации указателей получаем:
Код
      |-----|-----|
pc -> |0x000|@@@@@|
      |-----|-----|
      |~~~~~|~~~~~|
      |-----|-----|
pa -> |0x100|  10 |
      |-----|-----|
pb -> |0x104|  20 |
      |~~~~~|~~~~~|
В результате 34-36 строк получаем:
Код
          |-----|-----|
          |0x000|@@@@@|
          |-----|-----|
          |~~~~~|~~~~~|
          |-----|-----|
pc, pb -> |0x100|  10 |
          |-----|-----|
pa     -> |0x104|  20 |
          |~~~~~|~~~~~|
Т.е. указатели мы и правда обменяли местами. Но теперь pa указывает на ячейку, в которой хранится 20 (значение b), а pb наоборот, на ячейку со значением 10 (значение a). Таким образом, в 38 строке мы в а записываем 10, т.е. то, что там уже и было. То же и в 39 строке с b.
Правильная реализация функции swap такая (и никаких указателей):
C++
1
2
3
4
5
6
7
void int_swap(int& a, int& b)
{
    int temp = a;
    
    a = b;
    b = temp;
}
Oleg_Brovko
 Аватар для Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
10.04.2012, 22:45  [ТС]     Не происходит обмена значениями. В чем проблема? #3
Спасибо большое! А можно ли реализовать как-то через указатели?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.04.2012, 22:47     Не происходит обмена значениями. В чем проблема? #4
Oleg_Brovko,
C++
1
2
3
4
5
6
7
void int_ptr_swap(int *a, int *b)
{
    int temp = *a;
    
    *a = *b;
    *b = temp;
}
Oleg_Brovko
 Аватар для Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
10.04.2012, 22:49  [ТС]     Не происходит обмена значениями. В чем проблема? #5
Если знаешь - все просто. Спасибо!
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
10.04.2012, 23:39     Не происходит обмена значениями. В чем проблема? #6
Для общего развития:
для обмена двух переменных одного типа в с++ есть функция swap, пример:
C++
1
2
3
4
5
int x=3;
int y=103;
swap(x,y);
cout<<x;//103
cout<<y;//3
Yandex
Объявления
10.04.2012, 23:39     Не происходит обмена значениями. В чем проблема?
Ответ Создать тему
Опции темы

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