Difference between revisions of "^"

From Lazarus wiki
Jump to navigationJump to search
(split example / interspersed explanation)
m (unify page target)
 
(9 intermediate revisions by 3 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>
  
In [[ASCII]] the character code decimal <syntaxhighlight lang="pascal" enclose="none">94</syntaxhighlight> (or [[Hexadecimal|hexadecimal]] <syntaxhighlight lang="pascal" enclose="none">5E</syntaxhighlight>) is defined to be  <syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> (circumflex accent).
+
In [[ASCII]] the character code decimal <syntaxhighlight lang="pascal" inline>94</syntaxhighlight> (or [[Hexadecimal|hexadecimal]] <syntaxhighlight lang="pascal" inline>5E</syntaxhighlight>) is defined to be  <syntaxhighlight lang="pascal" inline>^</syntaxhighlight> (circumflex accent).
  
For any data type, a [[Pointer|<syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight> type]] for that data can be declared using the operator <syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> in front of the data type.
+
For any data type, a [[Pointer|<syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight> type]] for that data can be declared using the operator <syntaxhighlight lang="pascal" inline>^</syntaxhighlight> in front of the [[Data type|data type]].
  
 +
<br clear="all"/>
 
<syntaxhighlight lang="pascal" line highlight="6-7,11">
 
<syntaxhighlight lang="pascal" line highlight="6-7,11">
 
program pointerDemo(input, output, stderr);
 
program pointerDemo(input, output, stderr);
Line 28: Line 29:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
A <syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight> can be ''followed'' by appending a <syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> to the identifier.
+
A <syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight> can be followed, ''dereferenced'' by appending a <syntaxhighlight lang="pascal" inline>^</syntaxhighlight> to the [[Identifier|identifier]].
 
Instead of having the memory address in your hands, you will look at the memory content ''at'' that address.
 
Instead of having the memory address in your hands, you will look at the memory content ''at'' that address.
If it is a typed <syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight>, operations and syntax for that type are valid, e.g. [[Becomes|assignment]] in the following example.
+
If it is a typed <syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight>, operations and syntax for that type are valid, e.g. [[Becomes|assignment]] in the following example.
  
<syntaxhighlight lang="pascal" line start="21" highlight="21-22">
+
<syntaxhighlight lang="pascal" line start="21" highlight="1-2">
 
// _de-reference_ the pointer, i.e. follow it
 
// _de-reference_ the pointer, i.e. follow it
 
start^.payload := 7;
 
start^.payload := 7;
Line 38: Line 39:
 
dispose(start);
 
dispose(start);
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
 +
 +
However, attempting to follow a [[Nil|<syntaxhighlight lang="pascal" inline>nil</syntaxhighlight>]] pointer will cause a [[runtime error|runtime error]] (RTE 216 “general protection fault”).
 +
That is the situation the condition <syntaxhighlight lang="pascal" inline>not assigned(start)</syntaxhighlight> in line 15 is supposed to catch.
  
 
== see also ==
 
== see also ==
* [[sPointermath|<syntaxhighlight lang="pascal" enclose="none">{$pointerMath}</syntaxhighlight>]]
+
* [[$pointerMath|<syntaxhighlight lang="pascal" inline>{$pointerMath off}</syntaxhighlight>]] disallows usage of pointers in arithmetic expressions
* [[sTypedaddress|<syntaxhighlight lang="pascal" enclose="none">{$typedAddress}</syntaxhighlight>]] in conjunction wtih the [[@|<syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight>-address-operator]]
+
* [[$typeAaddress|<syntaxhighlight lang="pascal" inline>{$typedAddress on}</syntaxhighlight>]] in conjunction with the [[@|<syntaxhighlight lang="pascal" inline>@</syntaxhighlight>-address-operator]]
 +
* [[sModeswitch|<syntaxhighlight lang="pascal" inline>{$modeSwitch autoDeref-}</syntaxhighlight>]]
  
 
{{Symbols}}
 
{{Symbols}}
 
[[Category:Code]]
 

Latest revision as of 02:19, 18 February 2023

English (en) suomi (fi) русский (ru)

^

In ASCII the character code decimal 94 (or hexadecimal 5E) is defined to be ^ (circumflex accent).

For any data type, a pointer type for that data can be declared using the operator ^ in front of the data type.


 1program pointerDemo(input, output, stderr);
 2
 3type
 4	listItem = record
 5		payload: integer;
 6		// next _points_ _to_ a list item
 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, 'obtaining memory for start failed');
18		halt(1);
19	end;

A pointer can be followed, dereferenced by appending a ^ to the identifier. Instead of having the memory address in your hands, you will look at the memory content at that address. If it is a typed pointer, operations and syntax for that type are valid, e.g. assignment in the following example.

21	// _de-reference_ the pointer, i.e. follow it
22	start^.payload := 7;
23	
24	dispose(start);
25end.

However, attempting to follow a nil pointer will cause a runtime error (RTE 216 “general protection fault”). That is the situation the condition not assigned(start) in line 15 is supposed to catch.

see also


navigation bar: topic: Pascal symbols
single characters

+ (plus)  •  - (minus)  •  * (asterisk)  •  / (slash)
= (equal)  •  > (greater than)  •  < (less than)
. (period)  •  : (colon)  •  ; (semi colon)
^ (hat)  •  @ (at)
$ (dollar sign)  •  & (ampersand)  •  # (hash)
' (single quote)

character pairs

<> (not equal)  •  <= (less than or equal)  •  := (becomes)  •  >= (greater than or equal)

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