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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
#1

Операции над указателями - C++

27.01.2013, 12:11. Просмотров 1835. Ответов 10
Метки нет (Все метки)

C
1
2
int var = 123; 
int *p = &var;
(*p)++ и ++*p это одно и тоже. В первом случае приоритет задал скобками.
1)Тогда почему *p++ и *p=*p+1 это не одно и тоже? Почему в первом случае мы сдвигаем адрес памяти, а во втором значение переменной?
2). Почему когда я пишу *p++ у меня выводится именно адрес памяти? По сути же ведь сначала тут идёт разыменование, т.е. получаем число 123 и увеличиваем его затем на 1, и получиться должно 124, но такого не происходит, выводится адрес памяти.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 12:11     Операции над указателями
Посмотрите здесь:

Указатели и действия над указателями - C++
char *ptr, result, s1; ptr = strtok(s1, " "); if (strstr(result, strcpy(" ", strcpy(ptr, " "))) == NULL) strcat_s(result,...

Операции с указателями в С++ - C++
Используя приведенный ниже код разработать программу, используя в качестве контейнера для хранения данных динамические массивы. Для...

Операции с указателями - C++
Задание.Создать указатель *ptr на целочисленную переменную и присвоить число 100. Скопировать значения указателя *ptr в указатель *ptr2....

Операции с указателями - C++
Собственно вопрос : есть функция void vyvod(char* prov) { printf("%s", prov); } и есть функция void...

Операции над строками - C++
Заменить в ленте s, начиная с позиции n, все большие буквы на маленькие

Операции над множествами - C++
Прошу помочь с написанием программы на с++. Нужно чтобы выполнялись операции над множествами, такие как: объединение, пересечение и...

Операции над множествами - C++
Найти A B C, A ∩ B ∩ C, (A ∩ B) C, A ∩ (B C), если A={{1;2},{1;3},{2}}, B={{1;2;4},{2;3},{1}}, C={{1;3},{1}} Как вручную...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
derrserg
5 / 2 / 1
Регистрация: 20.12.2012
Сообщений: 14
27.01.2013, 12:15     Операции над указателями #2
приоритет ++ выше, а не равен разыменованию
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
27.01.2013, 12:16  [ТС]     Операции над указателями #3
Цитата Сообщение от derrserg Посмотреть сообщение
приоритет ++ выше, а не равен разыменованию
Постфиксный инкремент стоит на самом последнем месте по таблице приоритетов: http://white-knight-is-alive.blogspo...blog-post.html Вот я и понять не могу.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 15:35     Операции над указателями #4
aleksandr_t94, судя по Приоритет операций С или Приоритет операций Срр у постфиксного инкремента приоритет выше, чем у разыменования.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
27.01.2013, 15:55  [ТС]     Операции над указателями #5
Цитата Сообщение от Schizorb Посмотреть сообщение
aleksandr_t94, судя по Приоритет операций С или Приоритет операций Срр у постфиксного инкремента приоритет выше, чем у разыменования.
Ну тогда вы меня совсем запутали что к чему. Давайте ещё разок. Объясните пожалуйста с этим указателем как и что, а то что-то совсем плохо((
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 16:05     Операции над указателями #6
*p++

Сначала выполнится инкремент p, то есть увеличивается на 1 сам указатель. Но раз используется постфиксная форма, то возвращаемым значением операции p++ будет прежний адрес, то есть адрес переменной var.

Затем происходит разыменование, оно возвращает значение var.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
27.01.2013, 16:12  [ТС]     Операции над указателями #7
Цитата Сообщение от Schizorb Посмотреть сообщение
*p++

Сначала выполнится инкремент p, то есть увеличивается на 1 сам указатель. Но раз используется постфиксная форма, то возвращаемым значением операции p++ будет прежний адрес, то есть адрес переменной var.

Затем происходит разыменование, оно возвращает значение var.
Да, согласен, но это если использовать *p++ в самом printf. Я написал пример, и тут мне выводится какая-то фигня в виде адреса ячейки памяти(не уверен). А вот если я буду использовать ++*p, то выведется ровно 124, т.е. будет инкремент. Вот я и запутался. Объясните пожалуйста почему если *p++ то выводит фигня, а если ++*p то выводит 124?
C
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    int a=123;
    int *p=&a;
    *p++;
    printf("%d\n",*p);
 
    return 0;
}
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.01.2013, 16:19     Операции над указателями #8
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Объясните пожалуйста почему если *p++ то выводит фигня, а если ++*p то выводит 124?
Потому что указатель сдвинулся с помощью инкремента и указывает теперь на какую-то фигню.

++*p работает по-другому. Приоритет префиксного инкремента и операции разыменования одинаков, а выполняться они, исходя из их ассоциативности, будут справа налево. То есть, сначала разыменуется указатель, а к полученному объекту применится инкремент. Значит значение переменной увеличилось на 1, а указатель указывает туда же, куда и указывал.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
27.01.2013, 16:26  [ТС]     Операции над указателями #9
Цитата Сообщение от Schizorb Посмотреть сообщение
Потому что указатель сдвинулся с помощью инкремента и указывает теперь на какую-то фигню.

++*p работает по-другому. Приоритет префиксного инкремента и операции разыменования одинаков, а выполняться они, исходя из их ассоциативности, будут справа налево. То есть, сначала разыменуется указатель, а к полученному объекту применится инкремент. Значит значение переменной увеличилось на 1, а указатель указывает туда же, куда и указывал.
Теперь понял. Хорошо разъяснили. То есть в данном случае: *p++ это тоже самое что *(p++) - сдвигаем указатель и он указывает а область памяти, затем разыменовываем и у нас получается фигня)) Верно?
Schizorb
27.01.2013, 17:40
  #10

Не по теме:

aleksandr_t94, верно.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 21:58     Операции над указателями
Еще ссылки по теме:

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

Реализовать операции над множествами - C++
Собственно только началась учеба на первом курсе,и вот препод задал написать програму,которая реализует все действия над...

Операции над натуральными числами - C++
Привет всем, я новенький как на форуме так и на в программировании. Начал изучать с++ 2 недели назад,самоучка, так что сильно не кричите)) ...

Операции над однонаправленным списком - C++
В лабораторній роботі необхідно організувати однонапрямлений список із структурою взятої із лабораторної роботи №1 згідно з варіантом та...

Операции над динамическим массивом - C++
Написать программу, которая будет создавать массив, длина которого задается с клавиатуры, и предлагать 3 операции: добавить данные в...


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

Или воспользуйтесь поиском по форуму:
derrserg
5 / 2 / 1
Регистрация: 20.12.2012
Сообщений: 14
27.01.2013, 21:58     Операции над указателями #11
Тут раздел "Приоритеты операций"

http://ru.wikipedia.org/wiki/%D0%A1%...D%D0%B8%D1%8F))
Yandex
Объявления
27.01.2013, 21:58     Операции над указателями
Ответ Создать тему
Опции темы

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