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

Стек и указатели - C++

Восстановить пароль Регистрация
 
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
09.03.2013, 12:19     Стек и указатели #1
Есть элемент стека описанный в структуре:

C++
1
2
3
4
5
struct ElementOfStack
    {
         char info;    // здесь, как я поняла, находится информация о значении предыдущего элемента
         ElenentOfStack* prev; // здесь хранится указатель на предыдущий элемент. 
     };
Здесь более менее все понятно.

Но вот реализация, допустим, функции push мне непонятна совсем!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ElementOfStack *push (ElementOfStack** pTop, char value)
{
        ElementOfStack* newElementOfStack = new ElementOfStack; // здесь выделяем память под новый элемент стека
        newElementOfStack->info = value; // присваиваем переданное значение в поле info
        newElementOfStack->prev = *pTop; // указатель на вершину переходит в поле prev. НО! Почему???!!! в *pTop           
                                                          // звездочка??? Как это совместить с переданным значением в две звезды с  
                                                          // одной в этом присваивании я не понимаю :gcray2: что там будет в поле   
                                                          // prev понять не могу. это мне непонятно ([B]№1[/B]) 
 
 
     *pTop = newElementOfStack; // тоже непонятна звезда ([B]№2[/B])
 
      return newNode; // это, наверно, оправдывает почему при описании функции перед push тоже стоит звезда
}
Тему указатели я, в принципе, поняла. Но вот как совместить переданные формальные параметры с какими-то новыми
переменными и как подогнать эти типы - я не поняла. И объясните, пжл, зачем в формальном значение указатель на
вершину pTop с двумя звездами?

Кто-нибудь вытащите меня из танка
Всем заранее большое спс!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Leoleshucov008
13 / 13 / 1
Регистрация: 23.02.2010
Сообщений: 221
09.03.2013, 12:31     Стек и указатели #2
C++
1
2
3
4
5
struct ElementOfStack
    {    
         char info;    // Здесь значение именно данного элемента, а не предыдущего
         ElenentOfStack* prev; // здесь хранится указатель на предыдущий элемент. 
     };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ElementOfStack *push (ElementOfStack** pTop, char value)
{      
        //ElementOfStack** pTop - это указатель на указатель
        ElementOfStack* newElementOfStack = new ElementOfStack; // здесь выделяем память под новый элемент стека
        newElementOfStack->info = value; // присваиваем переданное значение в поле info
        newElementOfStack->prev = *pTop; // указатель на вершину переходит в поле prev. НО! Почему???!!! 
        //потому, что prev - указатель, *PTop - тоже указатель. 
                                                          
 
 
     *pTop = newElementOfStack; // //newElementOfStack - указатель, *PTop - тоже указатель. 
 
      return newNode; // это, наверно, оправдывает почему при описании функции перед push тоже стоит звезда
}
функция push может быть реализована так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ElementOfStack *push (ElementOfStack* pTop, char value)
{      
      
        ElementOfStack* newElementOfStack = new ElementOfStack;
        newElementOfStack->info = value; 
        newElementOfStack->prev = pTop;
   
 
 
        pTop = newElementOfStack; 
 
      return newNode; //Думаю здесь хотели вернуть указатель на созданный элемент return pTop; 
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2013, 12:34     Стек и указатели #3
1) все параметры функций копируются т.е. внутрь функции попадают копии параметров
2) хочешь внутри функции изменить параметр - передавай его по указателю (одна * звездочка при имени типа)
3) хочешь внутри функции изменить параметр - указатель - передавай его как указатель на указатель (две ** при имени типа)
Цитата Сообщение от iKapex Посмотреть сообщение
newElementOfStack->prev = *pTop;
pTop имеет тип указателя на указатель.
newElementOfStack->prev имеет тип указателя.
*pTop имеет тип указателя, звездочка перед pTop означает разыменованние указателя.
Leoleshucov008
13 / 13 / 1
Регистрация: 23.02.2010
Сообщений: 221
09.03.2013, 12:40     Стек и указатели #4
по поводу этой строчки
C++
1
 newElementOfStack->prev = *pTop;
Так мы даем знать текущему элементу, то где находится предыдущий. Это будет использоваться в функции - достать из стека.
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
09.03.2013, 13:51  [ТС]     Стек и указатели #5
Ребят, спасибо вам огромное. Я по ходу дела выхожу из танка.


Цитата Сообщение от Jupiter Посмотреть сообщение
pTop имеет тип указателя на указатель.
newElementOfStack->prev имеет тип указателя.
*pTop имеет тип указателя, звездочка перед pTop означает разыменованние указателя.
Непонятно осталось только одно: раз мы разыменовываем pTop (*pTop) - значится в pTop содержится ЗНАЧЕНИЕ, но для
но для поля prev (а он с одной звездочкой - это не совсем то, что надо). Ведь prev должен хранить АДРЕС на предыдущий элемент, а тут мы подсовываем ему ЗНАЧЕНИЕ.
Или я опять чего-то не догоняю?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.03.2013, 14:01     Стек и указатели #6
Так pTop на то и указатель НА указатель, что указывает на указатель,
когда разименовываешь pTop получаешь значение указателя.
хочешь получить значение элемента, на который он указывает, - применяй разименование второй раз.
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
09.03.2013, 14:21  [ТС]     Стек и указатели #7
Если параметр - **pTop, тогда разыменование его - *pTop (его значение - адрес того объекта на который он указывает).

А разыменование второй раз - это как?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
09.03.2013, 14:33     Стек и указатели #8
Цитата Сообщение от iKapex Посмотреть сообщение
А разыменование второй раз - это как?
так же как и первый
C++
1
**pTop
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 14:38     Стек и указатели
Еще ссылки по теме:

C++ Стек
Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? C++
Стек через указатели — ошибка доступа C++

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

Или воспользуйтесь поиском по форуму:
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
09.03.2013, 14:38  [ТС]     Стек и указатели #9
Воистину - это кошмар.

Так первый раз разыменование - это *pTop
Yandex
Объявления
09.03.2013, 14:38     Стек и указатели
Ответ Создать тему
Опции темы

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