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

Указатель - C++

Восстановить пароль Регистрация
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
11.04.2014, 23:20     Указатель #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const int MAX = 5;
void f(double*);
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    double array[MAX] = { 10.0, 43.1, 95.9, 58.7, 87.3 };
    f(array);
    for (int i = 0; i < MAX; i++)
        cout << "array [" << i << "]=" << array[i] << " сантиметров" << endl;
    _getch();
    return 0;
}
void f(double *p)
{
    for (int i = 0; i < MAX; i++)
    *p++ *= 2.54;
}
Цитирую: "Операция * и ++ имеют одинаковый приоритет. Однако операции приоритета различаются ассоциативностью. Она определяет, как компилятор начнет выполнять операции, справа или слева. Унарные операции * и ++ имеют правую ассоциативность , компилятор выполняет сначала операцию, стоящую справа. Поэтому наше выражение *p++ интерпретируется как *(p++) и увеличивает указатель, а не то, на что он указывает. Таким образом, сначала увеличивается указатель, а затем к результату применяется операция разыменовывания. "
Получается, что при i=0 указатель указывает на нулевой элемент, теперь мы увеличиваем указатель, т.е. теперь указывает на элемент с индексом 1, применяется разыменование, и уже значение элемента с индексом 1 умножается на 2.54, а нулевой элемент не изменяется. Но программа изменяет и нулевой
лемент, ПОЧЕМУ?


Добавлено через 58 минут
Если сделать *++p, то выполняется сначала увеличение, это понятно.
В примере *p++ *= 2.54; тут же идет присваивание левой части правой, ПОЛУЧАЕТСЯ ЕСЛИ операция '++' стоит в выражении, она выполняется последней всегда?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 23:20     Указатель
Посмотрите здесь:

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. C++
указатель на указатель или присваивание объекта C++
Указатель или ссылка на указатель. В чем разница? C++
C++ Преобразовать указатель одного типа в указатель другого.
Передать в неуправляемую функцию указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.04.2014, 23:21     Указатель #2
Цитата Сообщение от Gygocopter Посмотреть сообщение
Но программа изменяет и нулевой
лемент, ПОЧЕМУ?
потому что есть постинкремент, а есть преинкремент. Дальше продолжать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2014, 23:49     Указатель #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Дальше продолжать?
Да.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.04.2014, 23:51     Указатель #4
alsav22, подожду пока ТС проснется
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 00:07  [ТС]     Указатель #5
Tulosba, продолжай.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.04.2014, 00:24     Указатель #6
Gygocopter,
C++
1
2
3
4
int i = 42;
std::cout << i++ << std::endl; // выводим 42, и увеличиваем на 1
std::cout << i << std::endl; // выводим 43
std::cout << ++i << std::endl; // увеличиваем на 1 и выводим 44.
Что происходит в твоем коде:
C++
1
*p++ *= 2.54;
Увеличиваем значение указателя, но разыменовываем еще не увеличенное значение. Которое потом умножаем на 2.54. После этой инструкции указатель смотрит на следующий элемент.
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 00:52  [ТС]     Указатель #7
Tulosba, получается операция * имеет более высокий приоритет чем постфиксная форма++ ? (Т.Е. всегда выполняется первее, чем постфикс. ++) Но ты написал, сначала увеличиваем указатель, но разыменовываем еще не увеличенное.
Значит в этих строчках ошибка: Цитирую: "Операция * и ++ имеют одинаковый приоритет. Однако операции приоритета различаются ассоциативностью. Она определяет, как компилятор начнет выполнять операции, справа или слева. Унарные операции * и ++ имеют правую ассоциативность , компилятор выполняет сначала операцию, стоящую справа. Поэтому наше выражение *p++ интерпретируется как *(p++) и увеличивает указатель, а не то, на что он указывает. Таким образом, сначала увеличивается указатель, а затем к результату применяется операция разыменовывания. " ?
Тогда вообще получается, что операция ++ увеличивает указатель в самом конце...Это как, если бы написали
C++
1
2
3
4
5
6
void f(double *p)
{
    for (int i = 0; i < MAX; i++)
    *p *= 2.54;
    p++;
}
Короче не пойму, почему СНАЧАЛА увеличиваем указатель, НО РАЗЫМЕНОВЫВАЕМ еще не увеличенное,мы ведь уже увеличили! *(p++) Ведь сначала то что в скобках выполняется!
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.04.2014, 01:00     Указатель #8
Gygocopter, лови таблицу приоритетов http://ru.cppreference.com/w/cpp/lan...tor_precedence
У постфиксного инкремента приоритет выше, чем у разыменования и выполняется он раньше. Но логика его поведения такова, что он возвращает СТАРОЕ значение (до изменения).
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 01:07  [ТС]     Указатель #9
Но логика его поведения такова, что он возвращает СТАРОЕ значение (до изменения). Вот оно! Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2014, 01:14     Указатель
Еще ссылки по теме:

Расскажите, как здесь работает указатель на указатель? C++
Почему указатель на указатель объявляется как float **A; C++
C++ Указатель на указатель и Нарушение прав доступа

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.04.2014, 01:14     Указатель #10
Как сдвинуть указатель на double на 4 байта?
Yandex
Объявления
12.04.2014, 01:14     Указатель
Ответ Создать тему
Опции темы

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