Преобразование строк

Допустим, что у тебя есть строка типа String и ты хочешь её преобразовать в PChar. Для такого преобразования нужно написать требуемый тебе тип и в скобках указать свою строковую переменную: NewStr:=PChar(MyStr);. В этом примере переменная MuStr имеет тип String, а мы приводим её в вид PChar. Вот так происходит преобразования совместимых типов.

Вот такое преобразование строк мы будем делать очень часто при вызове WinAPI функций, потому что там большинство строк имеет именно PChar тип.

Сейчас я не могу придумать какой-нибудь ещё пример преобразования, но уже в этой главе ты воспользуешься такой возможностью в одном из моих примеров.

 

10.7 Указатели

 

ора познакомиться с указателями. Это очень удобная и сильная вещь, которой мы так же будем часто пользоваться. Уже в этой главе мы будем работать с указателями на структуры, которые расположим в динамической

памяти.

Но прежде чем что-то объяснять, я хочу показать тебе, зачем нужны указатели. Давай вспомним про процедуры, и я расскажу тебе, как происходит их вызов. Допустим, у тебя есть процедура с именем MyProc у которой есть два параметра: число и строка. Как происходит вызов такой процедуры, и как ей передаются эти параметры? Очень просто. Сначала параметры поднимаются в стек (напомню, что стек – это область памяти для хранения твоих временных/локальных переменных). Сначала заносится первый параметр, затем второй и после этого вызывается процедура. Прежде чем процедура начнёт своё выполнение, она достаёт эти параметры из стека в обратном порядке.

Теперь вспомним о наших параметрах. Первый – это число, которое будет занимать два байта. Когда мы подымем его в стек, то оно займёт там свои положенные два байта. Второй параметр – строка. Каждый символ строки – это отдельный байт. Допустим, что наша строка состоит из 10 символов, значит для передачи такой строки в процедуру, в стеке понадобиться 10 байт плюс один байт для указания конца строки или размерности (это зависит от типа строки). Всего для передачи в процедуру нам понадобиться в стеке как минимум 12 байт. Это не так уж и много, поэтому такое можно себе позволить.

А теперь представь, что строка, которую надо передать в процедуру, состоит из 1000 символов. Вот тут нам понадобиться в стеке уже около килобайта. При нынешних размерах памяти на это уже никто не обращает внимания, но народ забывает про то, что такая строка сначала копируется в память стека, а потом достаётся оттудова. Такое копирование большого размера памяти отнимает достаточно много времени и твоя программа тратит лишнее время на бессмысленное копирование большой строки.

Выход из сложившейся ситуации достаточно прост – можно не передавать строку, а только передать указатель на область памяти, где находиться эта строка. Любой указатель занимает всего четыре байта, а это уже существенная экономия. Мы просто передаём два байта указывающих на длинную строку, а процедура достаёт эти два байта и уже знает, где можно взять строку, когда она понадобиться.

Указатель в Delphi объявляется как Pointer. Например, давай объявим переменную p типа указатель: