Недавно добавленные исходники

•  Animation Loaders  746

•  DeLiKaTeS Tetris (Тетрис)  5 739

•  TDictionary Custom Sort  7 692

•  Fast Watermark Sources  7 374

•  3D Designer  10 592

•  Sik Screen Capture  7 901

•  Patch Maker  8 131

•  Айболит (remote control)  8 182

•  ListBox Drag & Drop  6 981

•  Доска для игры Реверси  100 270

•  Графические эффекты  8 256

•  Рисование по маске  7 637

•  Перетаскивание изображений  6 239

•  Canvas Drawing  6 610

•  Рисование Луны  6 534

•  Поворот изображения  5 702

•  Рисование стержней  4 633

•  Paint on Shape  3 336

•  Генератор кроссвордов  4 311

•  Головоломка Paletto  3 459

•  Теорема Монжа об окружностях  4 283

•  Пазл Numbrix  2 771

•  Заборы и коммивояжеры  3 685

•  Игра HIP  2 488

•  Игра Go (Го)  2 478

•  Симулятор лифта  2 873

•  Программа укладки плитки  2 312

•  Генератор лабиринта  3 036

•  Проверка числового ввода  2 538

•  HEX View  2 948

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Арифметика указателей



Вы можете рассказать об арифметике указателей в Delphi?

Сначала короткое объяснение арифметике указателя. Когда вы имеете дело с динамическими страницами памяти, то все, что вы имеете - это указатели на начала блоков памяти. Вы хотите просмотреть всю строку памяти, чтобы понять какие функции необходимы для работы с данными, хранящимися в памяти? Это возможно путем изменения места в памяти, на которое указывает указатель. Это называется арифметикой указателя.

Основополагающая идея при занятиях арифметикой с указателем - указатель должен быть увеличен на значение корректного приращения. (Корректное приращение определяется размером объекта, на который показывает указатель. Например, char = 1 байт; integer = 2 байта; double = 8 байт и т.д.) Функции Inc() и Dec() изменяют значение корректного приращения. (Компилятор знает правильный размер объекта.)

Если вы осуществляете динамическое распределение памяти, то делать это можно примерно так:


uses WinCRT;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyArray: array[0..30] of char;
  b: ^char;
  i: integer;
begin
  StrCopy(MyArray, 'Дельфи - рулез фарева!');
    {помещаем что-то в память для организации указателя}
  b := @MyArray; { назначаем указатель на текущую позицию памяти }
  for i := StrLen(MyArray) downto 0 do
  begin
    write(b^); { пишем символ в текущую позицию указателя. }
    inc(b); { перемещаем указатель на следующий байт памяти }
  end;
end;

Нижеследующий код демонстрирует работу функций Inc() и Dec(), увеличивающих или уменьшающих указатель на размер соответствующего типа:


var
  P1, P2: ^LongInt;
  L: LongInt;
begin
  P1 := @L; { назначаем оба указателя на одно и то же место }
  P2 := @L;
  Inc(P2); { Увеличиваем один }

  { Здесь мы получаем разницу между смещениями двух
  указателей. Поскольку первоначально они указывали на одно
  и то же место памяти, то результатом данного вызова
  будет разница между двумя указателями после вызова Inc(). }

  L := Ofs(P2^) - Ofs(P1^); { L = 4; т.е. sizeof(longInt) }
end;

Вы можете изменить тип объекта, на который указывает P1 и P2, на какой-то другой и убедиться, что (SizeOf(P1^)) всегда возвращает величину корректного приращения (проще сказать, что это размер объекта - В.О.).








Copyright © 2004-2026 "Delphi Sources" by «SiteAnalyzer». Delphi World FAQ

Группа ВКонтакте