Страница 2 из 2

Добавлено: 12 ноя 2004, 14:19
AiK
Какая разница, чего там хранится
Как говорят в Одессе, две большие разницы. Я вообще от Delphi ожидал более сурового подхода при typecast'инге.

Добавлено: 12 ноя 2004, 15:48
Absurd
То есть по твоему, вообще нельзя давать никому возможность конверсии
(незнаком с паскалевским синтаксисом указателей)
char* в int* ?

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

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

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

Надеюсь, что этим тема будет закрыта....

Добавлено: 15 ноя 2004, 12:46
Eugie
.
Правда, что происходит в этом примере как-то не очень мне понятно:

Код:

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 ар.действие - вычитание

Добавлено: 15 ноя 2004, 17:09
Eugie
Поправлю себя: не любой типизированный, а только PChar