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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 169, средняя оценка - 4.97
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
#1

Понимание для чего вообще нужны указатели? - C++

12.11.2011, 20:12. Просмотров 21898. Ответов 112
Метки нет (Все метки)

Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2011, 11:45     Понимание для чего вообще нужны указатели? #61
Функция void Cleanup() как в моей проге.
Обнуляет все что было инициализировано при выходе из программы или при ее перезагрузке
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 13:20     Понимание для чего вообще нужны указатели? #62
Цитата Сообщение от Bers
итого: пох на ивариант класса. Типа мы в теме, спаггети нам жрать не впервой!
сначала нужно узнать, что такое указатели (это основы)
чтобы потом в каком-нибудь незнакомом коде разбираться
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 15:03     Понимание для чего вообще нужны указатели? #63
Цитата Сообщение от Bers Посмотреть сообщение
мина замедленного действия?
И в чём же мина? В невозможности удалить динамичский объект, созданный по ссылке? Так это при попытке запрета указателей.

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Упоротый алгоритм? Сама сущность? Или сам указатель, который оказался волшебным?
А что волшебного в выходе из видимости? Или в освобождении памяти только так:
C++
1
2
3
4
5
if (p)
{
 delete p;
}
p=NULL;
и так:
C++
1
2
3
4
5
if (Count)
{
 delete [] Data;
}
Count=0;
?

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Когда он может - сторонние механизмы не дадут. или когда хочет - обращение к памяти, которую кто то уже освободил. Крэш.
Специально?

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
итого: пох на ивариант класса.
В любом классе с указателями есть деструкторы, там всё и делается, а посторонним писакам указатель из класса вообще не выдаётся, чтоб не освободили просто делитом и не выделили память в один нью/каллок/реааллок.

Добавлено через 39 минут
Цитата Сообщение от mc.Duck Посмотреть сообщение
Вообще, указатели в современное время почти ниодин уважающий себя программист не использует
Не избегает, так будет точнее. А не уважающий себя чайник не использует, думая что ссылки вместо указателей - это круто.

Добавлено через 1 минуту
Цитата Сообщение от mc.Duck Посмотреть сообщение
так как ныне памяти у компьютеров хоть отбавляй
потому и нужны.
Цитата Сообщение от mc.Duck Посмотреть сообщение
а путаницы с этими указателями ооочень много.
нет совсем.

Добавлено через 1 минуту
Цитата Сообщение от mc.Duck Посмотреть сообщение
C++
1
2
3
4
5
char *a = NULL; * * * * *//здесь объявляем переменную-указатель
for(int i=0;i<=9;i++) * *//цикл присваиваний значений
{
 a=new char[100];
}
бред. Никто в цикле не выделят пямять всё время по одному и тому же указателю. А выглядит это на самом деле так:
C++
1
2
3
4
5
6
7
8
char **a = NULL; * * * * *//здесь объявляем переменную-указатель
a=new (char*)[10];
if (a)
{
 for(int i=0;i<=9;i++) * *//цикл присваиваний значений
 {
  a[i]=new char[100];
 }
, или так:
}
C++
1
2
3
4
5
6
char *a = NULL; * * * * *//здесь объявляем переменную-указатель
a=new char[100];
for(int i=0;i<=9;i++) * *//цикл присваиваний значений
{
 ...// Повторное использование уже выделенной памяти.
}
Добавлено через 5 минут
Цитата Сообщение от mc.Duck Посмотреть сообщение
Но, тем не менее на основе указателей основано множество интересных методов, например сортировка массива с использованием бинарного дерева
Может тогда уж балансировка двоичного дерева на основе массива? Хотя я, например, даже это слабо себе представляю.

Добавлено через 2 минуты
Цитата Сообщение от mc.Duck Посмотреть сообщение
указатели - прошлый век! Сейчас надо голову над другим ломать, над чем-то более современным. Без указателей всегда можно обойтись.
Вот только в прошлом веке без них и можно было реально обойтись, да и то не долго.

