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

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

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

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

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

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

Взаимный обмен значений указателей в параметрах функции - C++
Необходимо создать шаблонную функцию void f(int *x, float *y) в которой *х - указатель на массив, состоящий из целых чисел, *у -...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Диапазон значений указателей - C++
Здравствуйте! Подскажите пожалуйста, как узнать ограничения на значение указателей в системе?

Различные функции, для которых можно создать массив указателей на функции - C++
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

Обмен значений между двумя вещественными переменными. - C++
Помогите пожалуйста, решить задачи =))) Разработайте процедуру, которая получает через параметры две вещественные переменные х, у и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.12.2012, 18:15 #2
В том, что все передается по значение. И указатель тоже передается по значению, следовательно вызываемая функция получает локальную копию значения указателя, и все изменения этой локальной копии видны только ей.
1
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
02.12.2012, 18:16 #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;
}
1
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:16  [ТС] #4
Croessmah, поясни ,пожалуйста, про формальные и фактические параметры функции swap1.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:18 #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;
}
0
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:27  [ТС] #6
Я таким образом хотел поменять поэлементно 2 массива. Просто изменив адреса имени массива. Вышепредложенные варианты будут работать?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:35 #7
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Просто изменив адреса имени массива.
чего-чего?
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Вышепредложенные варианты будут работать?
возьми да проверь
0
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
02.12.2012, 18:40  [ТС] #8
Варианты не работают(

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

a и b - это указатели на начало массива.
Я хотел поэлементно обменять массивы при помощи вот этого кода
C++
1
2
3
int * temp_p = a;
a = b;
b = temp_p;
Идея о реализации этого способа имеет шансы на существование?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.12.2012, 18:46 #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;
}
0
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
04.12.2012, 16:10  [ТС] #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;
}
Спасибо всем. Тему можно закрывать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 16:10
Привет! Вот еще темы с ответами:

Переделать код так, чтобы использовались диапазоны значений с помощью указателей - C++
Мне уже стыдно сюда писать ей богу :wall: . Но есть задача переделать Код№1 так чтобы использовались диапазоны значений с помощью...

Функция, которая выполняет обмен значений между двумя целочисленными переменными - C++
Задание такое: написать функцию, которая выполняет обмен между двумя целочисленными переменными. Тип аргумента - int*. #include&lt;iostream&gt;...

Функция interchange(), которая выполняет обмен значений между двумя переменными - C++
Нужно написать программу с функцией interchange(), которая выполняет обмен значений между двумя переменными типа int вот то что я...

Массив указателей на функции - C++
Как правильно создать массив? С простыми функциями, где не больше двух параметров, все получается, все работает, а тут в чем-то ошибка. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.12.2012, 16:10
Ответ Создать тему
Опции темы

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