Использование двойного указателя. Почему?
struct st *push(struct st *HEAD, char a)
{
struct st *PTR;
/* Выделение памяти */
if((PTR=malloc(sizeof(struct st)))==NULL)
{
/* Если её нет - выход */
puts("ет памяти");exit(-1);
}
/* Инициализация созданной веpшины */
PTR->c=a;
/* и подключение её к стеку */
PTR->next=HEAD;
/* PTR -новая веpшина стека */
return PTR;
}
/* Функция DEL удаляет символ с веpшины стека.
Возвpащает удаляемый символ.
Изменяет указатель на веpшину стека */
char DEL(struct st **HEAD)
{
struct st *PTR;
char a;
/* Если стек пуст, возвpащается '\0' */
if(*HEAD==NULL) return '\0';
/* в PTR - адpес веpшины стека */
PTR=*HEAD;
a=PTR->c;
/* Изменяем адpес веpшины стека */
*HEAD=PTR->next;
/* Освобождение памяти */
free(PTR);
/* Возвpат символа с веpшины стека */
return a;
}
Не знаю причем здесь глобальные переменные, в данном случае происходит модификация указателя - поэтому в функцию передается указатель на указатель. Если вы просто передадите в функцию указатель на объект - по ее завершении он будет указывать в никуда.
Спасибо за исчерпывающий ответ! Мне очень помогло.
:)
Надо было оставить код и отметить место где возникнет проблема - потому как не всегда это очевидно для всех.
Кстати, помоему можно использовать не только указатель на указатель но и ссылку на указатель. Тогда вероятно удасться обойтись без операции разименовывания. Надо будет вечером попробовать.
Можно, пишется "Functon (TMyClass & *MyObject)".
Просто в этом случае менее наглядно изменение значения передаваемого указателя при вызове функции
// или
Function2 (Pointer);
В первом примере последующее изменение адреса, содержащегося в указателе, видно "на глаз". Во втором - только через хеадер, хелп и комменты.
В первом примере последующее изменение адреса, содержащегося в указателе, видно "на глаз". Во втором - только через хеадер, хелп и комменты.
"На глаз" - не всегда очевидно (кроме того придется проверять валидность указателя), а вот показать "изменение адреса, содержащегося в указателе" в названии этой функции (передавая указатель по ссылке) - это хороший стиль.
Согласен, использования ссылки на указатель гораздо более наглядно в данном случае, чем двойной указатель.