![]() |
|
|
|
|
#1
|
||||
|
||||
|
Вот читал "Библию Делфи" Флёного... Там есть глава об указателях (стр.240).
Цитата:
-------------------------------------------- 1) Код:
var s: sttring; p: pointer;
p := @s;
myProc(string(p^));
procedure myProc(value: string);
begin
showMessage(value);
end;-------------------------------------------- 2) Код:
var s: sttring; p: pointer;
p := @s;
myProc(p);
procedure myProc(value: pointer);
begin
showMessage(string(value^));
end;-------------------------------------------- Спасибо заранее! ![]() Последний раз редактировалось atomAltera, 13.03.2008 в 14:24. |
|
#2
|
|||
|
|||
|
Первый вариант - та самая передача строки от которой ты так стремишся избавиться.
Второй - передача адреса строки. Можно делать это без введения дополнительной переменной: Код:
var s: sttring;
myProc(@s);
procedure myProc(value: pointer);
begin
showMessage(string(value^));
end;Конечно, так можно. Но Этот вариант во-первых вводит нас в заблуждение. В параметрах описан указатель, а мы работем с ним как со строкой. Во-вторых. Пераметр становится параметров по ссылке вместо параметра по значению. Так лучше тогда сразу записать procedure myProc(var value: String); Будет передаваться только указатель строки. Другой вариант использовать PChar. Надеюсь, не запутал тебя своими рассуждениями и внес хлть какую-то ясность. И еще мелким шрифтом. В Delphi String м.б. как ShortString, так и AnsiString (и wide ...). Так вот ShortString передается как указано в книге. Насчет AnsiString не уверен. Нужно посмотреть в справке. В принципе, AnsiString является указателем и компилятор (по-моему мнению) может быть достаточно разумным и разделить два варианта передачи - по ссылке и по значению передавая при этом всегда только указатель. |
|
#3
|
||||
|
||||
|
Спасибо AlexBlack!
|