Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/159: Рейтинг темы: голосов - 159, средняя оценка - 4.86
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154

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

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

Студворк — интернет-сервис помощи студентам
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2011, 20:12
Ответы с готовыми решениями:

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

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

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

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

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

Я уж не говорю о том, а как быть с памятью, выделяемой динамически?!
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.11.2011, 20:48
Я тоже раньше думала, что указатели - это что-то сложное, пока не прочитала одну статью про то как работает программа с памятью на низком уровне.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:07
Без указателей можете вычеркнуть все списки, стеки, деревья, которые располагаются в памяти не последовательно (в отличие от массивов), вычеркните динамические массивы, да собственно и обычные массивы, так как они тесно связаны с указателями. И что вы получите, задайте себе такой вопрос. Получится обычный калькулятор.
0
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 21:13  [ТС]
Да понял я) но все равно не понимаю) я понял предназначение указателей, но не понял их смысл. Для меня все ещё это что-то сложное.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:16
указатель не есть чтото необычное - это синтаксическая надстройка над командами ассемблера работы с памятью
0
Заблокирован
12.11.2011, 21:28
Вообще, указатели в современное время почти ниодин уважающий себя программист не использует,
так как ныне памяти у компьютеров хоть отбавляй, а путаницы с этими указателями ооочень много.
Вот, например классический пример утечки памяти из-за применения указателей (язык С++):

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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:30
mc.Duck, смарт-поинтеры не изобрели?
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2011, 21:34
Лучший ответ Сообщение было отмечено как решение

Решение

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

Не по теме:

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

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

Добавлено через 1 минуту
alex_x_x, я лишь хотел показать, что использование в программах указателей черевато ошибками)
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
12.11.2011, 21:40
Написание программ само собой чревато ошибками.
0
Фрилансер
Эксперт С++
 Аватар для Dekio
5845 / 1226 / 499
Регистрация: 23.11.2010
Сообщений: 3,373
Записей в блоге: 1
12.11.2011, 21:41
Цитата Сообщение от mc.Duck Посмотреть сообщение
Thinker, указатели - прошлый век!
Аргументы?

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

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

Цитата Сообщение от mc.Duck Посмотреть сообщение
использование в программах указателей черевато ошибками
У нормального программиста никаких проблем с указателями не будет
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 21:43
Цитата Сообщение от Dekio Посмотреть сообщение
Ссылками например (НЕ явными указателями). А скорость работы программы?
не изменится
Цитата Сообщение от Dekio Посмотреть сообщение
К примеру?
c#/java видимо
Цитата Сообщение от Dekio Посмотреть сообщение
У нормального программиста никаких проблем с указателями не будет
ну проблемы то есть, что уж скрывать
и иногда очень сложные для разрешения
0
Заблокирован
12.11.2011, 21:46
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Решение

Цитата Сообщение от Bers Посмотреть сообщение
Ну а как передают массивы в функции в тех языках, где нет указателей? Например, в бейсике?
Забудьте про бейсик, вот это как раз и есть прошлый век
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2011, 21:58
Помогаю со студенческими работами здесь

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

Что за драйвера такие, для чего они и нужны ли они вообще?
Что за драйвера такие, для чего они и нужны ли они вообще? 1 Intel SATA Preinstall driver (For AHCI / RAID Mode) Note: Press F6...

С чего начать для понимание PHP
Добрый день, прошу помощи по изучению веб программирования, на днях пришлось начать администрировать простой сайт на html, вспомнил время...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они могут понадобятся?

Понимание звуковой волны , да и вообще волн в целом
Не могу связать в голове физическую модель звуковой волны (последовательное сгущение и разряжение воздуха) и графическую (синусоида) ....


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru