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

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

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
26.05.2013, 23:05     Указатели и разыменование #1
Я как то раньше не вдавался в эти подробности, разыменование или нет, просто ставил звездочку и все, и для меня было 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

Все верно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 23:05     Указатели и разыменование
Посмотрите здесь:

[C++] Разыменование итератора. C++
C++ Разыменование нулевого указателя
Ссылка и Разыменование в с++ C++
C++ помогите отличить разыменование от указателя
Разыменование указателя! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,179
Завершенные тесты: 1
26.05.2013, 23:10     Указатели и разыменование #2
cout << varOne;
выведет значение (10).
cout << &varOne
выведет адрес (0001)

cout << varTwo;
выведет адрес (0002)
cout << *varTwo
выведет значение (20)
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.05.2013, 23:13     Указатели и разыменование #3
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
26.05.2013, 23:13     Указатели и разыменование #4
Цитата Сообщение от VLK Посмотреть сообщение
то мы грубо говоря имеем переменную varTwo которая имеет свой адрес в области ОП, например 00002, но по эту адресу хранится уже НЕ значение (например 20), а адрес на другую ячейку в ОП, например 00003 в которой уже хранится значение 20
Указатель хранится в стеке, а указывает он в вашем случаи на кусок памяти в куче.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
26.05.2013, 23:17  [ТС]     Указатели и разыменование #5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Указатель хранится в стеке, а указывает он в вашем случаи на кусок памяти в куче.
э.. давайте отложим, стеки, области динамической памяти и т.д. назовем все это одним словом - ОП, чем больше нагромождений, тем проще запутаться.
когда-нибудь и до этого дойдет дело


Цитата Сообщение от ninja2 Посмотреть сообщение
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.
Точно верно?, просто zss написал по другому, у него адреса поменялись местами, там где по моей логике varTwo - должно вывести 0003, то у него 0002
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
26.05.2013, 23:18     Указатели и разыменование #6
Вот как раз недавно задал подобный вопрос:
Адрес объекта, адрес указателя. Где что находится?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 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
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
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

Все верно?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 23:27     Указатели и разыменование #9
Короче:
* - взять то что лежит по адресу
& - взять адрес переменной

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

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 23:49     Указатели и разыменование
Еще ссылки по теме:

C++ Разыменование указателя на указатель
C++ Разыменование указателя в структуре
Разыменование указателя C++

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.05.2013, 23:49     Указатели и разыменование #11
VLK, Ну яж говорил, что ты все правильно понял.

Добавлено через 3 минуты
Цитата Сообщение от VLK Посмотреть сообщение
Не по теме:
Нет тяжелого для восприятия материала, есть плохие преподаватели (в том числе обучающие пособия), которые не могут должным образом донести этот материал
Ты просто через пол года скажешь, что правильно только врубился в указатели, ну у меня так было. Сразу с ними не разобрался, думал что разобрался, а оказалось не до конца.
Yandex
Объявления
26.05.2013, 23:49     Указатели и разыменование
Ответ Создать тему
Опции темы

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