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

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

Войти
Регистрация
Восстановить пароль
 
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

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

17.08.2013, 10:50. Просмотров 612. Ответов 14
Метки нет (Все метки)

Кто нибудь может помочь с объяснением указателей?

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 (значение, хранящееся в этом адресе) вроде бы все понятно. А вот что означает первое значение?

Заранее спасибо. С меня плюсы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 10:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели (C++):

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

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

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

Добавлено через 48 секунд
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А как это объяснить попроще?
Для обращения к членам класса через указатель используйте "оператор стрелочка" убить меня за такое название
C++
1
obj->method ( ) ;
или нужно разыменовывать указатель и обращайтесь с помощью "оператора точки"
C++
1
*(obj).method ( ) ;
1
Hugra
48 / 48 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
17.08.2013, 10:57 #6
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А как это объяснить попроще?
Просто необходимо запомнить, что переменная . а указатель ->, как девочка и мальчик =)
0
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 ( ) ;
Разыменование это присваивание значения указателя в адресе, на который указывает указатель?
0
zenw
17.08.2013, 11:06
  #8

Не по теме:

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

0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.08.2013, 11:09 #9
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
тогда получается &a и а должны быть равны. А они не равны!
*a - берем то, что храниться по содержащемуся адресу
a - адрес, который содержит указатель
&a - адрес самого указателя, ведь указатель - это такая же переменная, которая где-то храниться
Указатели
1
XRuZzz
Антикодер
702 / 608 / 31
Регистрация: 15.09.2012
Сообщений: 2,552
17.08.2013, 11:12 #10
опять же самое понятное объяснение указателей в этих лекциях Для того чтобы выучить С++ по книге Бьёрна Страуструпа
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6523 / 3162 / 311
Регистрация: 04.12.2011
Сообщений: 8,764
Записей в блоге: 5
17.08.2013, 11:24 #11
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
а вот &а = это адрес указателя? т.е *а = это и есть указатель? тогда получается &a и а должны быть равны. А они не равны!
Нет. Логика в том, что если &a это адрес указателя то *(&a) это значение по адресу &a, то есть значения указателя которое хранится в переменной а, поскольку a объявлена как указатель. А уже *a это значение по адресу хранимому в a (или как говорят указателю). В данном случае это целое число, так как a объявлена как указатель на целое.
Вас путает, тот факт, что и &a и a это адреса. Соберитесь.
1
vladand
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
19.08.2013, 05:03 #12
Подскажите, пожалуйста, литературу или отдельные главы из учебников, где просто и понятно разжевываются указатели. Читаю Шилдта, вроде объясняет просто, но понятного мало. Немного разобрался с определениями, а вот выражения с участием указателей ставят в тупик :\
0
ninja2
231 / 187 / 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 и а должны быть равны. Потом уже поэкспериментировав и построив двоичное дерево разобрался что да как.
0
XRuZzz
Антикодер
702 / 608 / 31
Регистрация: 15.09.2012
Сообщений: 2,552
19.08.2013, 09:06 #14
Цитата Сообщение от vladand Посмотреть сообщение
Подскажите, пожалуйста, литературу или отдельные главы из учебников, где просто и понятно разжевываются указатели. Читаю Шилдта, вроде объясняет просто, но понятного мало. Немного разобрался с определениями, а вот выражения с участием указателей ставят в тупик :\
я поэтому и дал ссылку на видеолекции, если внимательно почитаешь эту ветку. без картинок(или доски) не объяснить по нормальному
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
19.08.2013, 14:16 #15
Цитата Сообщение от vladand Посмотреть сообщение
где просто и понятно разжевываются указатели.
Стефан Девис "C++ для чайников" 2003 год ( есть более новые издания, но с ними не знакомился, так что без понятия как там)
0
19.08.2013, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 14:16
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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