Difference between revisions of "^/ru"
(Created page with "{{^}} <div style="float:left; margin: 0 25px 20px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">^</div> В...") |
|||
Line 2: | Line 2: | ||
<div style="float:left; margin: 0 25px 20px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">^</div> | <div style="float:left; margin: 0 25px 20px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">^</div> | ||
+ | В кодировках [[ASCII/ru|ASCII]] и [[FPC_Unicode_support/ru|Unicode]] символ с десятичным кодом <syntaxhighlight lang="pascal" enclose="none">94</syntaxhighlight> (или [[Hexadecimal/ru|шестнадцатеричным]] <syntaxhighlight lang="pascal" enclose="none">5E</syntaxhighlight>) определен как символ '''^''' (Circumflex accent). | ||
+ | Для любого типа данных [[Pointer/ru|тип <syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight>]] для этих данных может быть объявлен с помощью оператора '''^''' перед [[Data_type/ru|типом данных]]. | ||
+ | <br clear="all"/> | ||
+ | <syntaxhighlight lang="pascal" line highlight="6-7,11"> | ||
+ | program pointerDemo(input, output, stderr); | ||
+ | type | ||
+ | listItem = record | ||
+ | payload: integer; | ||
+ | // следующий пункт по элементу списка | ||
+ | next: ^listItem; | ||
+ | end; | ||
− | + | var | |
+ | start: ^listItem; | ||
− | + | begin | |
+ | new(start); | ||
+ | if not assigned(start) then | ||
+ | begin | ||
+ | writeLn(stderr, 'не удалось получить память для start'); | ||
+ | halt(1); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Содержимое <syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight> можно отслеживать, ''разыменовывая'' его путем добавления [символа] <syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> к [[Identifier/ru|идентификатору]]. Вместо того, чтобы имеющегося у вас на руках адреса памяти, вы сможете посмотреть на содержимое памяти ''по'' этому адресу. Если это типизированный указатель, операции и синтаксис для этого типа корректны, например, операция [[Becomes/ru|присвоения]] в следующем примере. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line start="21" highlight="1-2"> | ||
+ | // разыменование указателя, т.е. его отслеживание | ||
+ | start^.payload := 7; | ||
+ | |||
+ | dispose(start); | ||
+ | end.</syntaxhighlight> | ||
+ | |||
+ | Однако попытка отследить [[Nil/ru|<syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight>'евой]] указатель приведет к ошибке [[runtime error|времени выполнения]] (RTE 216 “general protection fault”). В такой ситуации условие<syntaxhighlight lang="pascal" enclose="none">not assigned(start)</syntaxhighlight> в строке 15 предназначено для отлова [этой коллизии]. | ||
+ | |||
+ | == См.также == | ||
+ | * [[sPointermath|<syntaxhighlight lang="pascal" enclose="none">{$pointerMath off}</syntaxhighlight>]] запрещает использование указателей в арифметических выражениях | ||
+ | * [[sTypedaddress|<syntaxhighlight lang="pascal" enclose="none">{$typedAddress on}</syntaxhighlight>]] в сочетании с оператором получения адреса [[@/ru|<syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight>]] | ||
+ | * [[sModeswitch|<syntaxhighlight lang="pascal" enclose="none">{$modeSwitch autoDeref-}</syntaxhighlight>]] - автоматическое (тихое) разыменование типизированных указателей | ||
+ | |||
+ | {{Symbols}} |
Revision as of 22:54, 9 May 2019
│
English (en) │
suomi (fi) │
русский (ru) │
В кодировках ASCII и Unicode символ с десятичным кодом 94
(или шестнадцатеричным 5E
) определен как символ ^ (Circumflex accent).
Для любого типа данных тип pointer
для этих данных может быть объявлен с помощью оператора ^ перед типом данных.
1program pointerDemo(input, output, stderr);
2
3type
4 listItem = record
5 payload: integer;
6 // следующий пункт по элементу списка
7 next: ^listItem;
8 end;
9
10var
11 start: ^listItem;
12
13begin
14 new(start);
15 if not assigned(start) then
16 begin
17 writeLn(stderr, 'не удалось получить память для start');
18 halt(1);
19 end;
Содержимое pointer
можно отслеживать, разыменовывая его путем добавления [символа] ^
к идентификатору. Вместо того, чтобы имеющегося у вас на руках адреса памяти, вы сможете посмотреть на содержимое памяти по этому адресу. Если это типизированный указатель, операции и синтаксис для этого типа корректны, например, операция присвоения в следующем примере.
21 // разыменование указателя, т.е. его отслеживание
22 start^.payload := 7;
23
24 dispose(start);
25end.
Однако попытка отследить nil
'евой указатель приведет к ошибке времени выполнения (RTE 216 “general protection fault”). В такой ситуации условиеnot assigned(start)
в строке 15 предназначено для отлова [этой коллизии].
См.также
{$pointerMath off}
запрещает использование указателей в арифметических выражениях{$typedAddress on}
в сочетании с оператором получения адреса@
{$modeSwitch autoDeref-}
- автоматическое (тихое) разыменование типизированных указателей
single characters |
|
character pairs |
|