Мдя.
Первые две - это не функции, а указания компилятору, использовать значение по адресу и адрес соответственно. Если прям такая ненависть к ним - вперёд:
Код:
asm
; a^:=b
; скомпилируется в
mov eax, a ; eax := a
mov ebx, b ; ebx :=b
mov [eax], ebx ; eax^ := ebx
;---------------
; a:=@b
; скомпилируется в
mov eax, offset b
mov a, eax
end;
Pointer и String так вообще указания компилятору, что работать с переменной как с таким типом. После компиляции ни строк, ни интов не существует.
Цитата:
ну и как же она преобрзовывает тогда?
|
Да очень просто: никак. Если смотреть вглубь, в подавляющем большинстве случаев преобразование типов просто отключает ошибки, выдаваемые компилятором. Всё сведётся к
Код:
p:=PChar(s);
// получим:
asm
mov eax, s // s - строка
mov p, eax // p - указатель
end;
Только при использовании ООП с перегрузкой преобразований будет вызываться функция преобразования (например, в Delphi 2009 и выше при преобразовании String в AnsiString и наоборот).
Причём тут функции DLL Windows вообще не понял: это функции для реализации элементов работы с операционной системой.
Так что задача полностью лишена смысла. Работать оно будет на любом компьютере архитектуры х86, вообще без операционной системы. Неиспользование ^ и @ - это просто исключение из рассмотрения части машинных команд, которые реализованы везде и всегда. Кстати, даже простой доступ к переменной фактически реализуется через ту же ^, только перед ней стоит константа (адрес, который скрывается за именем переменной), и эту ^ делфи писать не требует, ставит сама.
З.Ы. если можно использовать интежер и стринг - то вообще без проблем:
Код:
var p: pointer;
s: string;
begin
// p уже указывает на строку
integer(s):=integer(p); // поскольку строка и есть указатель на строку
end;
З.З.Ы. Интересно, откуда взялась такая бредовая задача. Если какой-то препод поставил - то передайте ему, чтоб не учил людей всякой дури и быдлокоду. Она только развивает неверное представление о спецсимволах и приведении типов в делфи.