Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
1

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

20.02.2012, 17:43. Просмотров 678. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2012, 17:43
Ответы с готовыми решениями:

Код по алгоритму, приведенному тут:) Работает неверно
Здравствуйте! Вот, собственно алгоритм, вот код, вроде должно работать:( Обрабатывается массив...

Неверно преобразовываю ряд, или же неверно записываю его в код
Задание:Для заданного с консоли значения n определить сумму числового ряда: s=\sum...

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

неверно работает код
&lt;?php include_once 'header.php'; if (!isset($_SESSION)) die (&quot;&lt;br /&gt;&lt;br /&gt; для перегляду...

5
Фрилансер
Эксперт С++
5843 / 1224 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 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
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 17:53  [ТС] 3
Т.е. получается что инкремент *p1++ происходил сразу после *p1++ = *p2++;, а не после итерации ?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10880 / 6770 / 1620
Регистрация: 25.07.2009
Сообщений: 12,485
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
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 18:02  [ТС] 5
а почему не получается после цикла обращаться к p1 через индексы ? там совсем не то лежит. и зачем нужен p3? ведь он указывает на p1 ?
0
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
20.02.2012, 19:27  [ТС] 6
Я разобрался что происходит в этом цикле )) . При инкременте p1 по окончании цикла он указывает на область памяти следующую за последним элементом. Поэтому в коде приведенном easybudda, создается ещё один указатель p3 на начало p1. Так же можно сбросить p1 при помощи p1 -= size;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2012, 19:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему код работает неверно?
Переведенный код namespace atbash { /// &lt;summary&gt; /// Description of MainForm. ///...

Нужно найти символ и заменить его, код работает неверно
Есть строка вида - словослово12r12слово Мне нужно получить - словослово12_r12слово $pattern =...

Что означает ptr в строке byte ptr[si],al
Что означает ptr в строке byte ptr,al Вот весь код, может понадобится Преобразование двоичного...

Byte ptr S+Y не работает, или как обратиться к следующему элементу строки
Приведенный код это часть большей задачи. Мне нужно разобраться, как обратиться к следующему...


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

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

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