Как сделать смещение указателя типа Pointer?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Какая разница, чего там хранится
Как говорят в Одессе, две большие разницы. Я вообще от Delphi ожидал более сурового подхода при typecast'инге.
Даже самый дурацкий замысел можно воплотить мастерски
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

То есть по твоему, вообще нельзя давать никому возможность конверсии
(незнаком с паскалевским синтаксисом указателей)
char* в int* ?
2B OR NOT(2B) = FF
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Коллеги! Давайте воспринимать это как данность, а то тема перерастает в беспредметный спор.
Т.е. после typecast с указателем можно работать как с integer, и это есть факт!
Я вообще от Delphi ожидал более сурового подхода при typecast'инге.
Надеюсь, расставлю все точки над i следующим разъяснением.

Именно суровость подхода к использованию типов отличает Pascal от некоторых других языков.
Тип pointer (указатель) не допускает арифметических действий, а допускает такую операцию как СМЕЩЕНИЕ УКАЗАТЕЛЯ (глупо ведь было бы искать произведение, или частное указателей :) а посему никакой арифметики). Указатель всегда смещается на +-N указуемых (адресуемых) блоков, и не станет вдруг указывать в середину блока.

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

Надеюсь, что этим тема будет закрыта....
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

.
Правда, что происходит в этом примере как-то не очень мне понятно:

Код:

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...
Ты приводишь указатель типа PChar (т.е. ^Char) к целочисленному типу Integer, а не указателю типа ^Integer. Если бы написал так:

Код: Выделить всё

type PInteger = ^Integer;
Inc(PInteger(P),2); 
то получил бы смещение P на 2*SizeOf(Integer) байтов. Вообще, инкремент указателем отличается от инкремента целого только наличием масштабирующего коэф-та: для указателя типа ^T он равен SizeOf(T).
Тип pointer (указатель) не допускает арифметических действий
Нетипизированный (просто Pointer) - да, а типизированный допускает 1 ар.действие - вычитание
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Поправлю себя: не любой типизированный, а только PChar
Ответить