Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
1

Указатели и разыменование

26.05.2013, 23:05. Показов 3401. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я как то раньше не вдавался в эти подробности, разыменование или нет, просто ставил звездочку и все, и для меня было varOne и *varTwo по большому счету одно и тоже, только первое хранилось в памяти до конца роботы программы, а второе для него надо было в начале работы с этой "переменной" выделять область в динамической памяти, а потом, после использования этой "переменной" удалить из области динамической памяти, тем самым освободив память для каких-нибудь других ресурсов, но если разобрать, то это выглядит так:

если мы берем обыкновенную переменную, например varOne = 10 то она имеет свой адрес в ОП, например 00001 и по этому адресу располагается значение 10

Если:
int *varTwo = new int(20);

то мы грубо говоря имеем переменную varTwo которая имеет свой адрес в области ОП, например 00002, но по эту адресу хранится уже НЕ значение (например 20), а адрес на другую ячейку в ОП, например 00003 в которой уже хранится значение 20

если мы пишем cout << varTwo - то нам на экран выведет адрес на который ссылается данный указатель, т.е. 00003

если мы пишем cout << *varTwo - то нам выведет на экран значение, которое хранится по адресу 00003 т.е. 20

если мы пишем cout << &varTwo - то нам на экран адрес самого указателя, т.е. 00002

Все верно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2013, 23:05
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Разыменование
Попался непонятный кусок дизасм кода. Скобки разыменовывают, ptr разыменовывает. Тогда ptr дважды...

Разыменование указателя
Есть некий указатель на объект класса? Class1 *ptr = new Class1(); Можно ли эго разыменовать на...

Ссылка и Разыменование в с++
прошу кто можеть дать видеоурок(или что угодно) на эту тему.я очень затрудняюсь понят это.нужно...

10
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
26.05.2013, 23:10 2
cout << varOne;
выведет значение (10).
cout << &varOne
выведет адрес (0001)

cout << varTwo;
выведет адрес (0002)
cout << *varTwo
выведет значение (20)
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
26.05.2013, 23:13 3
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
26.05.2013, 23:13 4
Цитата Сообщение от VLK Посмотреть сообщение
то мы грубо говоря имеем переменную varTwo которая имеет свой адрес в области ОП, например 00002, но по эту адресу хранится уже НЕ значение (например 20), а адрес на другую ячейку в ОП, например 00003 в которой уже хранится значение 20
Указатель хранится в стеке, а указывает он в вашем случаи на кусок памяти в куче.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
26.05.2013, 23:17  [ТС] 5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Указатель хранится в стеке, а указывает он в вашем случаи на кусок памяти в куче.
э.. давайте отложим, стеки, области динамической памяти и т.д. назовем все это одним словом - ОП, чем больше нагромождений, тем проще запутаться.
когда-нибудь и до этого дойдет дело


Цитата Сообщение от ninja2 Посмотреть сообщение
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.
Точно верно?, просто zss написал по другому, у него адреса поменялись местами, там где по моей логике varTwo - должно вывести 0003, то у него 0002
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
26.05.2013, 23:18 6
Вот как раз недавно задал подобный вопрос:
Адрес объекта, адрес указателя. Где что находится?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
26.05.2013, 23:21 7
Вы перепутали переменные:
Цитата Сообщение от VLK Посмотреть сообщение
берем обыкновенную переменную, например varOne = 10
Цитата Сообщение от VLK Посмотреть сообщение
Если:
int *varTwo = new int(20);
Цитата Сообщение от VLK Посмотреть сообщение
если мы пишем cout << varOne - то нам на экран выведет адрес на который ссылается данный указатель, т.е. 00003
если мы пишем cout << *varOne - то нам выведет на экран значение, которое хранится по адресу 00003 т.е. 20
если мы пишем cout << &varOne - то нам на экран адрес самого указателя, т.е. 00002
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
26.05.2013, 23:24  [ТС] 8
черт..
Опять я ввел всех в заблуждение.

Croessmah, спасибо.

Если:
int *varTwo = new int(20);

то мы грубо говоря имеем переменную varTwo которая имеет свой адрес в области ОП, например 00002, но по эту адресу хранится уже НЕ значение (например 20), а адрес на другую ячейку в ОП, например 00003 в которой уже хранится значение 20

если мы пишем cout << varTwo - то нам на экран выведет адрес на который ссылается данный указатель, т.е. 00003

если мы пишем cout << *varTwo - то нам выведет на экран значение, которое хранится по адресу 00003 т.е. 20

если мы пишем cout << &varTwo - то нам на экран адрес самого указателя, т.е. 00002

Все верно?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
26.05.2013, 23:27 9
Короче:
* - взять то что лежит по адресу
& - взять адрес переменной

то есть
*varTwo - обратиться к значению, которое лежит по адресу, содержащемуся в указателе.
&varTwo - взять адрес самого указателя varTwo
varTwo - тут как и с обычной переменной - берем её значение(в данном случае адрес, на который "указывает" указатель)
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
26.05.2013, 23:42  [ТС] 10
Цитата Сообщение от Croessmah Посмотреть сообщение
Короче:
* - взять то что лежит по адресу
& - взять адрес переменной

то есть
*varTwo - обратиться к значению, которое лежит по адресу, содержащемуся в указателе.
&varTwo - взять адрес самого указателя varTwo
varTwo - тут как и с обычной переменной - берем её значение(в данном случае адрес, на который "указывает" указатель)
ну все как я и расписал, спасибо еще раз.

Добавлено через 11 минут
Цитата Сообщение от ninja2 Посмотреть сообщение
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.

Не по теме:

Нет тяжелого для восприятия материала, есть плохие преподаватели (в том числе обучающие пособия), которые не могут должным образом донести этот материал :)

0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
26.05.2013, 23:49 11
VLK, Ну яж говорил, что ты все правильно понял.

Добавлено через 3 минуты
Цитата Сообщение от VLK Посмотреть сообщение
Не по теме:
Нет тяжелого для восприятия материала, есть плохие преподаватели (в том числе обучающие пособия), которые не могут должным образом донести этот материал
Ты просто через пол года скажешь, что правильно только врубился в указатели, ну у меня так было. Сразу с ними не разобрался, думал что разобрался, а оказалось не до конца.
0
26.05.2013, 23:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2013, 23:49
Помогаю со студенческими работами здесь

Разыменование указателя this
Здравствуйте, Имеется код с перегрузкой оператора &quot;+&quot;, объясните пожалуйста, что делает эта...

Разыменование итератора
Делаю предикат-функцию поиска внутри вектора,состоящего из экземпляров класса.Решил использовать...

Разыменование указателя
Когда мы создали пустой проект и скинули на форму к примеру Edit1; В файле *.h мы увидели в...

Разыменование указателя!
Всем привет, объясните почему и как это работает? int (*pf)(void); int f(void) { ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru