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

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

Войти
Регистрация
Восстановить пароль
 
kl14_11
17 / 17 / 7
Регистрация: 02.11.2009
Сообщений: 118
#1

Указатель на указатель - C++

14.11.2011, 19:44. Просмотров 321. Ответов 2
Метки нет (Все метки)

Всем доброго времени!
Совсем недавно начал использовать технику двойных указателей типа Obj ** obj, поэтому путаюсь.
Для удобного заполнения списка из обычных указателей (Obj * obj) написал такую функцию:
C++
1
2
3
4
5
Act ** set(Act ** a, Act * n)
{
    *a = n;
    return &(*a)->next;
}
где next - одинарный указатель (Obj *) на следующий объект списка, Act - обычный элемент списка с кое какими данными.

Заполняю например вот так
C++
1
2
Act ** a = &begin;
a = set( a, new Act() );
, где begin - начало списка, a - указатель

В принципе, всё работает. Меня смущает что я возвращаю через return следующий элемент. Хочу написать эту функцию в таком виде:
C++
1
2
3
4
5
void set(Act ** a, Act * n)
{
    *a = n;
    a = (&(*a)->next);
}
, чтобы результат сам по ссылке присваивался, но чёто не катит. Помогите как нужно правильно эту функцию переделать, интересуюсь больше для собственного развития, чтоб механизм понять.
C++
1
2
Act ** a = &begin;
set( a, new Act() ); //вместо a = set( a, new Act() );
.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 19:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на указатель (C++):

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

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

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

2
Сыроежка
Заблокирован
14.11.2011, 20:11 #2
Цитата Сообщение от kl14_11 Посмотреть сообщение
Всем доброго времени!
Совсем недавно начал использовать технику двойных указателей типа Obj ** obj, поэтому путаюсь.
Для удобного заполнения списка из обычных указателей (Obj * obj) написал такую функцию:
C++
1
2
3
4
5
Act ** set(Act ** a, Act * n)
{
    *a = n;
    return &(*a)->next;
}
где next - одинарный указатель (Obj *) на следующий объект списка, Act - обычный элемент списка с кое какими данными.

Заполняю например вот так
C++
1
2
Act ** a = &begin;
a = set( a, new Act() );
, где begin - начало списка, a - указатель

В принципе, всё работает. Меня смущает что я возвращаю через return следующий элемент. Хочу написать эту функцию в таком виде:
C++
1
2
3
4
5
void set(Act ** a, Act * n)
{
    *a = n;
    a = (&(*a)->next);
}
, чтобы результат сам по ссылке присваивался, но чёто не катит. Помогите как нужно правильно эту функцию переделать, интересуюсь больше для собственного развития, чтоб механизм понять.
C++
1
2
Act ** a = &begin;
set( a, new Act() ); //вместо a = set( a, new Act() );
.
Спасибо.
Если я вас правильно понял, вы хотите, чтобы Act **a передавался через параметры и при этом его измененное значение было известно в вызывающей функции. Тогда вам еще нужно ввести один уровень косвенности и объявить

C++
1
2
3
4
5
void set(Act ***a, Act * n)
{
    **a = n;
    *a = (&(**a)->next);
}
Правда, я не проверял, но скорей всего должно работать.
1
kl14_11
17 / 17 / 7
Регистрация: 02.11.2009
Сообщений: 118
14.11.2011, 20:30  [ТС] #3
Спасибо.
Я тоже придумал вот такое извращение :
C++
1
2
3
4
5
void set(Act **& a, Act * n)
{
    *a = n;
    a = (&(*a)->next);
}
Сейчас оба проверю.

Добавлено через 14 минут
Всё пашет теперь=) Правда свой тока проверил. Вот значит какой великий и могучий С++, этих указателей можно вообще бесконечно друг на друга наделать.
Всё теперь я эту тему вообще просёк.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 20:30
Привет! Вот еще темы с ответами:

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &strings);? Почему именно двойное **? Буду очень благодарна...

Приведение любого двумерного массива к типу указатель на указатель - C++
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно сделать, чтобы подобные присвоения...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...


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

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

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