Sign in Join
Wiki copytemporary

Pointer/fi: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Pointer/fi

OldNewLine
1+**Pointer**:lla eli osoittimella on kaksi merkitystä [[FPC/fi|Free Pascalissa]]:
2+
3+- Termi tai käsite luokka tyyppien tyypeistä ja [[Variable/fi|muuttujista]]
4+- Yksinkertainen tietotyyppi, joka voi pitää sisällään minkä tahansa tietotyypin osoitteen
5+
6+## Alustus
7+
8+**Pointer** on osoitinmuuttuja, joka sisältää muuttujan paikallisen tai globaalin (kaikkialle näkyvän) muistiosoitteen tai muistin osoitteen, jonka arvo tai monimutkainen objekti on luotu ja tallennettu ohjelman heap muistiin. Voidaan sanoa sen olevan [[reference|viittaus]] arvoon / muuttujaan tai se "osoittaa" arvoa / muuttujaa. Kaikkien datatyyppien kohdalla kyseiselle datalle osoitintyyppi voidaan ilmoittaa operaattorilla **[[^/fi|^]]** tietotyypin edessä. [[Compiler directive/fi|Kääntäjän ohjeen]] `{$ TYPEDADDRESS ON}` asetuksella (on suositeltava käyttää) osoittimet voivat osoittaa vain saman tyyppisten muuttujien tai arvojen osoitteisiin, joihin ne on tarkoitettu osoittamaan.
9+
10+Osoitinmuuttujille annetaan muuttujan osoite **[[@/fi|@]]** -operaattorilla, ja niille liitetään arvon / objektin osoite heap-muistiin käyttämällä New aliohjelmaa. Osoitinmuuttujan arvon lukeminen tai kirjoittaminen onnistuu viittaamalla siihen `^` -operaattorilla.
11+
12+``` pascal
13+program test_pointer_wiki2;
14+{$TYPEDADDRESS ON}
15+var
16+ a : Integer = 100;
17+ b : Real = 10.5;
18+ ptrToInt : PInteger; // PInteger on pointer tyyppi joka on määritelty RTL
19+ // sillä voidaan osoittaa ainoastaan integer arvoon/muuttujaan
20+ ptrToInt2 : ^Integer; // Yleinen muoto määrittämään osoittimen tyyppiä
21+ //ptrToInt := @b; // Käännösvirhe {$TYPEDADDRESS ON}
22+ ptrToInt := @a;
23+ //Writeln(ptrToInt); // Käännösvirhe: Error: Can't read or write variables of this type
24+ Writeln(ptrToInt^); // Tulostaa arvon: 100
25+ New(ptrToInt2); // allocate an un-initialized Integer on the heap
26+ Writeln(ptrToInt2^); // Näyttää "satunnaisen" integer arvon eli kokonaisluvun
27+ ptrToInt2^ := 222; // Asetetaan arvo 222 heap-muistiin
28+ Writeln(ptrToInt2^); // Tulostaa arvon 222
29+end.
30+```
31+
32+## Datan tyyppi
33+
34+Osoitin- tietotyyppi (**Pointer**) on yksinkertainen tyyppi, joka voi sisältää minkä tahansa datatyypin muuttujan tai arvon. Tämä on päinvastoin kuin kirjoitetut osoittimen muuttujat (esim. PInteger), jotka voivat osoittaa vain tietyn tyyppisiä muuttujia tai arvoja kääntäjänohjeella `{$ TYPEDADDRESS ON}`. Esimerkiksi:
35+
36+``` pascal
37+{$TYPEDADRESS ON}
38+Var
39+ a : Integer = 20;
40+ b : Real = 20.5;
41+ c : Boolean = true;
42+ ptr : Pointer;
43+begin
44+ ptr := @a; // valid to hold Integer address
45+ ptr := @b; // valid to hold Real address
46+ ptr := @c; // valid to hold Boolean address
47+end.
48+```
49+
50+Mutta ennen osoitin muuttujaa voidaan käyttää, se täytyy
51+
52+1. valita sellainen arvo tai muuttujatyyppi, johon se viittaa
53+2. viitataan **^** operaattorilla
54+
55+Esimerkiksi:
56+
57+``` pascal
58+Var
59+ a : Integer = 20;
60+ ptr : Pointer;
61+begin
62+ ptr := @a; // valid to hold Integer address
63+ //Writeln(ptr); // Invalid - will not compile
64+ // Error: Can't read or write variables of this type
65+ //Writeln( ptr^); // Error: Can't read or write variables of this type
66+ // Just de-referencing a Pointer variable is not sufficient
67+ Writeln( PInteger(ptr)^); // After cast, then de-reference: prints 20
68+end.
69+```
70+
71+## Esimääritellyt Pointer tyypit
72+
73+[[RTL|Runtime]]-kirjaston [[System unit]] on määritelty useita osoittyypejä sisäänrakennetuille muuttujille, mukaan lukien:
74+
75+``` pascal
76+ PSmallInt = ^Smallint;
77+ PShortInt = ^Shortint;
78+ PInteger = ^Integer;
79+ PByte = ^Byte;
80+ PWord = ^word;
81+ PDWord = ^DWord;
82+ PLongWord = ^LongWord;
83+ PLongint = ^Longint;
84+ PCardinal = ^Cardinal;
85+ PQWord = ^QWord;
86+ PBoolean = ^Boolean;
87+```
88+
89+## Katso myös
90+
91+- Usage of [[Pointers]]
92+- <http://www.freepascal.org/docs-html/ref/refse15.html>
93+
94+---
95+*From the Free Pascal wiki, page "Pointer/fi", as it stood on 2022-05-26 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history