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

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

Восстановить пароль Регистрация
 
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
17.08.2013, 10:50     Указатели #1
Кто нибудь может помочь с объяснением указателей?

1)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct pizza
{
    string name;
    int diameter; 
    int weight;
};
 
int main ()
{
    rus;
    pizza* company1 = new pizza;
    cout << "Введите название компании: ";
    getline(cin,company1->name);
Почему вместо точки нужно ставить стрелочку, и почему этого не было в книжке?

2) Как работает инициализация указателя? int *a = new int;
В общем, что означает int *a, и что означает new int? По сути это создание обычной переменной, хранилищем для которой можно управлять?

3) Вот представим такую ситуацию:
C++
1
2
3
4
    int *a = new int;  // мы резервируем место для переменной типа int 
    int b = 550; // инициализируем переменную b;
    *a = b; // присваиваем значение b значению, которое хранится по адресу &a 
    cout << a << " " < < *a << " " << &a << endl;
Компилируем, и выходят такие строки:

002B6138 550 0026FE80.

Со значениями 0026FE80 (адрес переменной а) и 550 (значение, хранящееся в этом адресе) вроде бы все понятно. А вот что означает первое значение?

Заранее спасибо. С меня плюсы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
17.08.2013, 10:55     Указатели #2
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Почему вместо точки нужно ставить стрелочку, и почему этого не было в книжке?
Потому что для указателей селектор членов класса это '->', а не '.'.
Можете написать так:
C++
1
*(company1).name
Добавлено через 3 минуты
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
В общем, что означает int *a, и что означает new int
int * - тип указатель на объект типа int
new int - читаем главу о динамической памяти (куче)
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
17.08.2013, 10:55  [ТС]     Указатели #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что для указателей селектор членов класса это '->', а не '.'.
Можете написать так:
C++
1
*(company1).name
А как это объяснить попроще?
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
17.08.2013, 10:56     Указатели #4
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
cout << a << " " < < *a << " " << &a << endl;
a = выделенный адрес
*а = значение хранящееся по адресу
&a = адрес самого указателя
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
17.08.2013, 10:57     Указатели #5
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
. А вот что означает первое значение?
Адрес, содержащийся в указателе. В данном случае адрес выделенной оператором new памяти в куче

Добавлено через 48 секунд
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А как это объяснить попроще?
Для обращения к членам класса через указатель используйте "оператор стрелочка" убить меня за такое название
C++
1
obj->method ( ) ;
или нужно разыменовывать указатель и обращайтесь с помощью "оператора точки"
C++
1
*(obj).method ( ) ;
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
17.08.2013, 10:57     Указатели #6
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А как это объяснить попроще?
Просто необходимо запомнить, что переменная . а указатель ->, как девочка и мальчик =)
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
17.08.2013, 10:59  [ТС]     Указатели #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Адрес, содержащийся в указателе. В данном случае адрес выделенной оператором new памяти в куче
Короче, a = адрес, который система выделила для переменной;
*а = это значение из этого адреса?
а вот &а = это адрес указателя? т.е *а = это и есть указатель? тогда получается &a и а должны быть равны. А они не равны!

Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае адрес выделенной оператором new памяти в куче
или нужно разыменовывать указатель и обращайтесь с помощью "оператора точки"
C++
1
*(obj).method ( ) ;
Разыменование это присваивание значения указателя в адресе, на который указывает указатель?
zenw
17.08.2013, 11:06
  #8

Не по теме:

Для обращения к членам класса через указатель используйте "оператор стрелочка" убить меня за такое название
Почему убить? Вроде бы на английском он именно "operator arrow" и называется, и по-русски так же. Или я ошибаюсь?

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
17.08.2013, 11:09     Указатели #9
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
тогда получается &a и а должны быть равны. А они не равны!
*a - берем то, что храниться по содержащемуся адресу
a - адрес, который содержит указатель
&a - адрес самого указателя, ведь указатель - это такая же переменная, которая где-то храниться
Указатели
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 11:12     Указатели #10
опять же самое понятное объяснение указателей в этих лекциях Для того чтобы выучить С++ по книге Бьёрна Страуструпа
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
17.08.2013, 11:24     Указатели #11
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
а вот &а = это адрес указателя? т.е *а = это и есть указатель? тогда получается &a и а должны быть равны. А они не равны!
Нет. Логика в том, что если &a это адрес указателя то *(&a) это значение по адресу &a, то есть значения указателя которое хранится в переменной а, поскольку a объявлена как указатель. А уже *a это значение по адресу хранимому в a (или как говорят указателю). В данном случае это целое число, так как a объявлена как указатель на целое.
Вас путает, тот факт, что и &a и a это адреса. Соберитесь.
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
19.08.2013, 05:03     Указатели #12
Подскажите, пожалуйста, литературу или отдельные главы из учебников, где просто и понятно разжевываются указатели. Читаю Шилдта, вроде объясняет просто, но понятного мало. Немного разобрался с определениями, а вот выражения с участием указателей ставят в тупик :\
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.08.2013, 08:32     Указатели #13
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Как работает инициализация указателя? int *a = new int;
Тут просто указателю a на int присваивается ячейка памяти int выделенная new . Это тоже самое, что есть переменная int b; и мы присваиваем int* a=&b; указателю а адрес переменной b. Тут видно что new int; возвращает адрес новой ячейки памяти который сохраняется в указателе a.

Я сам тоже не сразу понял что в указателя есть свой адрес, тоже раньше думал что &a и а должны быть равны. Потом уже поэкспериментировав и построив двоичное дерево разобрался что да как.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
19.08.2013, 09:06     Указатели #14
Цитата Сообщение от vladand Посмотреть сообщение
Подскажите, пожалуйста, литературу или отдельные главы из учебников, где просто и понятно разжевываются указатели. Читаю Шилдта, вроде объясняет просто, но понятного мало. Немного разобрался с определениями, а вот выражения с участием указателей ставят в тупик :\
я поэтому и дал ссылку на видеолекции, если внимательно почитаешь эту ветку. без картинок(или доски) не объяснить по нормальному
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 14:16     Указатели
Еще ссылки по теме:

C++ Написать программу сортировки через указатели на указатели
Указатели и массивы. Указатели и функции C++
Указатели на массивы. Указатели и функции C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
19.08.2013, 14:16     Указатели #15
Цитата Сообщение от vladand Посмотреть сообщение
где просто и понятно разжевываются указатели.
Стефан Девис "C++ для чайников" 2003 год ( есть более новые издания, но с ними не знакомился, так что без понятия как там)
Yandex
Объявления
19.08.2013, 14:16     Указатели
Ответ Создать тему
Опции темы

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