![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Teleport |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
вот читаю об указателях. Прочитал кое что и понял, как их объявлять - эти указатели. Также понял, что
"Используя указатели мы можем обращаться к любой ячейке в памяти и использовать размещённые там данные." Вопрос1: идентичны ли строки:
и
или же нужно использовать вот так:
Вопрос 2: Зачем нужны указатели - вот не пойму никак. Везде описано - как объявить и как с ними операции проводить. Но не могу найти примера - где без указателей не обойтись или с указателями проще решить задачу чем без них. Прошу привести простые примеры с пояснением. |
||||||
|
|||||||
| Rrader |
|
||||||||||||||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Указатели - вещь незаменимая во многих случаях. Позволю себе привести некоторые:
1) Адресная арифметика - позволяет увеличивать или уменьшать значение указателя на размер его типа, то есть позволяет "путешествовать" по памяти. Конечно, можно и не на размер типа увеличивать адрес в указателе, если указатель приводить к нужному типу при арифметических операциях. Классический пример - вычисление длины строки PAnsiChar. Строка оканчивается символом #0, а все символы расположены линейно по порядку - для подсчета длины можно просто инкрементировать указатель на текущий символ.
2) Возможность произвольного доступа к данным, при этом код получается более наглядным. Удобно при работе с API. Допустим, в функцию передается целая структура, но параметр числовой. Как обработать? Тут помогают указатели. Рассмотрим жутко напаренный пример, но подобные вещи в API сплошь и рядом: обработка разнообразных сообщений, hook-процедур и т.д.)
В своей практике я очень часто использую адресную арифметику вместе с произвольным доступом, например, для путешествия по элементам таблиц Windows 3) Еще одна интересная особенность - с указателями часто можно выиграть в быстродействии. Рассмотрим две функции, обе принимают большой статический массив и что-нибудь с ним делают.
Замерим их примерное быстродействие через GetThreadTimes.
У меня разница в быстродействии примерно 40%, то есть функция, принимающая указатель, работает быстрее. Подумай сам, почему так происходит 4) Добавлю еще один классический пример, где без указателей не обойтись Допустим, нужно создать односвязный список через массив записей (10 элементов). В каждой записи ровно два поля - указатель на следующий элемент списка и данные (пусть у нас это целое число). Односвязный список подразумевает, что мы можем проходить его только в одном направлении. Следующее объявление некорректно:
Решить проблему можно с помощью указателей. Дефинировать (объявлять) их можно до дефиниции самого типа. Вот рабочий вариант:
С таким списком нужно работать, самостоятельно выделяя и освобожая память. Это сообщение отредактировал(а) Rrader - 17.12.2008, 05:17 |
||||||||||||||
|
|||||||||||||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
более менее понял только первые 2 примера..
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
так же не обойтись без указателей при создании графов. Закономерные структуры вообще хранятся в динамических структурах, а без указателей здесь не обойтись.
и, кстати,
|
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
А что если напишу без type? то не будет работать?
-------------------- ![]() |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
я про знак "="
|
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
точно, знак равно
|
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 9 Всего: 95 |
попробуй без указателя сменить главную форму приложения Delphi в рантайме
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
ama_kid, грязный хак. А если в следующей версии для чтения этого свойства будет использоваться функция, а не поле? (имеют право, это внутренние дела класса)
-------------------- Обижено школьников: 8 |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 9 Всего: 95 |
не спорю, но суть вопроса-ответа не в этом
Добавлено через 2 минуты и 24 секунды я лишь привел пример, прямо иллюстрирующий полезность указателей в ответ на изначальный вопрос... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 8 Всего: 51 |
Без указателей вообще никак. Любая переменная объектного типа по сути является указателем.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |