Difference between revisions of "^/ru"

From Free Pascal wiki
Jump to navigationJump to search
(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> В...")
 
m (unify page target)
 
(2 intermediate revisions by 2 users not shown)
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" inline>94</syntaxhighlight> (или [[Hexadecimal/ru|шестнадцатеричным]] <syntaxhighlight lang="pascal" inline>5E</syntaxhighlight>) определен как символ '''^''' (Circumflex accent).
  
 +
Для любого типа данных [[Pointer/ru|тип <syntaxhighlight lang="pascal" inline>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;
  
В кодировках [[ASCII/ru|ASCII]] и [[FPC_Unicode_support/ru|Unicode]] символ с десятичным кодом 94 (или [[Hexadecimal/ru|шестнадцатеричным]] 5E) определен как символ ^ (Circumflex accent).
+
var
 +
start: ^listItem;
  
Для создания [[Pointer/ru|указателя]] на любой тип данных необходимо объявить его с оператором '''^''' перед этим типом.
+
begin
 +
new(start);
 +
if not assigned(start) then
 +
begin
 +
writeLn(stderr, 'не удалось получить память для start');
 +
halt(1);
 +
end;
 +
</syntaxhighlight>
 +
 
 +
Содержимое <syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight> можно отслеживать, ''разыменовывая'' его путем добавления [символа] <syntaxhighlight lang="pascal" inline>^</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" inline>nil</syntaxhighlight>'евой]] указатель приведет к ошибке [[runtime error|времени выполнения]] (RTE 216 “general protection fault”). В такой ситуации условие<syntaxhighlight lang="pascal" inline>not assigned(start)</syntaxhighlight> в строке 15 предназначено для отлова [этой коллизии].
 +
 
 +
== См.также ==
 +
* [[$pointerMath/ru|<syntaxhighlight lang="pascal" inline>{$pointerMath off}</syntaxhighlight>]] запрещает использование указателей в арифметических выражениях
 +
* [[$typedAddress/ru|<syntaxhighlight lang="pascal" inline>{$typedAddress on}</syntaxhighlight>]] в сочетании с оператором получения адреса [[@/ru|<syntaxhighlight lang="pascal" inline>@</syntaxhighlight>]]
 +
* [[$modeSwitch/ru|<syntaxhighlight lang="pascal" inline>{$modeSwitch autoDeref-}</syntaxhighlight>]] - автоматическое (тихое) разыменование типизированных указателей
 +
 
 +
{{Symbols}}

Latest revision as of 02:19, 18 February 2023

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-} - автоматическое (тихое) разыменование типизированных указателей


navigation bar: topic: Pascal symbols
single characters

+ (плюс)  •  - (минус)  •  * (звездочка)  •  / (слеш)
= (равно)  •  > (больше чем)  •  < (меньше чем)
. (точка)  •  : (двоеточие)  •  ; (точка с запятой)
^ (hat)  •  @ (at)
$ (dollar sign)  •  & (ampersand)  •  # (hash)
' (single quote)

character pairs

<> (не равно)  •  <= (less than or equal)  •  := (присвоить)  •  >= (greater than or equal)

 •  >< (symmetric difference)  •  // (double slash)