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

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

Войти
Регистрация
Восстановить пароль
 
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 228
#1

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

09.03.2013, 12:19. Просмотров 971. Ответов 8
Метки нет (Все метки)

Есть элемент стека описанный в структуре:

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 с двумя звездами?

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

Задача на указатели и стек - C++
Задали строчную переменную, которая содержит последовательность символов, среди которых есть цифры. Составить программу, которая превращает...

Стек через указатели — ошибка доступа - C++
Задача такова: реализовать стек, в котором будут такие команды — push (добавить в конец элемент), pop (удалить последний элемент), back...

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

Используя стек, описать функцию проверяющую, является ли стек пустым - C++
Используя стек, описать функцию проверяющую, является ли стек пустым

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами - C++
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include <iostream> #include <stdlib.h> ...

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

8
Leoleshucov008
14 / 14 / 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; 
}
1
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 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 означает разыменованние указателя.
1
Leoleshucov008
14 / 14 / 1
Регистрация: 23.02.2010
Сообщений: 221
09.03.2013, 12:40 #4
по поводу этой строчки
C++
1
 newElementOfStack->prev = *pTop;
Так мы даем знать текущему элементу, то где находится предыдущий. Это будет использоваться в функции - достать из стека.
1
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 228
09.03.2013, 13:51  [ТС] #5
Ребят, спасибо вам огромное. Я по ходу дела выхожу из танка.


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

А разыменование второй раз - это как?
0
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 1
09.03.2013, 14:33 #8
Цитата Сообщение от iKapex Посмотреть сообщение
А разыменование второй раз - это как?
так же как и первый
C++
1
**pTop
1
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 228
09.03.2013, 14:38  [ТС] #9
Воистину - это кошмар.

Так первый раз разыменование - это *pTop
0
09.03.2013, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 14:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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