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

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

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

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

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

Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 20:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Понимание для чего вообще нужны указатели? (C++):

Для чего нужны указатели? - C++
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно new delete

Для чего нужны указатели на функции? - C++
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее указатель и им пользоваться...

Ссылки и указатели, для чего нужны те и другие? - C++
Что такое ссылки? Что такое указатели? ДЛЯ чего служат те и другие?

Для чего нужны и зачем использовать smart-указатели? - C++
В Страуструпе не нашел, кто подскжает где можно про них прочитать ?)

Для чего нужны интерфейсы? - C++
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства, которые при наследовании классами должны были...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2011, 11:45 #61
Функция void Cleanup() как в моей проге.
Обнуляет все что было инициализировано при выходе из программы или при ее перезагрузке
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 13:20 #62
Цитата Сообщение от Bers
итого: пох на ивариант класса. Типа мы в теме, спаггети нам жрать не впервой!
сначала нужно узнать, что такое указатели (это основы)
чтобы потом в каком-нибудь незнакомом коде разбираться
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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. Массиву же нельзя ничего присвоить целиком, а только поэлементно, или передавай его в функцию копирожания строк, как параметр - приёмник, тогда уже в ней спрячется то же самое поэлементное присваивание.
0
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.11.2011, 15:05 #64
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну ка приведи пример хоть одной проблемы, которую нельзя решить просто, мельком пролистав исходник на трезвую голову. Не можешь? То то же. Проблемы не от указателей, а от пива. Нельзя писать с пьяну и всего делов.
у Саттера посмотри, он там много проблем приводит
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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, прикладной программист просто-напросто будет использовать библиотеки
Не бывает задач, которые можно решить только библиотеками, просто по-своему их собрав, иначе в программиста, причём, хорошего, мог бы за четверть минуты перквалифицироваться любой каменщик, даже дебильный.
0
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.11.2011, 15:29 #66
Цитата Сообщение от taras atavin Посмотреть сообщение
Структура не упрощает логику, так ка ничего не инкапсулирует, нужен именно класс.
Если ничего не инкапсулирует структура как раз подойдет. Например
C++
1
std::pair
- просто группирует поля
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 15:34 #67
Цитата Сообщение от programina Посмотреть сообщение
Функция void Cleanup() как в моей проге.
Для этого надо:
1. Все указатели объявить глобально.
2. Ни один не забыть при разработке самой функции.
Так что это как раз почти гарантия утечек.

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

Не по теме:

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

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


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

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

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

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

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

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


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

Цитата Сообщение от Bers Посмотреть сообщение
а потом туда обратиться, когда угодно
Либо мина замедленного действия.
Либо вовсе не тривиальная система, и обращение к объекту происходит далеко не когда угодно.
А держатель указателя скорее всего сам же и контролирует время жизни объекта.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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 массивом. Написал за неделю, отлаживал три недели, а с указателями любые деревья пишутся несколько раз за один день и не требуют отладки, причём, действительно и в полном объёме динамические.
0
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% всех ошибок связано с указателями. Если что-то где то упало в рантайме, то скорее всего оно упало по вине некорректного использования указателя.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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; };
А тупо копирует во внутренее поле указатель на объект другого класса. Ты ключи от квартиры где хранишь? Конечно же в сейфе спецслужбы другой страны, причём, ты ей не интересен. И когда приходишь вечером домой, то неожиданно выясняется, что ключи выброшены.
0
Bers
Заблокирован
15.11.2011, 06:02 #75
Цитата Сообщение от taras atavin Посмотреть сообщение
А тупо копирует во внутренее поле указатель на объект другого класса. Ты ключи от квартиры где хпранишь? Конечно же в сейфе спецслуюбы другой страны, причём, ты ей не интересен. И когда приходишь вечером домой, то неожиданно выясняется, что ключи выброшены.
Не понял к чему это было сказано.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 06:02
Привет! Вот еще темы с ответами:

Для чего нужны callback-функции - C++
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.

Для чего нужны вложенные структуры? - C++
Скажите пожалуйста для чего нужны вложенные структуры и где их используют?

для чего нужны хеш таблицы? - C++
для чего нужны хеш таблицы? если есть массивы )

try catch throw для чего нужны? - C++
Для чего нужны эти операторы? Линканите пожалуйста статью, где доходчиво объяснено их применение, в разных вариантах (например я видел...


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

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

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