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

Двойной указатель на объект класса - C++

Восстановить пароль Регистрация
 
Default_070
 Аватар для Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:01     Двойной указатель на объект класса #1
Подскажите что означает следующее определение объекта класса.
C++
1
A **myA;
где - A имя класса, а myA его объект.
Мне не понятно что означает двойной указатель(указатель на массив указателей объекта?).
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.10.2015, 08:10     Двойной указатель на объект класса #2
Указатель на указатель на объект класса А. То есть в нем хранится адрес ячейки памяти, в которой хранится адрес объекта.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,205
Завершенные тесты: 1
05.10.2015, 08:12     Двойной указатель на объект класса #3
Это значит, что в переменной myA будет хранится адрес массива, в котором будут записаны адреса строк двумерного массива, т.е. myA[0] - адрес первой строки, myA[1] - адрес второй строки и т.д.
Default_070
 Аватар для Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:12  [ТС]     Двойной указатель на объект класса #4
И
как это применять, зачем нужно?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,205
Завершенные тесты: 1
05.10.2015, 08:14     Двойной указатель на объект класса #5
Образец для работы с двумерными массивами
Образцы (шаблоны) программ для типовых задач
Default_070
 Аватар для Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:14  [ТС]     Двойной указатель на объект класса #6
Ты говоришь строчек, это означает других объектов? если да, то как в этот указатель записать объекты?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,205
Завершенные тесты: 1
05.10.2015, 08:15     Двойной указатель на объект класса #7
См. приведенный образец
Default_070
 Аватар для Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:20  [ТС]     Двойной указатель на объект класса #8
Пример мне был понятен, так как массивы я знаю хорошо. Здесь речь об объектах, которые не совсем понятны. Определение я понял, а мой вопрос насчет записи в этот указатель указатели на другие объекты можешь ответить?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,205
Завершенные тесты: 1
05.10.2015, 08:59     Двойной указатель на объект класса #9
А какая разница, указатель на какие объекты там будет храниться.
Важно, что если его разыменовать 2 раза, то получим значение объекта
т.е. myA[0][0] то то же самое, что и *(*myA)
myA[0][1] то то же самое, что и *( *myA+1) взяли второй элемент в первой строке
myA[1][0] то то же самое, что и *( *(myA+1)) взяли первый элемент во второй строке
myA[1][1] то то же самое, что и *( *(myA+1)+1) взяли второй элемент во второй строке
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
05.10.2015, 09:00     Двойной указатель на объект класса #10
Цитата Сообщение от zss Посмотреть сообщение
Это значит, что в переменной myA будет хранится адрес массива,
нет, не значит.

указатель понятия не имеет на что он указывает.
и хранить там можно все что угодно:
объект, массив объектов, или что-то ещё.

в данном случае указатель на указатель.
и все что он знает - что хранит адрес другого указателя.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,205
Завершенные тесты: 1
05.10.2015, 09:05     Двойной указатель на объект класса #11
hoggy, Вряд ли кто-то будет использовать такие указатели абстрактно.
Во всяком случае, я ни разу не видел другого применения, кроме массивов.

Правда, есть еще один случай
C++
1
2
3
4
void CreateArray(int** m,int n)
{
    (*m)=new int[n];
}
Вызывающей программе надо знать, где выделится память.
Поэтому передается адрес ячейки, куда надо записать адрес выделенной памяти.
Но я предлагаю делать это более изящно
C++
1
2
3
4
5
int* CreateArray(int n)
{
    int* m=new int[n];
    return m;
}
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
05.10.2015, 09:07     Двойной указатель на объект класса #12
А я то вообще не видел сырых указателей на указатель в проектах)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2015, 09:19     Двойной указатель на объект класса
Еще ссылки по теме:

C++ Указатель на объект, или экземпляр класса?
C++ Не удается разыменовать указатель на объект класса
C++ Статический указатель класса на объект этого же класса

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

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
05.10.2015, 09:19     Двойной указатель на объект класса #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Default_070 Посмотреть сообщение
как это применять, зачем нужно?
например, сишники применяют такое для перенацеливания указателя:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
void foo(int**);
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int v = 10;
    
 
    int* p = &v;
    int** pp = &p;
 
    std::cout<< *p << std::endl;
    
    foo(pp);
    
    std::cout<< *p << std::endl;
}
 
void foo(int** pp)
{
    static int v = 20;
    *pp = &v;
}

другой пример, допустим нужно реалоцировать память:

http://rextester.com/OLVM85635

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
 
void badRealoc(int* target, const size_t count);
void goodRealoc(int** target, const size_t count);
void excellentRealoc(int*& target, const size_t count);
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    // --- выделили память
    int* p = new int[1024];
    
    // --- покажем адрес начала блока данных
    std::cout << "address = " << p << std::endl;
    
    // --- вдруг нам очень сильно понадобилось изменить
    // количество элементов
    
    badRealoc(p, 10);
    
    // --- покажем новый адрес начала блока данных
    std::cout << "address = " << p << std::endl;
    
    // и о боже! адрес не изменился!
    // утечка памяти.
    // а все поотому, что все аргументы функций всегда копируются.
    // и функцию badRealoc попала копия узкателя, а не оригинал
    // новый адрес начала блока данных получила копия указеля
    // а вовсе не оригинал
    // оригинал же остался без изменений
    // функция отрабала, и адрес данных был утерян
    
    // что бы такой гадости не происходило
    // сишники используют указатель на указатель
    
    // --- заново выделяем память
    // потому что старую мы уже профакапили
    // и указатель стал невелидным
    p = new int[1024];
    goodRealoc(&p, 10);
    
    // --- покажем новый адрес начала блока данных
    // и убедимся что он действительно изменился
    std::cout << "address = " << p << std::endl;
    
    
    // --- нужно так же заметить: указатель на указатель
    // это - сишный прием, и используется он либо на языке си
    // либо при разработке системного апи
    // либо всякого рода балбесами, которые не осилили ссылки.
    
    // ссылки - более удобное, простое, и безопасное средство
    // эффективной передачи данных.
    
    
    // --- выделили память
    p = new int[1024];
    excellentRealoc(p, 10);
    
    // --- покажем новый адрес начала блока данных
    // и убедимся что он действительно изменился
    std::cout << "address = " << p << std::endl;
    
}
 
 
 
void badRealoc(int* target, const size_t count)
{
    delete [] target;
    target = new int[count];
}
 
void goodRealoc(int** target, const size_t count)
{
    delete [] *target;
    *target = new int[count];
}
 
void excellentRealoc(int*& target, const size_t count)
{
    delete [] target;
    target = new int[count];
}
Добавлено через 50 секунд
Цитата Сообщение от zss Посмотреть сообщение
Правда, есть еще один случай
собственно именно этот случай и является основным кейсом двойного укзателя.
применяется в сишном апи (winapi, например)
Yandex
Объявления
05.10.2015, 09:19     Двойной указатель на объект класса
Ответ Создать тему
Опции темы

Текущее время: 18:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru