Для чего нужны "указатели"?

Nachinayushiy.
Дата: 15.05.2011 16:48:05
Из справочной литературы:
Указатели также являются переменными. Но они содержат не символы или числа, а адреса памяти. Если вы рассматриваете память как огромный массив чисел, то указатель будет одним элементом массива, в котором хранится индекс другого элемента массива.
var Q: ^Integer;
Q типа ^Integer "указатель на Integer". Это означает, что Q - это не Integer, но вместо этого указывает на память, которая может быть использована как Integer. Если вы присвоите адрес J в Q, используя оператор взятия адреса @ или эквивалентную функциональность псевдофункции Addr: Q := @J; // Q := Addr(J);
то тогда Q будет указывать на место по адресу, занимаемое J. Но поскольку Q является типизированным указателем, то компилятор будет трактовать память, на которую указывает Q, как число типа Integer.

Помогите понять смысл этого! Почему нельзя использовать просто Q := J ??? Т.е. объясните пожалуйста, на сколько это возможно понятие "указателя", не с точки зрения - что это такое (это хорошо описано в разныйх статьях), а для чего это? Когда нужно использовать указатели?
fd00ch
Дата: 15.05.2011 17:14:27
Указатель - это, по сути, ссылка.

Аналог найти несложно даже на этом форуме. Вот ты привел цитату из умной книжки :) Вместо того, чтобы копировать сюда кучу текста (тратить свое время, засорять тему лишним текстом) можно было просто поставить ссылку на этот текст, эта ссылка указывала бы на нахождение оригинальных данных. Еще один пример - на форуме в тех темах, где куча ответов, можно увидеть переключатель страниц: с текущей страницы ты можешь перейти на предыдущую, следущую, а можешь вообще вернуться в начало темы, в начало форума, на главную страницу.

Отсюда видны 2 наиболее частых (ну, по крайней мере, у меня) использования указателей:
1. хранение ссылки на какую-то кучу данных, которую нет смысла/времени повторно копировать, но к которой нужно уметь обратиться для чтения/записи данных;
2. создание связанных списков, когда от одного элемента можно перейти к другому и (иногда) - обратно

Есть еще некоторые ситуации, где трюки с указателями помогают создать более быстрый, простой код.
_Vasilisk_
Дата: 15.05.2011 17:24:08
Указатели позволяют работать с памятью выделенной в другом месте.
procedure Test
const
  CCount = 100;
var
  LVal: array[0..CCount - 1] of Integer;
  LPtr: PInteger;
  Li: Integer;
begin
  LPtr := @LVal[0];  // Получаем указатель на первый элемент массива
  ShowMessageFmt('Size LVal = %d', [SizeOf(LVal)]);
  ShowMessageFmt('Size LPtr = %d', [SizeOf(LPtr)]);
  for Li := 0 to CCount - 1 do begin
    LPtr^ := LIdx;  // Присваиваем значение текущему элементу
    LPtr := Pointer(Integer(LPtr) + SizeOf(LPtr^));  // Сместили на следующий элемент
  end;
end;

И еще, с точки зрения программы следующие две процедуры работают идентично
procedure Test1(var AVal: Integer);
begin
  AVal := AVal + 10;
end;

procedure Test1(AVal: PInteger);
begin
  AVal^ := AVal^ + 10;
end;
Dimitry Sibiryakov
Дата: 15.05.2011 18:22:23

Nachinayushiy.
Когда нужно использовать указатели?

Если ты этого не знаешь, значит указатели тебе не нужны. Они пережиток прошлого и в
некоторых ЯП от них уже отказались.

Posted via ActualForum NNTP Server 1.4

S.G.
Дата: 15.05.2011 18:34:31
Через указатели также реализуются структуры данных, немного более сложные, чем массивы: стеки, деревья, связанные списки.
Nachinayushiy.
Дата: 15.05.2011 18:42:43
fd00ch
Указатель - это, по сути, ссылка. ...
Ну вот поэтому я и привёл цитату из литературы ))) Что такое "указатель" - понятно! (хорошо объяснено) Зачем нужны указатели?
fd00ch
Отсюда видны 2 наиболее частых использования указателей:
1. хранение ссылки на какую-то кучу данных, которую нет смысла/времени повторно копировать, но к которой нужно уметь обратиться для чтения/записи данных;
Буфер обмена? Что-то скопировали в другой программе и теперь обращаемся к памяти?
fd00ch
2. создание связанных списков, когда от одного элемента можно перейти к другому и (иногда) - обратно
Как-то абстрактно... Сумбурно представляю себе что-то вроде строкового массива, каждая строка которого ссылается на другой массив - что-то вроде "соединения таблиц" в БД. Это Вы имели ввиду?
_Vasilisk_
Указатели позволяют работать с памятью выделенной в другом месте.
Повторюсь - т.е. где-то скопировали в буфер обмена, а в своей программе это считываем?
_Vasilisk_
И еще, с точки зрения программы следующие две процедуры работают идентично
procedure Test1(AVal: PInteger);
begin
  AVal^ := AVal^ + 10;
end;
Там, кажется, ещё заморочки с
type  PInteger = ^Integer;
procedure Test1(AVal: PInteger);
Идентично, но сколько строк вокруг как снежный ком нарастает...
Dimitry Sibiryakov
Если ты этого не знаешь, значит указатели тебе не нужны. Они пережиток прошлого и в
некоторых ЯП от них уже отказались.
Вопрос возник в связи с перекомпиляцией программ в юникодовой delphi. Процедуры были как процедуры... А при переделке смотришь чужие примеры - уже используются указатели.Если без них - тогда только явное использование AnsiString и т.п., и согласие на возможные проблемы.
S.G.
Через указатели также реализуются структуры данных, немного более сложные, чем массивы: стеки, деревья, связанные списки.
Вот это уже понятный пример! - То что я как раз написал в ответ на п.2 fd00ch-у.
Гаджимурадов Рустам
Дата: 15.05.2011 18:47:26

Это провокация или мне показалось?

P.S. Весь топик не читал.

Posted via ActualForum NNTP Server 1.4

fd00ch
Дата: 15.05.2011 18:53:40
Nachinayushiy.
Зачем нужны указатели?
Nachinayushiy.
Как-то абстрактно...
Я же на примере форума объяснил оба варианта (на прикладном уровне), потом написал то же самое (на теоретическом)

Nachinayushiy.
S.G.
Через указатели также реализуются структуры данных, немного более сложные, чем массивы: стеки, деревья, связанные списки.
Вот это уже понятный пример!
Т.е. ты в курсе что такое "стеки, деревья, связанные списки" и как они реализованы, но до сих пор не понимаешь зачем нужны указатели? :-) После этого приходит на ум или совет от Dimitry Sibiryakov, или даже от Гаджимурадов Рустам...
Nachinayushiy.
Дата: 15.05.2011 19:05:49
[quot fd00ch]
Nachinayushiy.
на примере форума объяснил оба варианта (на прикладном уровне), потом написал то же самое (на теоретическом)совет от Dimitry Sibiryakov, или даже от Гаджимурадов Рустам...
С базами данных работал, что такое "один-ко-многим" понимаю, "связанные таблицы" - естественно! Вы объяснили на пальцах - "что такое указатель". А зачем?- я бы не переспрашивал, если бы стало понятно. Я написал то, как я понял Ваши слова: 10654866. Вы не сказали ни "да", ни "нет".
Почему до сих пор не знаю что такое указатели? -
Nachinayushiy.
Вопрос возник в связи с перекомпиляцией программ в юникодовой delphi. Процедуры были как процедуры... А при переделке смотришь чужие примеры - уже используются указатели.Если без них - тогда только явное использование AnsiString и т.п., и согласие на возможные проблемы.
Так что да - это мне никогда небыло нужно! до сих пор.

Для чего нужны "указатели"?
- менять значение нескольких переменных одновременно?
- работать с буфером обмена?
- работа с многомерными массивами фактически и есть работа с указателями?
- ....
fd00ch
Дата: 15.05.2011 20:06:35
Nachinayushiy.
С базами данных работал, что такое "один-ко-многим" понимаю, "связанные таблицы" - естественно!
Ну и как это пересекается с "стеки, деревья, связанные списки"? Словом "связанный" что ли? :-)
Потом, недостаточно понимать что это в принципе - надо знать как их организовать с "нуля". Прочитай что это и как это запрограммировать - возможно, немного поможет понять зачем нужны указатели.

Nachinayushiy.
Для чего нужны "указатели"?
- менять значение нескольких переменных одновременно?
- работать с буфером обмена?
- работа с многомерными массивами фактически и есть работа с указателями?
- ....
В общем случае - ни для чего из перечисленного, не для того они были придуманы :-)

ЗЫ. Будь проще на этом форуме, лучше на "ты"