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

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

12.11.2011, 20:12. Показов 33675. Ответов 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
Закрытая тема Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru