Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Использование указателей на целое

Дочь подходит к отцу-программисту, сидящему за компьютером:
- Папа... я беременна...
Отец, не отрывая глаз от монитора:
- А ты уверена, что от тебя?

Сначала вы должны создать тип:


Type
Pinteger : ^Integer;

Var
MyPtr : Pinteger;

Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной.

Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока.

Например,


NEW(MyPtr) = GetMem(MyPtr, Sizeof(MyPtr))

Возможно, вы захотите подсчитать количество целочесленных переменных. В этом случае ознакомьтесь с возможностями TList. Пока лучше используйте линейный массив (или указатель на первый элемент, чтобы вычислить их количество, достаточно разделить количество занимаемой массивом памяти на количество элементов).

Для полноты, это должно быть:


NEW(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr^));

SizeOf(MyPtr) всегда будет равен 4 байта, как 16-битный указатель.

Если я правильно разобрался в том, что вы хотите (динамический массив целых, количество элеметнов которого может быть известно только во время выполнения приложения), вы можете сделать так:


Type
  pIntArr = ^IntArr;
  IntArr  = Array[1..1000] of Integer;
Var
  MyPtr : pIntArr;
Begin
  GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!)
  { MyPtr[2]:=1; }
  // <<<< Заполняем массив >>>>
  MyPtr[2]^:=1;
  FreeMem(MyPtr,10);
End;

Технология похожа на ту, которуя Delphi использует при работе с pchar. Синтаксис очень похож:


type
  intarray = array[0..20000] of integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  xptr:  ^IntArray;
begin
  GetMem(xptr, 10);
  xptr^[idx] := 1;  { где idx от 0 до 4, поскольку мы
                      имеем 10 байте = 5 целых }
  FreeMem(xptr, 10);
end;

Обратите внимание на то, в вам в действительности нет необходимости распределять массив для 20,000 элементов, но проверка диапазона Delphi не будет работать, если диапазон равен 20,000. (Предостережение будущим пользователям!)

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay