Я могу ответить только на часть delphi (мой C немного ржавый сейчас, а ссылки на указатели / массивы C вызывают у меня головную боль, когда я am актуален и обновлен)
Строки являются указателями и ВСЕГДА передаются по ссылке, поэтому при передаче -EVER данные не копируются.
Однако в случае
procedure test(s:String);
Указатель S передается, иесли вы изменяете S в тесте процедуры, генерируется уникальная строка и новый указатель присваивается S, но не передается исходная переменная.Вы можете передавать строковые литералы и строковые выражения / изменяться на лету (s + 'bla bla bla')
procedure test(var s: String);
адрес указателя S передан,
указатель S передани если вы измените S внутри процедуры теста, генерируется уникальная строка (если требуется), и новый указатель присваивается S, и исходная переданная переменная.Вы НИКОГДА не можете передавать строковые литералы и строковые выражения / изменяться на лету (s + 'bla bla bla')
procedure test(const s: string);
Указатель S пропущен, и вы не можете изменять S в течение периода проверки процедуры.(хорошо, вы можете облажаться и обмануть компилятор, но это уродливо и сложно, и обычно требует много приведения типов)