Добавлено через 7 минут
Цитата Сообщение от mc.Duck Посмотреть сообщение
alex_x_x, я лишь хотел показать, что использование в программах указателей черевато ошибками
Нет. Ты показал, что не понимаешь смысла собственных действий с указателями. Чем их заменить, кстати? Решёточники предлагают ссылки. Предположим, так сделают на плюсах. И что?
C++
1
2
3
int &a=new int [1000];
...
a=0; // Вместо освобождения памяти тупо присвоился ноль элементу с нулевым индексом, освободить же память не возможно, то есть вся динамическая память гарантировано течёт.
. А адресная арифметика?
C++
1
2
3
int *a=new int [1000];
int *p=a;
++p; //Инкремент адреса, то есть переход к следующему элементу массива
C++
1
2
3
int &a=new int [1000];
int &p=a;
++p; //Инкремент элемента массива с нулевым индексом, адрес не меняется.
.

Добавлено через 5 минут
Цитата Сообщение от Dekio Посмотреть сообщение
Ссылками например (НЕ явными указателями). А скорость работы программы?
Ссылка не есть неявный указатель. Ссылка - это синоним самого данного, который может быть реализован с помощью скрытого неявно разыменованного указателя, но такая реализация не гарантируется стандартом. Кроме того, если скрытый указатель не кастрирован до полной бесполезности везде, кроме изменяемых параметров подпрограмм, то он то как раз и опасен, и путаницу гарантирует. Ладно ещё NULL и 0, различные семантически, для освобождения массива интов (a=0 - обнуление, а=NULL - освобождение). А если массив ссылок на динамические данные?

Добавлено через 3 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну проблемы то есть, что уж скрывать и иногда очень сложные для разрешения
Ну ка приведи пример хоть одной проблемы, которую нельзя решить просто, мельком пролистав исходник на трезвую голову. Не можешь? То то же. Проблемы не от указателей, а от пива. Нельзя писать с пьяну и всего делов.

Добавлено через 6 минут
Цитата Сообщение от Thinker Посмотреть сообщение
А как, например, вы будете массив функции передавать? А в Си без указателей ну совсем никак!
Можно весь массив в стек запихать, как обычную переменную.

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Например, в бейсике?
И как это я на с бейсика обращался напрямую к памяти для поддержки нестандартного бинарника с векторным шрифтом? В бейсике указатель не введён в стандарт, но это не означает отсутствия в языке указателей. Я только не помню, какую именно отсебятину на тему указателей снёс лорд Клайв (а может какой работавший на него програмер) и не могу привести кусок исходника с указателем на бейсике.

Добавлено через 4 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Но кюбасик, который ещё под ДОСом бегал - один из лучших языков в мире, имхо.
Ползал он там, а не бегал. Худший диалект даже среди бейсика. По крайне мере, из тех, которые я знаю. На его фоне даже бласт - сказка, а не диалект.

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Если б был бы такой же, только современный, и под Виндовс.
то был бы крокодил зелёный, синий как морковка.

Добавлено через 3 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Сам я ничего против указателей не имею. Но если я пишу библиотечный класс, то пишу его таким образом, что бы пользователю не пришлось иметь дело с указателем.
Правильно. Чужие указатели из непонятного класса - мина почти мгновенного действия, но члены то класса могут с указателем работать.

Добавлено через 5 минут
Цитата Сообщение от Диман56 Посмотреть сообщение
Хорошо))) Исправлю) Просто проблема в том, что у меня не получается присвоить i-ой строке имя файла.
Проблема в том, что строка - тоже массив, а у тебя массив массивов и указатель на указатель, а не на char. Массиву же нельзя ничего присвоить целиком, а только поэлементно, или передавай его в функцию копирожания строк, как параметр - приёмник, тогда уже в ней спрячется то же самое поэлементное присваивание.
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.11.2011, 15:05     Понимание для чего вообще нужны указатели? #64
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну ка приведи пример хоть одной проблемы, которую нельзя решить просто, мельком пролистав исходник на трезвую голову. Не можешь? То то же. Проблемы не от указателей, а от пива. Нельзя писать с пьяну и всего делов.
у Саттера посмотри, он там много проблем приводит
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 15:26     Понимание для чего вообще нужны указатели? #65
Цитата Сообщение от diagon Посмотреть сообщение
Эти обертки намного более удобны и безопасны, и пользоваться следует именно ими.
Обёртка, которую не понимаешь, опасна, в отличие от указателя. Пусть память из неё не утечёт, ну так она и так не утечёт, зато с непонятной обёрткой ты наделаешь много других делов ещё опаснее любой утечки.

