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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 169, средняя оценка - 4.97
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 20:12     Понимание для чего вообще нужны указатели? #1
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 20:12     Понимание для чего вообще нужны указатели?
Посмотрите здесь:

Для чего нужны callback-функции C++
Для чего нужны вложенные структуры? C++
C++ Для чего нужны указатели на функции?
C++ для чего нужны хеш таблицы?
try catch throw для чего нужны? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
12.11.2011, 20:32     Понимание для чего вообще нужны указатели? #2
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
Тогда вам встречный вопрос: а как быть с массивами?! От массивов тоже предлагаете отказаться? Вель когда вы пишите, например,

C++
1
2
int a[N];
a[0] = 10;
то используется арифметика с указателями. То есть массив - это некоторый адрес в памяти, и для того, чтобы вычислить i-ый элемент массива используется арифметика указателей, то есть к адресу массива прибавляется целочисленное значение a + i * sizeof( int ).

Я уж не говорю о том, а как быть с памятью, выделяемой динамически?!
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.11.2011, 20:48     Понимание для чего вообще нужны указатели? #3
Я тоже раньше думала, что указатели - это что-то сложное, пока не прочитала одну статью про то как работает программа с памятью на низком уровне.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:07     Понимание для чего вообще нужны указатели? #4
Без указателей можете вычеркнуть все списки, стеки, деревья, которые располагаются в памяти не последовательно (в отличие от массивов), вычеркните динамические массивы, да собственно и обычные массивы, так как они тесно связаны с указателями. И что вы получите, задайте себе такой вопрос. Получится обычный калькулятор.
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 21:13  [ТС]     Понимание для чего вообще нужны указатели? #5
Да понял я) но все равно не понимаю) я понял предназначение указателей, но не понял их смысл. Для меня все ещё это что-то сложное.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.11.2011, 21:16     Понимание для чего вообще нужны указатели? #6
указатель не есть чтото необычное - это синтаксическая надстройка над командами ассемблера работы с памятью
mc.Duck
Заблокирован
12.11.2011, 21:28     Понимание для чего вообще нужны указатели? #7
Вообще, указатели в современное время почти ниодин уважающий себя программист не использует,
так как ныне памяти у компьютеров хоть отбавляй, а путаницы с этими указателями ооочень много.
Вот, например классический пример утечки памяти из-за применения указателей (язык С++):

C++
1
2
3
4
5
6
7
8
9
10
11
12
...
char *a = NULL;          //здесь объявляем переменную-указатель
for(int i=0;i<=9;i++)    //цикл присваиваний значений
{
a=new char[100];
}
 
delete [] a;              //на что указывает переменная "a"? На последний элемент цикла , 
                             //тобеш на элемент девятого шага
                             //но память то мы заняли и под остальные 9 элементов. 
                             //А вот как их теперь удалить?  
...

Но, тем не менее на основе указателей основано множество интересных методов,
например сортировка массива с использованием бинарного дерева.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.11.2011, 21:30     Понимание для чего вообще нужны указатели? #8
mc.Duck, смарт-поинтеры не изобрели?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:34     Понимание для чего вообще нужны указатели? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mc.Duck Посмотреть сообщение
Вообще, указатели в современное время почти ниодин уважающий себя программист не использует,

Не по теме:

Насмешили, так насмешили

mc.Duck
Заблокирован
12.11.2011, 21:38     Понимание для чего вообще нужны указатели? #10
Thinker, указатели - прошлый век! Сейчас надо голову над другим ломать, над чем-то более
современным. Без указателей всегда можно обойтись.

Добавлено через 1 минуту
alex_x_x, я лишь хотел показать, что использование в программах указателей черевато ошибками)
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
12.11.2011, 21:40     Понимание для чего вообще нужны указатели? #11
Написание программ само собой чревато ошибками.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
12.11.2011, 21:41     Понимание для чего вообще нужны указатели? #12
Цитата Сообщение от mc.Duck Посмотреть сообщение
Thinker, указатели - прошлый век!
Аргументы?

Цитата Сообщение от mc.Duck Посмотреть сообщение
Сейчас надо голову над другим ломать, над чем-то более
современным.
К примеру?

Цитата Сообщение от mc.Duck Посмотреть сообщение
Без указателей всегда можно обойтись.
Ссылками например (НЕ явными указателями). А скорость работы программы?

Цитата Сообщение от mc.Duck Посмотреть сообщение
использование в программах указателей черевато ошибками
У нормального программиста никаких проблем с указателями не будет
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.11.2011, 21:43     Понимание для чего вообще нужны указатели? #13
Цитата Сообщение от Dekio Посмотреть сообщение
Ссылками например (НЕ явными указателями). А скорость работы программы?
не изменится
Цитата Сообщение от Dekio Посмотреть сообщение
К примеру?
c#/java видимо
Цитата Сообщение от Dekio Посмотреть сообщение
У нормального программиста никаких проблем с указателями не будет
ну проблемы то есть, что уж скрывать
и иногда очень сложные для разрешения
Bers
Заблокирован
12.11.2011, 21:46     Понимание для чего вообще нужны указатели? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
Ну смотри, например, ты хочешь попросить систему выделить тебе памяти под массив.

Ты говоришь: "Система! Дай мне мегабайт памяти!"
А она тебе отвечает: "Да не вопрос, бери! "

На самом деле Система сначала будит искать свободный, никем не занятый кусок памяти.
А когда найдёт, ей нужно как то передать тебе знание о том, где этот кусок лежит.

Она тебе говорит: "Вот ты просил у меня мегабайт памяти, вот я тебе нашла нужный кусок. Вот его адресс - бери и пользуйся".

С точки зрения высокоуровневого программиста на с++, указатель - это самая обычная переменная, задача которой хранить адрес.

