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

Неверно работает код *ptr++ = *ptr2++ - C++

Восстановить пароль Регистрация
 
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 17:43     Неверно работает код *ptr++ = *ptr2++ #1
Собственно столкнулся со следующей проблемой, код выглядит так:
main.cpp
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 std::cout;
using std::endl;
 
int main()
{
    int a[] = {1,23,5,56,7,5};
    int *p2 = a;
    int size = sizeof(a)/sizeof(a[0]);
    int *p1 = new int[size];
 
    cout << "sizeof " << size << endl;
    int i = 0;
    while(p2 != a+size )
    {
        cout << "*p2 " << *p2 << endl;
        *p1++ = *p2++;
        cout << "*p1 " << *p1   << endl;
    }
    cout << p1[1] << ' ' << p1[3];
    return 0;
}

В книжке написано что в цикле while запись
C++
1
*p1++ = *p2++;
копирует в p1 по очереди все элементы из массива а. Но у меня почему-то в p1 совершенно другие цифры. Буду рад если объясните в чем дело )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.02.2012, 17:50     Неверно работает код *ptr++ = *ptr2++ #2
C++
1
2
3
4
5
6
        while(p2 != a+size )
        {
                cout << "*p2 " << *p2 << endl;
                *p1 = *p2++;
                cout << "*p1 " << *p1++   << endl;
        }
Добавлено через 1 минуту
Цитата Сообщение от TonyM Посмотреть сообщение
*p1++ = *p2++;
Вы присвоили указателю значение под адресом "позиция", и сдвинули указатель на позиция + 1
Цитата Сообщение от TonyM Посмотреть сообщение
cout << "*p1 " << *p1 << endl;
Далее вы выводите значение, которое на "позиция + 1", а в нем мусор.

1. вариант или не сдвигать указатель до вывода элемента
2. сдвигать, но потом возвращаться на 4 байта назад
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 17:53  [ТС]     Неверно работает код *ptr++ = *ptr2++ #3
Т.е. получается что инкремент *p1++ происходил сразу после *p1++ = *p2++;, а не после итерации ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.02.2012, 17:57     Неверно работает код *ptr++ = *ptr2++ #4
TonyM,
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
#include <iostream>
 
using std::cout;
using std::endl;
 
int main()
{
        int a[] = {1,23,5,56,7,5};
        int     *p2 = a;
        int size = sizeof(a)/sizeof(a[0]);
        int *p1 = new int[size];
        int *p3 = p1;
 
        cout << "sizeof " << size << endl;
        int i = 0;
        while(p2 != a+size )
        {
               // cout << "*p2 " << *p2 << endl;
                *p1++ = *p2++;
               // cout << "*p1 " << *p1   << endl;
        }
        // cout << p1[1] << ' ' << p1[3];
        cout << "#\tP1\tP2" << endl;
        for ( int i = 0; i < size; ++i )
            cout << i << '\t' << a[i] << '\t' << p3[i] << endl;
        return 0;
}
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 18:02  [ТС]     Неверно работает код *ptr++ = *ptr2++ #5
а почему не получается после цикла обращаться к p1 через индексы ? там совсем не то лежит. и зачем нужен p3? ведь он указывает на p1 ?
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 19:27  [ТС]     Неверно работает код *ptr++ = *ptr2++ #6
Я разобрался что происходит в этом цикле )) . При инкременте p1 по окончании цикла он указывает на область памяти следующую за последним элементом. Поэтому в коде приведенном easybudda, создается ещё один указатель p3 на начало p1. Так же можно сбросить p1 при помощи p1 -= size;
Yandex
Объявления
20.02.2012, 19:27     Неверно работает код *ptr++ = *ptr2++
Ответ Создать тему
Опции темы

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