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

Ваш аккаунт

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

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

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

Указатели, ** и прочие кошмары памяти...

23K
05 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Помогите разобраться с двумя звездочками в заголовке фукций

 
Код:
struct List
{                                                                                          
    char* data; //указатель на данные                            
    List* next; //указатель на следующий элемент                                      
};

void addLast(List** list)   //добавление нового элемента в конец списка
{
    ...
}

Я так понимаю, что в данном случае в функцию передается указатель на односвязный список. Вопрос: каким обрзом работать с элементами списка внутри фукции, как получить доступ к полям отдельных элементов списка. И как будет выглядеть вызов функции, что нужно будет передавать в параметр, указатель? Понимаю как работают обычные указатели с одной *, а это чудо для меня является чем-то загадочным и не объяснимым, хэлп плз.
397
05 марта 2009 года
SergPas
527 / / 03.02.2007
Цитата: Inc(Dec(i))

Я так понимаю, что в данном случае в функцию передается указатель на односвязный список. Вопрос: каким обрзом работать с элементами списка внутри фукции, как получить доступ к полям отдельных элементов списка. И как будет выглядеть вызов функции, что нужно будет передавать в параметр, указатель? Понимаю как работают обычные указатели с одной *, а это чудо для меня является чем-то загадочным и не объяснимым, хэлп плз.


Передавать надо адрес указателя на односвязный список, который в функции разыменовывается:[FONT=monospace]
[/FONT]

 
Код:
void addLast(List** list)
{
     //подразумевается, что в структуре память под поле данных data выделена
     strcpy((*list)->data, strSource);
}
Цитата:
как получить доступ к полям отдельных элементов списка

Только путём перебора всех элементов списка, начиная с головного... Почитайте книги по алгоритмизации, там всё написано...
Создание экземпляра:

 
Код:
List* list = new List;
Использование функции:
 
Код:
addLast(&list);
P.S. Используйте ссылку вместо указателя и будет вам счастье...:
 
Код:
void addLast(List*& list)
{
   strcpy((*list).data, strSource);
}
List* list = new List;
addLast(list);
1.9K
05 марта 2009 года
GreenRiver
451 / / 20.07.2008
Это всего лишь указатель на указатель, и с ним можно делать все то же самое что и с обычным. Просто один указатель указывает на другой.

По вопросам:
1. каким обрзом работать с элементами списка внутри фукции, как получить доступ к полям отдельных элементов списка:
Надо разыменовать list, чтобы получить объект, на который он указывает.
 
Код:
void addLast(List** list)
{
    (*list)->data;
    (*list)->next;
}

2. И как будет выглядеть вызов функции, что нужно будет передавать в параметр, указатель?
Передавать надо указатель на указатель, для этого просто получим адрес указателя:
 
Код:
List *listik; // указатель на односвязный список
    addLast(&listik);


А зачем вообще так усложнять? Можно замечательно передать и через простой указатель... Или в учебных целях?

UPD: SergPas, синхронно ответили ... но по-разному :)
23K
05 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
в учебных целях))) я бы вообще написал по-другому, функция возвращала бы указатель, и передавал парметром тоже бы обычный указатель

спасибо всем кто октликнулся)))
87
06 марта 2009 года
Kogrom
2.7K / / 02.02.2008
Думаю, что указатель типа **p может указывать на массив указателей, а те в свою очередь на переменную определенного типа, или на массив таких переменных. То есть можно получить 2-мерный динамически генерируемый массив, в котором строки могут быть разной длины.

Хотя сам я с таким безобразием не работаю, предпочитая std::vector.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог