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

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

Войти
Регистрация
Восстановить пароль
 
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

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

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

Я как то раньше не вдавался в эти подробности, разыменование или нет, просто ставил звездочку и все, и для меня было 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 23:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели и разыменование (C++):

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

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

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

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

Разыменование указателя this - C++
Здравствуйте, Имеется код с перегрузкой оператора &quot;+&quot;, объясните пожалуйста, что делает эта строка: matrix sum(*this); Весь...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
26.05.2013, 23:10 #2
cout << varOne;
выведет значение (10).
cout << &varOne
выведет адрес (0001)

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


Цитата Сообщение от ninja2 Посмотреть сообщение
Конечно верно. Указатель это штука такая которой тяжело дать объяснение словами. В общем ты верно все разобрал.
Точно верно?, просто zss написал по другому, у него адреса поменялись местами, там где по моей логике varTwo - должно вывести 0003, то у него 0002
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
26.05.2013, 23:18 #6
Вот как раз недавно задал подобный вопрос:
Адрес объекта, адрес указателя. Где что находится?
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 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
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
26.05.2013, 23:27 #9
Короче:
* - взять то что лежит по адресу
& - взять адрес переменной

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

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

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

Не по теме:

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

0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.05.2013, 23:49 #11
VLK, Ну яж говорил, что ты все правильно понял.

Добавлено через 3 минуты
Цитата Сообщение от VLK Посмотреть сообщение
Не по теме:
Нет тяжелого для восприятия материала, есть плохие преподаватели (в том числе обучающие пособия), которые не могут должным образом донести этот материал
Ты просто через пол года скажешь, что правильно только врубился в указатели, ну у меня так было. Сразу с ними не разобрался, думал что разобрался, а оказалось не до конца.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 23:49
Привет! Вот еще темы с ответами:

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

Разыменование указателя в структуре - C++
Всем привет,нужна помощь. Есть такое описание структуры: struct st{ int* value; st* next; st* prev; }; Я хочу занести...

Разыменование нулевого указателя - C++
Как вообще по стандарту ведет себя программа после разыменования нулевого указателя? Указано-ли это явно? Просто сегодня на работе...

помогите отличить разыменование от указателя - C++
люди помогите отличить разыменование от указателя.дайте ссылку ,книгу хот что угодно.я читал много книг но ни в одном не нашел чтоб там...


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

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

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