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

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

Войти
Регистрация
Восстановить пароль
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
#1

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

11.04.2014, 23:20. Просмотров 191. Ответов 9
Метки нет (Все метки)

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     Указатель
Посмотрите здесь:

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

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...

Приведение любого двумерного массива к типу указатель на указатель - C++
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно сделать, чтобы подобные присвоения...

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Указатель на указатель, класс группа - C++
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то... но исправить не получается //4. В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.04.2014, 23:21     Указатель #2
Цитата Сообщение от Gygocopter Посмотреть сообщение
Но программа изменяет и нулевой
лемент, ПОЧЕМУ?
потому что есть постинкремент, а есть преинкремент. Дальше продолжать?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2014, 23:49     Указатель #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Дальше продолжать?
Да.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.04.2014, 23:51     Указатель #4
alsav22, подожду пока ТС проснется
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 00:07  [ТС]     Указатель #5
Tulosba, продолжай.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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     Указатель
Еще ссылки по теме:

Про указатель *, указатель на указатель **, и про new - C++
#include &quot;stdafx.h&quot; class neuro { public: double *inputs; int inputs_count; neuro(int uc, double ii ) { ...

указатель на this - C++
Если в описании метода класа написать list n = *this; list - имя класса, то в n будет содержаться указатель на текущий обьект, ссылка...

Указатель - C++
unsigned short b=0xffff; char *a=malloc(65536); for(int i=0;i&lt;65536;i+=2) { *(a+i)=b; } free(a); Добрый день! ...

Указатель - C++
Можете объяснить устройство работы ,мне казалось что если вызвать просто ptr то должен возвратиться адрес,а если * ptr ,то значение,здесь...


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

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

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