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

Обмен значений 2 указателей в функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:02     Обмен значений 2 указателей в функции #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
#include <iostream>
using namespace std;
 
template <typename T>
void swap1 (T *a, T *b)
{
    T *temp_a = a;
    a = b;
    b = temp_a;
}
 
int main(int argc, char ** argv)
{
    int a(5), b(6);
    int *pa = &a;
    int *pb = &b;
 
    cout << pa << " " << pb << endl;
        swap1 (pa, pb);
        cout << pa << " " << pb << endl;
 
    return 0;
}
Однако функция не производит взаимный обмен адресов двух укзателей. Подскажите в чём проблема!

Заранее благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.12.2012, 18:15     Обмен значений 2 указателей в функции #2
В том, что все передается по значение. И указатель тоже передается по значению, следовательно вызываемая функция получает локальную копию значения указателя, и все изменения этой локальной копии видны только ей.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
02.12.2012, 18:16     Обмен значений 2 указателей в функции #3
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Однако функция не производит взаимный обмен адресов двух укзателей. Подскажите в чём проблема!
В функцию передается копия указателя.

Добавлено через 26 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
template <typename T>
void swap1 (T **a, T **b)
{
    T *temp_a = *a;
    *a = *b;
    *b = temp_a;
}
 
int main(int argc, char ** argv)
{
    int a(5), b(6);
    int *pa = &a;
    int *pb = &b;
 
    cout << pa << " " << pb << endl;
        swap1 (&pa, &pb);
        cout << pa << " " << pb << endl;
 
    return 0;
}
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:16  [ТС]     Обмен значений 2 указателей в функции #4
Croessmah, поясни ,пожалуйста, про формальные и фактические параметры функции swap1.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:18     Обмен значений 2 указателей в функции #5
Croessmah, в указателе на указатель нет необходимости
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
template <typename T>
void swap1 (T *a, T *b)
{
    T temp_a = *a;
    *a = *b;
    *b = temp_a;
}
 
int main(int argc, char ** argv)
{
    int a(5), b(6);
    int *pa = &a;
    int *pb = &b;
 
    cout << *pa << " " << *pb << endl;
        swap1 (&pa, &pb);
        cout << *pa << " " << *pb << endl;
 
    return 0;
}
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:27  [ТС]     Обмен значений 2 указателей в функции #6
Я таким образом хотел поменять поэлементно 2 массива. Просто изменив адреса имени массива. Вышепредложенные варианты будут работать?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:35     Обмен значений 2 указателей в функции #7
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Просто изменив адреса имени массива.
чего-чего?
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Вышепредложенные варианты будут работать?
возьми да проверь
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:40  [ТС]     Обмен значений 2 указателей в функции #8
Варианты не работают(

int a[] - массив из элементов целочисленного типа.
int b[] - массив из элементов целочисленного типа.

a и b - это указатели на начало массива.
Я хотел поэлементно обменять массивы при помощи вот этого кода
C++
1
2
3
int * temp_p = a;
a = b;
b = temp_p;
Идея о реализации этого способа имеет шансы на существование?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:46     Обмен значений 2 указателей в функции #9
указатель на массив ты никак не поменяшь, вводи обычные указатели которые указывают на начало массива и работай с ними
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
#include <iostream>
 
template <typename T>
void swap1 (T *a, T *b)
{
    T temp_a = *a;
    *a = *b;
    *b = temp_a;
}
 
int main(int argc, char ** argv)
{
    const int size = 5;
    int a[size] = { 1, 2, 3, 4, 5 };
    int b[size] = { 5, 4, 3, 2, 1 };
 
    int *pa = a, *pb = b;
 
    swap1(&pa, &pb);
 
    for (int i = 0; i < size; ++i)
        std::cout << pa[i] << ' ';
    std::cout << std::endl;
    for (int i = 0; i < size; ++i)
        std::cout << pb[i] << ' ';
 
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 16:10     Обмен значений 2 указателей в функции
Еще ссылки по теме:

Взаимный обмен значений указателей в параметрах функции C++
C++ Массив указателей на функции
Массив указателей на функции C++

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

Или воспользуйтесь поиском по форуму:
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
04.12.2012, 16:10  [ТС]     Обмен значений 2 указателей в функции #10
Решил проблему вот этим кодом. В объявлении массива использовал оператор new.
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
#include <iostream>
using namespace std;
 
template <typename T>
void swap (T **a, T **b)
{
    T *temp_p = *a;
    *a = *b;
    *b = temp_p;
}
 
template <typename T>
void show (T* g, const int _size)
{
    for (int i = 0; i < _size; ++i, ++g)
    {
        cout << (*g) << " ";
    }
 
    cout << endl;
    cout << "===========" << endl;
}
 
template <typename T>
void init (T a[], const int size)
{
    for (int i = 0; i < size; ++i)
        a[i] = (T)(rand() % 100 + 1);
}
 
int main (int argc, char ** argv)
{
    srand(time(NULL));
//   =========
//      INT
//   =========
    const int size = 5;
    int *pA = new int[size];
    int *pB = new int[size];
 
    init (pA, size);
    init (pB, size);
 
    show (pA, size);
    show (pB, size);
 
    swap (pA, pB);
 
    show (pA, size);
    show (pB, size);
 
    return 0;
}
Спасибо всем. Тему можно закрывать.
Yandex
Объявления
04.12.2012, 16:10     Обмен значений 2 указателей в функции
Ответ Создать тему
Опции темы

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