Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/136: Рейтинг темы: голосов - 136, средняя оценка - 4.89
Диман56
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
#1

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

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

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

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть...

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

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

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

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

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

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

Я уж не говорю о том, а как быть с памятью, выделяемой динамически?!
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.11.2011, 20:48 #3
Я тоже раньше думала, что указатели - это что-то сложное, пока не прочитала одну статью про то как работает программа с памятью на низком уровне.
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:07 #4
Без указателей можете вычеркнуть все списки, стеки, деревья, которые располагаются в памяти не последовательно (в отличие от массивов), вычеркните динамические массивы, да собственно и обычные массивы, так как они тесно связаны с указателями. И что вы получите, задайте себе такой вопрос. Получится обычный калькулятор.
0
Диман56
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 21:13  [ТС] #5
Да понял я) но все равно не понимаю) я понял предназначение указателей, но не понял их смысл. Для меня все ещё это что-то сложное.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:16 #6
указатель не есть чтото необычное - это синтаксическая надстройка над командами ассемблера работы с памятью
0
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 элементов. 
                             //А вот как их теперь удалить?  
...

Но, тем не менее на основе указателей основано множество интересных методов,
например сортировка массива с использованием бинарного дерева.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:30 #8
mc.Duck, смарт-поинтеры не изобрели?
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:34 #9
Лучший ответ Сообщение было отмечено как решение

Решение

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

Не по теме:

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

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

Добавлено через 1 минуту
alex_x_x, я лишь хотел показать, что использование в программах указателей черевато ошибками)
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
12.11.2011, 21:40 #11
Написание программ само собой чревато ошибками.
0
Dekio
Фрилансер
Эксперт С++
5838 / 1219 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
12.11.2011, 21:41 #12
Цитата Сообщение от mc.Duck Посмотреть сообщение
Thinker, указатели - прошлый век!
Аргументы?

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

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

Цитата Сообщение от mc.Duck Посмотреть сообщение
использование в программах указателей черевато ошибками
У нормального программиста никаких проблем с указателями не будет
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:43 #13
Цитата Сообщение от Dekio Посмотреть сообщение
Ссылками например (НЕ явными указателями). А скорость работы программы?
не изменится
Цитата Сообщение от Dekio Посмотреть сообщение
К примеру?
c#/java видимо
Цитата Сообщение от Dekio Посмотреть сообщение
У нормального программиста никаких проблем с указателями не будет
ну проблемы то есть, что уж скрывать
и иногда очень сложные для разрешения
0
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(); //Система тебе память выделила
Память то ты получил. И колобка там своего тоже поместил.
Но тебе же нужен не просто кусок памяти. Тебе нужно получить доступ к самому колобку!

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

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

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

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

Добавлено через 2 минуты
alex_x_x, да еще найдется над чем голову поломать - WinApi - тоже не так то просты в изучении)
0
Диман56
22 / 22 / 4
Регистрация: 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(); //Система тебе память выделила
Память то ты получил. И колобка там своего тоже поместил.
Но тебе же нужен не просто кусок памяти. Тебе нужно получить доступ к самому колобку!

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

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

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

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

Решение

Цитата Сообщение от Bers Посмотреть сообщение
Ну а как передают массивы в функции в тех языках, где нет указателей? Например, в бейсике?
Забудьте про бейсик, вот это как раз и есть прошлый век
4
12.11.2011, 21:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2011, 21:58

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

Для чего нужны файлы с расширением .h, .c?
Не подскажите, для чего нужен (.h) и (.c) файл? А (.cpp)? Я читал, что это...

.elf и для чего они нужны
Собственно сабж Почитал Вики, как-то для новичка не очень много прояснилось И...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

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