И когда ты делаешь например так:

C++
1
2
3
int* ptr = new int [100]; //Система, дай мне кусок памяти, 
                                    //в котором можно поместить 100 штук 
                                    //переменных типа int
Она возвращает тебе адрес. Хорошо, адрес у тебя есть.
Но тебе же нужно не просто знать адрес памяти, который у тебя теперь есть.
Тебе ещё нужно как то получить доступ к этой памяти.

По сути на руках у тебя есть только указатель на кусок памяти. Но у самого этого куска памяти имени нет. Этот кусок памяти - это не переменная, это просто кусок памяти и все!

Теперь смотри дальше. Допустим, у тебя есть собственно ручно написанный класс.
Допустим... CColobok

Когда ты говоришь системе:

C++
1
CColobok* ptr = new CColobok(); //Система тебе память выделила
Память то ты получил. И колобка там своего тоже поместил.
Но тебе же нужен не просто кусок памяти. Тебе нужно получить доступ к самому колобку!

Адрес то колобка у тебя есть. У тебя нету имени этого колобка. Понимаешь? Колобок есть, а имени нету.

Однако, твой указатель имеет тип. И тип данных указателя подскажет компилятору, на что именно он указывает.

Таким образом значение указателя - это где живет колобок. А тип указателя - это что кусок памяти действительно является колобком.

Вот и получается, что указатель позволяет программисту работать с объектами, не зная их имен.
И работать не с переменными, а напрямую с памятью.
mc.Duck
Заблокирован
12.11.2011, 21:51     Понимание для чего вообще нужны указатели? #15
KuKu, полностью с вами согласен.

Добавлено через 2 минуты
alex_x_x, да еще найдется над чем голову поломать - WinApi - тоже не так то просты в изучении)
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 21:51  [ТС]     Понимание для чего вообще нужны указатели? #16
Цитата Сообщение от Bers Посмотреть сообщение
Ну смотри, например, ты хочешь попросить систему выделить тебе памяти под массив.

Ты говоришь: "Система! Дай мне мегабайт памяти!"
А она тебе отвечает: "Да не вопрос, бери! "

На самом деле Система сначала будит искать свободный, никем не занятый кусок памяти.
А когда найдёт, ей нужно как то передать тебе знание о том, где этот кусок лежит.

Она тебе говорит: "Вот ты просил у меня мегабайт памяти, вот я тебе нашла нужный кусок. Вот его адресс - бери и пользуйся".

С точки зрения высокоуровневого программиста на с++, указатель - это самая обычная переменная, задача которой хранить адрес.

И когда ты делаешь например так:

C++
1
2
3
int* ptr = new int [100]; //Система, дай мне кусок памяти, 
                                    //в котором можно поместить 100 штук 
                                    //переменных типа int
Она возвращает тебе адрес. Хорошо, адрес у тебя есть.
Но тебе же нужно не просто знать адрес памяти, который у тебя теперь есть.
Тебе ещё нужно как то получить доступ к этой памяти.

По сути на руках у тебя есть только указатель на кусок памяти. Но у самого этого куска памяти имени нет. Этот кусок памяти - это не переменная, это просто кусок памяти и все!

Теперь смотри дальше. Допустим, у тебя есть собственно ручно написанный класс.
Допустим... CColobok

Когда ты говоришь системе:

C++
1
CColobok* ptr = new CColobok(); //Система тебе память выделила
Память то ты получил. И колобка там своего тоже поместил.
Но тебе же нужен не просто кусок памяти. Тебе нужно получить доступ к самому колобку!

Адрес то колобка у тебя есть. У тебя нету имени этого колобка. Понимаешь? Колобок есть, а имени нету.

Однако, твой указатель имеет тип. И тип данных указателя подскажет компилятору, на что именно он указывает.

Таким образом значение указателя - это где живет колобок. А тип указателя - это что кусок памяти действительно является колобком.

Вот и получается, что указатель позволяет программисту работать с объектами, не зная их имен.
И работать не с переменными, а напрямую с памятью.
Блин, вот это самое толковое объяснение!! Спасибо вам, пойду кодить!!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:55     Понимание для чего вообще нужны указатели? #17
Цитата Сообщение от mc.Duck Посмотреть сообщение
Thinker, указатели - прошлый век! Сейчас надо голову над другим ломать, над чем-то более
современным. Без указателей всегда можно обойтись
А как, например, вы будете массив функции передавать? А в Си без указателей ну совсем никак!
Bers
Заблокирован
12.11.2011, 21:56     Понимание для чего вообще нужны указатели? #18
Цитата Сообщение от Thinker Посмотреть сообщение
В чем то вы правы, НО, как, например, вы будете массив функции передавать? А в Си без указателей ну совсем никак!
Ну а как передают массивы в функции в тех языках, где нет указателей? Например, в бейсике?
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 21:57  [ТС]     Понимание для чего вообще нужны указатели? #19
Начал кодить, теперь блин в каждой операции с указателем говорю про себя(уже приелось, похоже):Система, дай мне кусок памяти!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2011, 21:58     Понимание для чего вообще нужны указатели?
Еще ссылки по теме:

что такое векторы и для чего нужны!? C++
Для чего нужны интерфейсы? C++
C++ Для чего нужны и зачем использовать smart-указатели?

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:58     Понимание для чего вообще нужны указатели? #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Bers Посмотреть сообщение
Ну а как передают массивы в функции в тех языках, где нет указателей? Например, в бейсике?
Забудьте про бейсик, вот это как раз и есть прошлый век
Yandex
Объявления
12.11.2011, 21:58     Понимание для чего вообще нужны указатели?
Закрытая тема Создать тему
Опции темы

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