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

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

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

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

11.04.2014, 23:20. Просмотров 202. Ответов 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; тут же идет присваивание левой части правой, ПОЛУЧАЕТСЯ ЕСЛИ операция '++' стоит в выражении, она выполняется последней всегда?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель (C++):

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

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

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

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

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

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

9
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.04.2014, 23:21 #2
Цитата Сообщение от Gygocopter Посмотреть сообщение
Но программа изменяет и нулевой
лемент, ПОЧЕМУ?
потому что есть постинкремент, а есть преинкремент. Дальше продолжать?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2014, 23:49 #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Дальше продолжать?
Да.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.04.2014, 23:51 #4
alsav22, подожду пока ТС проснется
0
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 00:07  [ТС] #5
Tulosba, продолжай.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 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. После этой инструкции указатель смотрит на следующий элемент.
1
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++) Ведь сначала то что в скобках выполняется!
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2014, 01:00 #8
Gygocopter, лови таблицу приоритетов http://ru.cppreference.com/w/cpp/language/operator_precedence
У постфиксного инкремента приоритет выше, чем у разыменования и выполняется он раньше. Но логика его поведения такова, что он возвращает СТАРОЕ значение (до изменения).
1
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
12.04.2014, 01:07  [ТС] #9
Но логика его поведения такова, что он возвращает СТАРОЕ значение (до изменения). Вот оно! Спасибо.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.04.2014, 01:14 #10
Как сдвинуть указатель на double на 4 байта?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2014, 01:14
Привет! Вот еще темы с ответами:

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
12.04.2014, 01:14
Ответ Создать тему
Опции темы

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