В pascal есть функция CompareMem , почемуто нет функции копирования одной области памяти в другу. Как можно скопировать n байт из одной области памяти в другую?
Можно и так, только не учитывается то, что куски памяти могут накладываться, а Move в таком случае правильно копирует
procedure CopyMem(const Source: Pointer; Dest: Pointer; Size: Integer);
var
I: Integer;
begin
for I := 0 to Size do
PChar(Dest)[I] = PChar(Source)[I];
end;
Да разницы в общем-то и нет, но const Source удобнее
procedure y(const source:pointer);
procedure x(const source);
var
a: //если тут массив, запись или что-нибудь еще кроме указателя
begin
y(a); //то тут надо будет писать так y(@a)
x(a);
end.
>С точки зрения семантики языка мне не понятно, почему тип не указан.
Потому, что язык допускает при создании процедур и функций описывать нетипизированные параметры. При вызове такой подпрограммы ей вместо данных параметров можно передавать переменные любого типа (они всё равно будут переданы по ссылке, а не по значению). Именно этим такой синтаксис и лучше будет, можно будет при вызове писать не CopyMem(@Source, @Dest, Size), а сразу CopyMem(Source, Dest, Size), что читаемее, на мой взгляд. Ну и выглядит красивее :)
Правда, внутри подпрограммы всё равно придётся использовать либо приведение типа (как в примере выше, с PChar(Source)), либо объявление вспомогательных переменных с директивой absolute:
var S: array [0..High(Cardinal)] of byte absolute Source; D: array [0..High(Cardinal)] of byte absolute Dest;
for i := 0 to Size - 1 do D[i]:= S[i];
Но в любом случае, лучше использовать Move. Оно банально быстрее должно быть.