|
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
|
|
Понимание для чего вообще нужны указатели?12.11.2011, 20:12. Показов 33687. Ответов 112
Метки нет (Все метки)
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
|
|
| 12.11.2011, 20:12 | |
|
Ответы с готовыми решениями:
112
Для чего нужны указатели?
Ссылки и указатели, для чего нужны те и другие? |
|
Заблокирован
|
|
| 12.11.2011, 23:18 | |
|
1
|
|
|
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
|
|
| 12.11.2011, 23:20 [ТС] | |
|
Спасибо) попробую только завтра-второй час ночи уже. Спасибо за помощь. Ещё вопрос-а размер строки-то как в таком объявлении указывать?)
0
|
|
|
Заблокирован
|
||
| 12.11.2011, 23:32 | ||
|
Но тебе нужно понять ещё одну не очевидную вещь: По адресу, на который указывает указатель может жить... другой указатель. И этот другой указатель уже может указывать ещё куда то. В твоём случае, строка это кусок памяти, который хранит кучку char`ов Поэтому, можно считать, что указатель , который указывает на кусок памяти, который хранит чары - это и есть строка. Ну то есть: char* в твоём отдельно взятом случае можно считать строкой. Можно даже сделать псевдоним для наглядности: typedef char* String; //теперь String- это тот же самый char* но воспринимается, как "строка" Тебе же нужно создать массив строк. Причем динамический. Тебе нужно попросить систему выделить тебе память под несколько штук строк. ты пишешь: String* МойМассив = new String[количество строк]; это будит равносильно: char** МойМассив = new char* [количество строк]; На самом деле МойМассив - это указатель, который указывает на кусок памяти, в котором живут другие указатели, которые уже в свою очередь указывают на строки.
1
|
||
|
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
|
|
| 12.11.2011, 23:34 [ТС] | |
|
Спасибо вам, все толково объяснено.
0
|
|
|
Заблокирован
|
|||||||||||
| 13.11.2011, 00:33 | |||||||||||
|
Напишу вдогонку. Завтра может быть прочитаешь.
Адресная арифметика штука в общем то замороченная. И когда указатель начинает сидеть на указателе, и указателем погонять - запутаться в такой логике можно в три счета. Сложность такого проекта резко возрастает, соответственно количество потенциальных ошибок увеличивается. Поэтому, старайся по возможности всегда избегать ситуаций, когда у тебя один указатель указывает на другой. В с++ для этого есть множество решений. Один из самых простых вариантов - это замаскировать указатель так, что бы он воспринимался не как указатель, а как отдельный тип данных. Например "строка" - это строка, а не "массив чаров".
Это класс. Его можно снабдить удобными методами обработки данных. Можно сделать метод, который будит загружать данные в массив букв. Можно сделать метод, который будит все буквы превращать в строчные, или в заглавные. Ну и тп. Если ты ещё чуть чуть пройдёшься в этом направлении, то начнешь понимать, что такое классы, оценишь удобства, которые они предоставляют программистам. Ну а потом, ещё чуть чуть, и ты оценишь всю мощь и великолепие библиотеки STL Ну а там, ещё годик другой пройдёт, и начнёшь говорить всем, что указатели - фуфло, и нафег они не нужны ![]() Удачи.
1
|
|||||||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 13.11.2011, 07:59 | |
Сообщение было отмечено как решение
Решение
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились. Но вот с точки зрения системщика без указателей не обойтись. Я уж не говорю о чистом С, но даже в С++, когда пишется какая-нибудь высокоуровневая обёртка над низкоуровневыми вещами - там указатели сплошь и рядом. Штука в том, что в джаве, например, сама виртуальная машина предоставляет прокладку между языком и средой (ОС) с исчерпывающим функционалом, и там нельзя сделать больше того, что разрешаете ВМ, но в то же время в большинстве случаев достаточно того, что она предоставляет. Потому там хватает высокоуровневых ссылок и сборщика мусора. С++ же язык с настолько широкими возможностями, что он предоставляет как написание программ на очень высоком уровне, так и низкоуровневое программирование, в котором без сырой работы с памятью никак.
Из всего этого вытекает, что нужность или ненужность указателей целиком и полностью зависит от того, на каком уровне пишет программист. И внутри всех языков, которые не предоставляют указатели в чистом виде, всё равно происходит работа с памятью, и всё равно есть указатели, от этого никуда не уйти. Не будь указателей в С - не появилась бы Джава.
4
|
|
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||
| 13.11.2011, 08:39 | ||
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно при передаче указателя передаётся только то количество байт, которое требуется для хранения одного адреса благодаря этому массивы передаются в функции очень быстро, не делается копия всех элементов, чтобы просто его передать чтобы передать массив в функцию, начиная не с того элемента, который стоит у него в начале, а со второго, нужно просто переместить указатель на второй элемент с помощью арифметической операции
1
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
| 13.11.2011, 10:43 | |
|
Диман56, память компьютера - это массив. Каждый элемент массива имеет номер. Начинается с нуля. В Интеле - это массив байтов.
Как ты понимаешь, номер - это целое число. Правильно его называть - адрес. Для хранения номеров-адресов можно объявить переменную. Это и будет переменная - указатель. А храниться в ней будут адреса данных. Как ты понимаешь, переменная - одна, а адреса в ней могут быть разные. Что дает нам доступ к разным переменным в памяти.
0
|
|
|
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
|
|
| 13.11.2011, 11:30 [ТС] | |
|
Bers, спасибо вам огромное!!! Со структурами уже приходилось работать, поэтому второй вариант для меня более приемлемый) Тем более, мне нужно записывать ещё кое-какие данные о файле, поэтому юзать буду структуру.
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||
| 13.11.2011, 15:36 | ||
|
отказ от указателей заставляет использовать вещи посложнее
2
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 14.11.2011, 08:28 | |
|
alex_x_x, прикладной программист просто-напросто будет использовать библиотеки, в которых есть высокоуровневые обёртки для всего, что может ему понадобиться. В этих обёртках могут использоваться указатели (список, умный указатель и т.д.), но программисту об этом думать не приходится.
0
|
|
|
Заблокирован
|
|
| 14.11.2011, 09:10 | |
|
0
|
|
|
Заблокирован
|
|
| 14.11.2011, 09:12 | |
|
silent_1991, в qt есть все обёртки, но их редко кто использует, в cool reader'е или smplayer их например нет. В qt деревья используются и отношения сын-предок для контроля ресурсами и временем жизни, но в итоге это всё равно выливается в интенсивном использовании указателей в коде
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 14.11.2011, 09:17 | |
|
0
|
|
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||
| 14.11.2011, 10:21 | ||
чтобы не терять контроль, нужно писать небольшие процедуры
1
|
||
|
Заблокирован
|
||
| 14.11.2011, 10:26 | ||
|
Вопрос: кто решает "когда можно"? Упоротый алгоритм? Сама сущность? Или сам указатель, который оказался волшебным? "если ты потерял контроль - ты можешь пострадать. Но система этого может даже не заметить"(ц)
0
|
||
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||
| 14.11.2011, 11:31 | ||
например, мы можем сохранить адрес символа в середине строки но у этого символа нет имени, а указатель позволяет обратиться к нему, не проводя вычислений индекса таких указателей можно создать сколько угодно, каждый знает свою позицию и у них удобные имена
0
|
||
|
Заблокирован
|
||
| 14.11.2011, 11:33 | ||
|
или когда хочет - обращение к памяти, которую кто то уже освободил. Крэш.
0
|
||
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||
| 14.11.2011, 11:39 | ||
да, такое может быть если код такой, что непонятно, на что указывает указатель если же всё понятно, то при освобождении можно их обнулить
1
|
||
|
Заблокирован
|
|
| 14.11.2011, 11:43 | |
|
0
|
|
| 14.11.2011, 11:43 | |
|
Помогаю со студенческими работами здесь
60
Для чего нужны и зачем использовать smart-указатели? Что за драйвера такие, для чего они и нужны ли они вообще? С чего начать для понимание PHP
Понимание звуковой волны , да и вообще волн в целом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
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
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|