Добавлено через 7 минут
Цитата Сообщение от Bers Посмотреть сообщение
Поэтому, старайся по возможности всегда избегать ситуаций, когда у тебя один указатель указывает на другой. В с++ для этого есть множество решений.
Один из самых простых вариантов - это замаскировать указатель так, что бы он воспринимался не как указатель, а как отдельный тип данных. Например "строка" - это строка, а не "массив чаров"
Это как раз и таит опастности и запутывает:
C++
1
2
a=new char*[256]; // Здесь мы сразу видим, что выделили память только для хранения указателей на строки, но ещё не выделили память для хранения символов.
b=new strig[256]; // А здесь этого не видно, логика же на самом деле не меняется, вообще ни одна другая строка, кроме непосредственно выделения памяти не должна измениться
Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Другой способ понижения сложности логики - это создание дополнительной сущности, которая инкапсулирует внутри себя знание об указателе:
Не другой, а единственный.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились.
Ну ка приведи пример прикладной задачи, в которой бы это не понадобилось.

Добавлено через 3 минуты
Цитата Сообщение от Диман56 Посмотреть сообщение
Bers, спасибо вам огромное!!! Со структурами уже приходилось работать, поэтому второй вариант для меня более приемлемый) Тем более, мне нужно записывать ещё кое-какие данные о файле, поэтому юзать буду структуру.
Структура не упрощает логику, так ка ничего не инкапсулирует, нужен именно класс. И хотя структура на плюсах на самом деле класс, но объявление в ней иных членов, кроме public-полей - надёжнейший способ запоганить синтаксис, а потом забыть, что имел ввиду.

Добавлено через 3 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
alex_x_x, прикладной программист просто-напросто будет использовать библиотеки
Не бывает задач, которые можно решить только библиотеками, просто по-своему их собрав, иначе в программиста, причём, хорошего, мог бы за четверть минуты перквалифицироваться любой каменщик, даже дебильный.
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.11.2011, 15:29     Понимание для чего вообще нужны указатели? #66
Цитата Сообщение от taras atavin Посмотреть сообщение
Структура не упрощает логику, так ка ничего не инкапсулирует, нужен именно класс.
Если ничего не инкапсулирует структура как раз подойдет. Например
C++
1
std::pair
- просто группирует поля
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 15:34     Понимание для чего вообще нужны указатели? #67
Цитата Сообщение от programina Посмотреть сообщение
Функция void Cleanup() как в моей проге.
Для этого надо:
1. Все указатели объявить глобально.
2. Ни один не забыть при разработке самой функции.
Так что это как раз почти гарантия утечек.

Добавлено через 3 минуты
Цитата Сообщение от PointsEqual Посмотреть сообщение
Если ничего не инкапсулирует - именно структура и нужна.
Согласен, но в данном случае требуется упростить логику указателя на указатель, сведя его к указателю на непосредственное данное, а просто сгруппировав поля ты этого не добьёшься, всё равно надо будет по полю структуры, живущей по указателю выделять/освобождать доступ и дважды в одной адресации использовать адресную арифметику: чтоб добраться до структуры и до данного по указателю в структуре. Я не призываю вообще забыть про структуры, но в данном случае нужен именно класс.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
14.11.2011, 15:35     Понимание для чего вообще нужны указатели? #68
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну ка приведи пример хоть одной проблемы, которую нельзя решить просто, мельком пролистав исходник на трезвую голову. Не можешь? То то же. Проблемы не от указателей, а от пива. Нельзя писать с пьяну и всего делов
ой вей, не смешите, ви таки эксперт рассудите
silent_1991
14.11.2011, 18:18
  #69

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Ну ка приведи пример
Ща-ща, уже привожу...

Lateralus
8 / 8 / 0
Регистрация: 05.11.2011
Сообщений: 78
14.11.2011, 18:23     Понимание для чего вообще нужны указатели? #70
Можно программировать без указателей,как в Java,но это не даст полного понимания работы
компьютера.
Bers
Заблокирован
14.11.2011, 23:58     Понимание для чего вообще нужны указатели? #71
Цитата Сообщение от taras atavin Посмотреть сообщение
И в чём же мина?
Объект А держит указатель на объект Б.
Объект Б был уничтожен. Объект А ничего об этом не знает. Его указатель стал не_валидным.
Объект А обратился к Б по указателю. БАБАХ!


Держать указатель на объект не трудно. Трудно проконтролировать, валидны ли данные на которые указывает указатель.

И тут только три варианта:
1. Либо нарушение инварианта модуля/класса. Вася и Петей написали свои части кода. А потом Бабах! И оба сидят в отладчике.

2. Превентивная защита. То есть, такая архитектура, при которой в принципе не случится такого, что бы данные по указателю стали не_валидными. Для этого и придумали всякие интеллектуальные указатели и прочую лабуду.

Но программистам свойственно ошибаться, как и всем людям. И тогда БАБАХ, и он сидит в отладчике.

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

Ну обнаружит валидатор, что указатель не_валидный. А объекту А нужно обратится к объекту Б!
Как могла случится такая ситуация, что объект А не может обратится к Б, если он должен это сделать по своей управляющей логике? Налицо какая то программная ошибка. И хотя бабаха не было, один хрен придётся опять сидеть с отладчиком.


В любом случае фраза:

Цитата Сообщение от Bers Посмотреть сообщение
а потом туда обратиться, когда угодно
Либо мина замедленного действия.
Либо вовсе не тривиальная система, и обращение к объекту происходит далеко не когда угодно.
А держатель указателя скорее всего сам же и контролирует время жизни объекта.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 05:45     Понимание для чего вообще нужны указатели? #72
Цитата Сообщение от Bers Посмотреть сообщение
Объект А держит указатель на объект Б.
Вывод: это protected указатель и только сам объект A может его проделитить, либо оба объекта имеют прекрёстные protected указатели, относятся к одному классу и каждый в своём деструкторе начинает с записи NULL в указатель, живущий во втором объекте.
Цитата Сообщение от Bers Посмотреть сообщение
Объект Б был уничтожен.
Вывод: объектом A, либо объект A уведомлен путём записи NULL в указатель.
Цитата Сообщение от Bers Посмотреть сообщение
Объект А ничего об этом не знает.
И как же это стало возможным?
Цитата Сообщение от Bers Посмотреть сообщение
Его указатель стал не_валидным. Объект А обратился к Б по указателю.
А зачем обращаться к невалидному указателю? Уж если не понимаешь смысла своих действий, так можно проще сделать: поделить на ноль, вычислить логарифм отрицательного числа, вызвать функцию по адресу данного, а проще всего дать кувалдой по системнику. Вот представь: ты у себя в комнате, между комнатой и коридором есть дверь, ты сам её закрыл, но ты не знаешь об этом и пытаешься выйти в коридор. Тот же бабах. Так ведь не бывает? А сев за компьютер, с какого перепугу ты вдруг станешь не дееспособным? От стараха перед непонятной техникой? Ну так если твой родной век - каменный, то в этом виноваты не указатели.

Добавлено через 3 минуты
Цитата Сообщение от Lateralus Посмотреть сообщение
Можно программировать без указателей,как в Java,но это не даст полного понимания работы компьютера.
Только я месяц потратил на корягу в 4 уровня на скриптовой джаве, причём, фактически статическую, заменив указатели varible массивом. Написал за неделю, отлаживал три недели, а с указателями любые деревья пишутся несколько раз за один день и не требуют отладки, причём, действительно и в полном объёме динамические.
Bers
Заблокирован
15.11.2011, 05:52     Понимание для чего вообще нужны указатели? #73
taras atavin

Ниже представленный код мало того, что прекрасно компилируется и работает.
Так ещё и крушений не вызывает. (До поры, до времени).
Этот код иллюстрирует как легко можно встрять и даже не заметить.

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
class B
{
public:  void Test() {  a=666; }
private: int a;
};
 
class A
{
public:    
    A(B* ptr): m_ptr(ptr) {}
    void Test() {  m_ptr->Test();  }
protected:
    B* m_ptr;
};
 
 
int main()
{
  B* ptr= new B;
 
  A test(ptr);
 
  delete ptr;
 
  test.Test();
 
    
 
    EndProgramm();
}
Если класс держит указатель на другой объект, становится очень щепетильными ответы на такие вопросы: кто контролирует время жизни объектов, как определить валидный указатель, или уже нет.

И все это делается только ради того, что бы А не угораздило обратится к уже убитому Б.

А если архитектура проекта посложнее хэлло ворлд, и работают несколько человек, то все эти щекотливые вопросы становятся очень актуальными.


/зы У меня 90% всех ошибок связано с указателями. Если что-то где то упало в рантайме, то скорее всего оно упало по вине некорректного использования указателя.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 06:00     Понимание для чего вообще нужны указатели? #74
Цитата Сообщение от Bers Посмотреть сообщение
и даже не заметить.
В твоём коде невооруженным глазом виден косяк:
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
class A { public: A(B* ptr): m_ptr(ptr) {} void Test() { m_ptr->Test(); } protected: B* m_ptr; };
А тупо копирует во внутренее поле указатель на объект другого класса. Ты ключи от квартиры где хранишь? Конечно же в сейфе спецслужбы другой страны, причём, ты ей не интересен. И когда приходишь вечером домой, то неожиданно выясняется, что ключи выброшены.
Bers
Заблокирован
15.11.2011, 06:02     Понимание для чего вообще нужны указатели? #75
Цитата Сообщение от taras atavin Посмотреть сообщение
А тупо копирует во внутренее поле указатель на объект другого класса. Ты ключи от квартиры где хпранишь? Конечно же в сейфе спецслуюбы другой страны, причём, ты ей не интересен. И когда приходишь вечером домой, то неожиданно выясняется, что ключи выброшены.
Не понял к чему это было сказано.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 06:07     Понимание для чего вообще нужны указатели? #76
Цитата Сообщение от Bers Посмотреть сообщение
/зы У меня 90% всех ошибок связано с указателями. Если что-то где то упало в рантайме, то скорее всего оно упало по вине некорректного использования указателя.
У меня на 20 000 ошибок 19 999 в паскале и оказываются выходом за пределы массива, оставшаяся одна - или алгоритмическая ошибка, или очепятка в каком нибудь идентификаторе. И никогда не было ошибок, связанных с указателями, даже когда я толкьо начинал учиться программировать, причём самостоятельно.

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Не понял к чему это было сказано.
К тому, что только чайник способен во внутреннем поле одного объекта хранить указатель на внешний объект другого класса. И то не всякий. Ктому, что прочитав твой код класса A, я чуть не заорал в слух: "Ересь!".
Bers
Заблокирован
15.11.2011, 06:12     Понимание для чего вообще нужны указатели? #77
Цитата Сообщение от taras atavin Посмотреть сообщение
К тому, что только чайник способен во внутреннем поле одного объекта хранить указатель на внешний объект другого класса.
Смысл хранить указатель на внутренний объект?
Внутри проще хранить сами объекты.

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

А голый указатель, оказавшийся "на другой стороне" становится потенциально опасным.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 06:22     Понимание для чего вообще нужны указатели? #78
Цитата Сообщение от Bers Посмотреть сообщение
как определить валидный указатель, или уже нет.
По значению самого указателя: если он не валиден, то равен NULL. Поэтому то и можно хранить в полях только два вида указателей:
1. Перкрёстные на свой класс.
2. на подчинённые объекты.
Иначе объект B не знает, где треубуется записать тот самый NULL.

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Смысл хранить указатель на внутренний объект? Внутри проще хранить сами объекты.
А если твой класс - класс ограниченного, динамического, или разреженного массива? А если твой объект содержит динамический массив в числе других полей? А если объект A должен создать в своём поле объект толи базового класса B, толи одного из известных на этапе разработки классса A классов, производных от B, но конкретный фактический класс санет известен только на этапе исполнения? unionы, конечно, ни кто не отменял, а если у одного из производных классов ещё и sizeof больше на пару сотен килобайт, а сам экземпляр A ещё и в массиве из нескольких сотен тысяч элментов? И ты забываешь о самом интересном назначении указателей - реализации процедурных типов через типы указателей на функции.

Добавлено через 4 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Указатель и нужен собственного говоря, для того, что бы знание об объекте передать куда то ещё - вызывающей стороне, или в вызываемую сторону.
Передать объект по указаетлю для использхзования этого указателя внутри функции при однократном её исполнении - это одно, а хранить указатель на внешнйи объект - совсем другое. В первом случае управление имеет объект A и ни кто другой не может удалить объект B, но и объект A не должен этого делать, так что лучше передавать по ссылке, но если понимаешь, как можно, а как нельзя обращаться с чужими указателями, то можно и по указателю. Во втором же случае ты теряешь контроль.
Bers
Заблокирован
15.11.2011, 06:25     Понимание для чего вообще нужны указатели? #79
taras atavin, реальный пример: библиотека DevIL
Загружает картинку, а наружу выдаёт указатель на массив цветов пикселей этой картинки.

Получив этот указатель себе в руки, можно делать с внутренними данными Девила все что угодно. Например, сделать им delete. Результат - крэш при де_инициализации Девила.


Другой пример: Пользователь просит менеджера создать ему девайс. Менеджер создаёт девайс, а наружу (пользователю) в руки предоставляет ИНТЕРФЕЙСНЫЙ УКАЗАТЕЛЬ.

Не указатель. А особый объект "интерфейсный указатель". С помощью которого пользователь сможет пользоваться внутренним объектом менеджера. Но не сможет его никак поломать.

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

Указатели нужны другим сторонам, а не владельцам. Но другим сторонам нельзя давать просто так указатели, потому что иначе считай инкапсуляция уже нарушена.

Выдай наружу указатель на приватные данные, и можешь считать, что они стали публичными.
Выдай наружу специализированный интерфейс - и считай, что проблема жизни и смерти объекта осталась проблемой владельца, и никого более.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 06:39     Понимание для чего вообще нужны указатели?
Еще ссылки по теме:

C++ Для чего нужны и зачем использовать smart-указатели?
C++ Указатели на слонов или А зачем нужны указатели?
C++ Для чего нужны битовые операции?
C++ Для чего нужны файлы с расширением .h, .c?
Allocator_traits propagate_on_container_ - для чего они нужны C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 06:39     Понимание для чего вообще нужны указатели? #80
Кстати, раз уж любишь такие указатели, то вот тебе ещё пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class B
{
 ...// вообще не важно, что здесь валяется
};
class A
{
 public: A(B& x); // Пока всё выглядит нормально
};
A::A(B& x) // Эту часть засовываем в статическую библиотеку, а с проектом связываем бинарник
{
 B *y;
 y=&x;
 delete y;
}
. Надеюсь не будешь оспаривать, что сочинить эту мину можно только специально?

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Получив этот указатель себе в руки, можно делать с внутренними данными Девила все что угодно. Например, сделать им delete. Результат - крэш при де_инициализации Девила.
Девелоперы библиотеки подумать не могли, что ты будешь делитить чужой указатель.
Yandex
Объявления
15.11.2011, 06:39     Понимание для чего вообще нужны указатели?
Закрытая тема Создать тему
Опции темы

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