Как говорят в Одессе, две большие разницы. Я вообще от Delphi ожидал более сурового подхода при typecast'инге.Какая разница, чего там хранится
Как сделать смещение указателя типа Pointer?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Даже самый дурацкий замысел можно воплотить мастерски
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Коллеги! Давайте воспринимать это как данность, а то тема перерастает в беспредметный спор.
Т.е. после typecast с указателем можно работать как с integer, и это есть факт!
Именно суровость подхода к использованию типов отличает Pascal от некоторых других языков.
Тип pointer (указатель) не допускает арифметических действий, а допускает такую операцию как СМЕЩЕНИЕ УКАЗАТЕЛЯ (глупо ведь было бы искать произведение, или частное указателей
а посему никакой арифметики). Указатель всегда смещается на +-N указуемых (адресуемых) блоков, и не станет вдруг указывать в середину блока.
Иногда возникает необходимость обойти строгость Pascal, сделать шаг в сторону плохого стиля ради достижения других целей (например, производительности), и выполнить-таки над некоторым значением операцию, несвойственную для его типа (например, арифметические операции над указателем). Вот в этом случае программист использует и typecast. В нашем случае это арифметическая операция (сложение) над указателем.
Надеюсь, что этим тема будет закрыта....
Т.е. после typecast с указателем можно работать как с integer, и это есть факт!
Надеюсь, расставлю все точки над i следующим разъяснением.Я вообще от Delphi ожидал более сурового подхода при typecast'инге.
Именно суровость подхода к использованию типов отличает Pascal от некоторых других языков.
Тип pointer (указатель) не допускает арифметических действий, а допускает такую операцию как СМЕЩЕНИЕ УКАЗАТЕЛЯ (глупо ведь было бы искать произведение, или частное указателей

Иногда возникает необходимость обойти строгость Pascal, сделать шаг в сторону плохого стиля ради достижения других целей (например, производительности), и выполнить-таки над некоторым значением операцию, несвойственную для его типа (например, арифметические операции над указателем). Вот в этом случае программист использует и typecast. В нашем случае это арифметическая операция (сложение) над указателем.
Надеюсь, что этим тема будет закрыта....
.
то получил бы смещение P на 2*SizeOf(Integer) байтов. Вообще, инкремент указателем отличается от инкремента целого только наличием масштабирующего коэф-та: для указателя типа ^T он равен SizeOf(T).
Ты приводишь указатель типа PChar (т.е. ^Char) к целочисленному типу Integer, а не указателю типа ^Integer. Если бы написал так:Правда, что происходит в этом примере как-то не очень мне понятно:
Код:
var P: Pointer;
begin
P:=PChar('1234567890ABCDEFGHIJKLMN');
Inc(Integer(P),2);
ShowMessage(PChar(P));
end;
Я подразумевал Inc(pInteger(P),2); Здесь всё понятно - указатель сдвинули на 8 байтов, т.к. указатель на Integer имеет размер 4 байта. А что за фигня Integer(P)? Ведь в P хранится отнюдь не Integer...
Код: Выделить всё
type PInteger = ^Integer;
Inc(PInteger(P),2);
Нетипизированный (просто Pointer) - да, а типизированный допускает 1 ар.действие - вычитаниеТип pointer (указатель) не допускает арифметических действий
Поправлю себя: не любой типизированный, а только PChar