Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование двойного указателя. Почему?

20K
18 января 2007 года
lnkgyv3
17 / / 12.01.2007
Ребята объясните пожалуйста по-простому, почему в ниже приведённом коде функция удаления элемента из стека работает через двойной указатель:
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;
}
547
18 января 2007 года
Hydra
488 / / 20.06.2006
Передача по ссылке: чтобы значение параметра можно было изменить внутри функции, а изменилась глобальная переменная.
361
18 января 2007 года
Odissey_
661 / / 19.09.2006
Честно говоря не совсем понял причем здесь глобальные переменные? думаю мне тож было бы полезно и познавательно услышать более подробный ответ, так как явной причины применения именно двойного указателя я не вижу. Помоему все работало бы и посредством обычного указателя (если просто передавать голову). Единственное предположение, что сам список представлен в виде указателя на голову, поэтому передается именно он, причины такой организации могут быть различны...
1
18 января 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Odissey_
Честно говоря не совсем понял причем здесь глобальные переменные? думаю мне тож было бы полезно и познавательно услышать более подробный ответ, так как явной причины применения именно двойного указателя я не вижу. Помоему все работало бы и посредством обычного указателя (если просто передавать голову). Единственное предположение, что сам список представлен в виде указателя на голову, поэтому передается именно он, причины такой организации могут быть различны...


Не знаю причем здесь глобальные переменные, в данном случае происходит модификация указателя - поэтому в функцию передается указатель на указатель. Если вы просто передадите в функцию указатель на объект - по ее завершении он будет указывать в никуда.

20K
18 января 2007 года
lnkgyv3
17 / / 12.01.2007
Цитата: kot_
Не знаю причем здесь глобальные переменные, в данном случае происходит модификация указателя - поэтому в функцию передается указатель на указатель. Если вы просто передадите в функцию указатель на объект - по ее завершении он будет указывать в никуда.



Спасибо за исчерпывающий ответ! Мне очень помогло.

361
18 января 2007 года
Odissey_
661 / / 19.09.2006
2 kot_ все правильно
1
18 января 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Odissey_
2 kot_ все правильно


:)
Надо было оставить код и отметить место где возникнет проблема - потому как не всегда это очевидно для всех.
Кстати, помоему можно использовать не только указатель на указатель но и ссылку на указатель. Тогда вероятно удасться обойтись без операции разименовывания. Надо будет вечером попробовать.

309
19 января 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Кстати, помоему можно использовать не только указатель на указатель но и ссылку на указатель


Можно, пишется "Functon (TMyClass & *MyObject)".
Просто в этом случае менее наглядно изменение значения передаваемого указателя при вызове функции

 
Код:
Function1 (&Pointer);
// или
Function2 (Pointer);

В первом примере последующее изменение адреса, содержащегося в указателе, видно "на глаз". Во втором - только через хеадер, хелп и комменты.
3
19 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: el scorpio

В первом примере последующее изменение адреса, содержащегося в указателе, видно "на глаз". Во втором - только через хеадер, хелп и комменты.


"На глаз" - не всегда очевидно (кроме того придется проверять валидность указателя), а вот показать "изменение адреса, содержащегося в указателе" в названии этой функции (передавая указатель по ссылке) - это хороший стиль.

1
19 января 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Green
"На глаз" - не всегда очевидно (кроме того придется проверять валидность указателя), а вот показать "изменение адреса, содержащегося в указателе" в названии этой функции (передавая указатель по ссылке) - это хороший стиль.


Согласен, использования ссылки на указатель гораздо более наглядно в данном случае, чем двойной указатель.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог