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

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

Войти
Регистрация
Восстановить пароль
 
Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
#1

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

05.10.2015, 08:01. Просмотров 505. Ответов 12
Метки нет (Все метки)

Подскажите что означает следующее определение объекта класса.
C++
1
A **myA;
где - A имя класса, а myA его объект.
Мне не понятно что означает двойной указатель(указатель на массив указателей объекта?).
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2015, 08:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двойной указатель на объект класса (C++):

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Правда, что указатель класса-наследника не может указывать на объект класса-родителя? - C++
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

Статический указатель класса на объект этого же класса - C++
Не пойму: что в этом коде не так? #include <iostream> #include <cstdlib> using namespace std; struct A { int x; ...

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

Указатель на объект класса - C++
Есть условие - есть класс First, который содержит объект класса Second, а в класс Third надо передать указатель на объект класса Second,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
05.10.2015, 08:10 #2
Указатель на указатель на объект класса А. То есть в нем хранится адрес ячейки памяти, в которой хранится адрес объекта.
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 1
05.10.2015, 08:12 #3
Это значит, что в переменной myA будет хранится адрес массива, в котором будут записаны адреса строк двумерного массива, т.е. myA[0] - адрес первой строки, myA[1] - адрес второй строки и т.д.
Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:12  [ТС] #4
И
как это применять, зачем нужно?
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 1
05.10.2015, 08:14 #5
Образец для работы с двумерными массивами
Образцы (шаблоны) программ для типовых задач
Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:14  [ТС] #6
Ты говоришь строчек, это означает других объектов? если да, то как в этот указатель записать объекты?
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 1
05.10.2015, 08:15 #7
См. приведенный образец
Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
05.10.2015, 08:20  [ТС] #8
Пример мне был понятен, так как массивы я знаю хорошо. Здесь речь об объектах, которые не совсем понятны. Определение я понял, а мой вопрос насчет записи в этот указатель указатели на другие объекты можешь ответить?
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 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
6534 / 2714 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
05.10.2015, 09:00 #10
Цитата Сообщение от zss Посмотреть сообщение
Это значит, что в переменной myA будет хранится адрес массива,
нет, не значит.

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

в данном случае указатель на указатель.
и все что он знает - что хранит адрес другого указателя.
zss
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 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
2429 / 1123 / 240
Регистрация: 30.11.2013
Сообщений: 3,673
05.10.2015, 09:07 #12
А я то вообще не видел сырых указателей на указатель в проектах)))
hoggy
6534 / 2714 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 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, например)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2015, 09:19
Привет! Вот еще темы с ответами:

Указатель на объект класса - C++
Добрый день! Есть класс Заполняю с помощью конструктора class TStol : public TMebel { protected: AnsiString...

Указатель на объект из указателя на член класса - C++
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()

Не удается разыменовать указатель на объект класса - C++
Добрый день, знатоки c++. Пишу программу, уровень знаний базовый. Нуждаюсь в совете профессионалов. Создал класс node. ClassNode.h: ...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.10.2015, 09:19
Ответ Создать тему
Опции темы

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