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

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

Войти
Регистрация
Восстановить пароль
 
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
#1

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

20.02.2012, 17:43. Просмотров 509. Ответов 5
Метки нет (Все метки)

Собственно столкнулся со следующей проблемой, код выглядит так:
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 совершенно другие цифры. Буду рад если объясните в чем дело )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2012, 17:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неверно работает код *ptr++ = *ptr2++ (C++):

Код по алгоритму, приведенному тут:) Работает неверно - C++
Здравствуйте! Вот, собственно алгоритм, вот код, вроде должно работать:( Обрабатывается массив p_Q int * c = new int ; int...

Ошибка на стадии выполнения ptr = ptr; - C++
class CObject { friend Parser; // много полей методов, все должны заполняться в парсере } class Parser { CObject * object_...

Код неверно выводит массивы - C++
всем привет. в общем у меня такая проблема: установил Visual Studio 2013, начал на нем познавать язык С++, и тут такая проблема, когда я...

Программа написана, но работает неверно - C++
Программа написана, но работает неверно. Ввести символьную строку и заменить все буквы &quot;а&quot; на буквы &quot;b&quot; и наоборот, как заглавные, так и...

программа по непонятным мне причинам работает неверно - C++
#include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; int main() { setlocale(LC_ALL,...

bad ptr - C++
Здравствуйте! Пишу небольшую программу для работы с текстом. При substr'е куска строки вывелся не только нужный мне кусок, но и немного...

5
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.02.2012, 17:50 #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 байта назад
0
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 17:53  [ТС] #3
Т.е. получается что инкремент *p1++ происходил сразу после *p1++ = *p2++;, а не после итерации ?
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
20.02.2012, 17:57 #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;
}
0
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 18:02  [ТС] #5
а почему не получается после цикла обращаться к p1 через индексы ? там совсем не то лежит. и зачем нужен p3? ведь он указывает на p1 ?
0
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 19:27  [ТС] #6
Я разобрался что происходит в этом цикле )) . При инкременте p1 по окончании цикла он указывает на область памяти следующую за последним элементом. Поэтому в коде приведенном easybudda, создается ещё один указатель p3 на начало p1. Так же можно сбросить p1 при помощи p1 -= size;
0
20.02.2012, 19:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2012, 19:27
Привет! Вот еще темы с ответами:

Unique ptr в классе - C++
Добрый вечер, есть ли реальное решение придерживаться правилу нуля и иметь в классе std::unique_ptr ?

Значение указателей (*ptr.) на пустые ячейки памяти - C++
Здравствуйте, уважаемые форумчане! С началом изучения С++ стало возникать множество вопросов. Когда резервируется свободная память...

Код написан в Dev C. Не работает в Visual. Как нужно переделать код? - C++
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт ошибку. ...

Как динамически обьявить многомерный массив (ptr = new int[5][5])? - C++
как обявить вот такую вот штуку: int * ptr = new int; заранее благодарен Роман.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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