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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
#1

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

02.12.2012, 18:02. Просмотров 1262. Ответов 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
#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;
}
Однако функция не производит взаимный обмен адресов двух укзателей. Подскажите в чём проблема!

Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 18:02     Обмен значений 2 указателей в функции
Посмотрите здесь:

C++ Передача указателей в функции
C++ Использование указателей на функции
Обмен значений между двумя вещественными переменными. C++
C++ Функция interchange(), которая выполняет обмен значений между двумя переменными
C++ Переделать код так, чтобы использовались диапазоны значений с помощью указателей
C++ Диапазон значений указателей
Взаимный обмен значений указателей в параметрах функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.12.2012, 18:15     Обмен значений 2 указателей в функции #2
В том, что все передается по значение. И указатель тоже передается по значению, следовательно вызываемая функция получает локальную копию значения указателя, и все изменения этой локальной копии видны только ей.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,946
Записей в блоге: 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
Каратель
Эксперт С++
6549 / 3969 / 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
Каратель
Эксперт С++
6549 / 3969 / 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
Каратель
Эксперт С++
6549 / 3969 / 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++ Функция, которая выполняет обмен значений между двумя целочисленными переменными
Преобразование указателей на функции 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 указателей в функции
Ответ Создать тему
Опции темы

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