Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 07:07   #1
Ann3ooo
Новичок
Джуниор
 
Регистрация: 23.01.2013
Сообщений: 1
По умолчанию двойной указатель!

Здравствуйте,подскажите,пожалуйста, как работает программа! а в частности,зачем двойной указатель и как при помощи него все работает!

Код:
void InsertNth(struct node** headRef, int index, int data) 
{
  if (index == 0) Push(headRef, data);
  else 
  {
    struct node* current = *headRef;
    int i;
    for (i=0; i<index-1; i++) 
    {
      current = current->next;
    }
    Push(&(current->next), data); 
  }
это программа вставки элемента в произвольное место связного списка!
Ann3ooo вне форума Ответить с цитированием
Старый 23.01.2013, 08:01   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Чтобы некоторую переменную можно было изменить в подпрограмме, ее нужно передавать по ссылке, т.е. передавать в подпрограмму указатель на нее.
Если же величина, которую нам нужно менять - указатель, и при этом этот указатель подпрограмма должна менять - вот и получается двойной указатель.

К сожалению, по данному фрагменту программы невозможно доподлинно сказать, откуда возникла потребность в изменении указателя.
s-andriano вне форума Ответить с цитированием
Старый 23.01.2013, 08:08   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Совершенно не зачем. Обычно указатель-на-указатель как параметр функции нужен, чтобы при выходе из функции аргумент мог принять новое значение. Возможно в функции Push это важно, хотя не представляю, для чего. Возможно код писал дилетант.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 01:06   #4
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
Возможно в функции Push это важно, хотя не представляю, для чего. Возможно код писал дилетант.
Ну если указатель на вершену стека/очереди/... изначально равен нулу/ничему, то как вы его измените без двойного указателя?
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 25.01.2013, 01:37   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Ну если указатель на вершену стека/очереди/... изначально равен нулу/ничему, то как вы его измените без двойного указателя?
Присвоением.
Код:
struct list
{
	list* next;
};


class stack
{
	list* head;
public:

	stack(): head(NULL)	{}
	
	void push(list* p)
	{
		if (!head)
		{
			head = p;
		}
		else
		{
		 // TODO: вставить в хвост.
		}
	}
};
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 04:21   #6
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

А теперь смотрим код ТС и замечаем, что это типичная С реализация с функциями, без классов, ...
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 25.01.2013, 12:56   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Поясните, в чем будет проявлятся различие в присвоении указателя в си и с++.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 13:04   #8
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Ни в чем ...
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 26.01.2013, 00:27   #9
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Код:
void func()
{
}

int main()
{
  list * l = null;
  func();
}
Ну и как func изменит указатель, если нет разницы?
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 26.01.2013, 00:30   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Ezhik Kihze Посмотреть сообщение
Код:
void func()
{
}

int main()
{
  list * l = null;
  func();
}
Ну и как func изменит указатель, если нет разницы?
а причем тут С и С++?
в обоих итог один.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
Двойной переворот daniil123 Паскаль, Turbo Pascal, PascalABC.NET 0 21.11.2011 22:59
двойной ping stupid C# (си шарп) 6 29.03.2011 11:08
Двойной запуск SONce Общие вопросы Delphi 4 15.04.2009 20:50
Двойной клик Алежа Общие вопросы .NET 3 16.11.2008 23:20