Difference between revisions of "Pointer/fi"

From Lazarus wiki
Jump to navigationJump to search
m (Replace deprecated enclose attributes)
 
Line 10: Line 10:
 
Voidaan sanoa sen olevan [[reference|viittaus]] arvoon / muuttujaan tai se "osoittaa" arvoa / muuttujaa.
 
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ä.
 
Kaikkien datatyyppien kohdalla kyseiselle datalle osoitintyyppi voidaan ilmoittaa operaattorilla '''[[^/fi|^]]''' tietotyypin edessä.
[[Compiler directive/fi|Kääntäjän ohjeen]] <syntaxhighlight lang="pascal" enclose="none">{$ TYPEDADDRESS ON}</syntaxhighlight>  asetuksella (on suositeltava käyttää) osoittimet voivat osoittaa vain saman tyyppisten muuttujien tai arvojen osoitteisiin, joihin ne on tarkoitettu osoittamaan.
+
[[Compiler directive/fi|Kääntäjän ohjeen]] <syntaxhighlight lang="pascal" inline>{$ TYPEDADDRESS ON}</syntaxhighlight>  asetuksella (on suositeltava käyttää) osoittimet voivat osoittaa vain saman tyyppisten muuttujien tai arvojen osoitteisiin, joihin ne on tarkoitettu osoittamaan.
 
   
 
   
 
Osoitinmuuttujille annetaan muuttujan osoite '''[[@/fi|@]]''' -operaattorilla, ja niille liitetään arvon / objektin osoite heap-muistiin käyttämällä New aliohjelmaa.  
 
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 <syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight> -operaattorilla.
+
Osoitinmuuttujan arvon lukeminen tai kirjoittaminen onnistuu viittaamalla siihen <syntaxhighlight lang="pascal" inline>^</syntaxhighlight> -operaattorilla.
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 38: Line 38:
  
 
Osoitin- tietotyyppi ('''Pointer''') on yksinkertainen tyyppi, joka voi sisältää minkä tahansa datatyypin muuttujan tai arvon.
 
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 <syntaxhighlight lang="pascal" enclose="none"> {$ TYPEDADDRESS ON} </syntaxhighlight>.  
+
Tämä on päinvastoin kuin kirjoitetut osoittimen muuttujat (esim. PInteger), jotka voivat osoittaa vain tietyn tyyppisiä muuttujia tai arvoja kääntäjänohjeella <syntaxhighlight lang="pascal" inline> {$ TYPEDADDRESS ON} </syntaxhighlight>.  
 
Esimerkiksi:
 
Esimerkiksi:
  

Latest revision as of 09:49, 26 May 2022

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)

Pointer:lla eli osoittimella on kaksi merkitystä Free Pascalissa:

  • Termi tai käsite luokka tyyppien tyypeistä ja muuttujista
  • Yksinkertainen tietotyyppi, joka voi pitää sisällään minkä tahansa tietotyypin osoitteen


Alustus

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 viittaus arvoon / muuttujaan tai se "osoittaa" arvoa / muuttujaa. Kaikkien datatyyppien kohdalla kyseiselle datalle osoitintyyppi voidaan ilmoittaa operaattorilla ^ tietotyypin edessä. 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.

Osoitinmuuttujille annetaan muuttujan osoite @ -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.

program test_pointer_wiki2;
{$TYPEDADDRESS ON}
var 
  a         : Integer = 100;
  b         : Real = 10.5;
  ptrToInt  : PInteger;  // PInteger on  pointer tyyppi joka on määritelty RTL
                         // sillä voidaan osoittaa ainoastaan integer arvoon/muuttujaan
  ptrToInt2 : ^Integer;  // Yleinen muoto määrittämään osoittimen tyyppiä
  //ptrToInt := @b;      // Käännösvirhe  {$TYPEDADDRESS ON} 
  ptrToInt := @a;        
  //Writeln(ptrToInt);   // Käännösvirhe: Error: Can't read or write variables of this type
  Writeln(ptrToInt^);    // Tulostaa arvon: 100
  New(ptrToInt2);        // allocate an un-initialized Integer on the heap
  Writeln(ptrToInt2^);   // Näyttää "satunnaisen" integer arvon eli kokonaisluvun
  ptrToInt2^ := 222;     // Asetetaan arvo 222 heap-muistiin 
  Writeln(ptrToInt2^);   // Tulostaa arvon 222 
end.

Datan tyyppi

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:

{$TYPEDADRESS ON} 
Var 
  a : Integer = 20;
  b : Real = 20.5;
  c : Boolean = true;
  ptr : Pointer;
begin
  ptr := @a; // valid to hold Integer address 
  ptr := @b; // valid to hold Real address
  ptr := @c; // valid to hold Boolean address
end.

Mutta ennen osoitin muuttujaa voidaan käyttää, se täytyy

  1. valita sellainen arvo tai muuttujatyyppi, johon se viittaa
  2. viitataan ^ operaattorilla

Esimerkiksi:

Var 
  a      : Integer = 20;
  ptr    : Pointer;
begin
  ptr := @a;          // valid to hold Integer address 
  //Writeln(ptr);     // Invalid - will not compile
                      // Error: Can't read or write variables of this type
  //Writeln( ptr^);   // Error: Can't read or write variables of this type
                      // Just de-referencing a Pointer variable is not sufficient
  Writeln( PInteger(ptr)^); // After cast, then de-reference: prints 20
end.

Esimääritellyt Pointer tyypit

Runtime-kirjaston System unit on määritelty useita osoittyypejä sisäänrakennetuille muuttujille, mukaan lukien:

  PSmallInt           = ^Smallint;
  PShortInt           = ^Shortint;
  PInteger            = ^Integer;
  PByte               = ^Byte;
  PWord               = ^word;
  PDWord              = ^DWord;
  PLongWord           = ^LongWord;
  PLongint            = ^Longint;
  PCardinal           = ^Cardinal;
  PQWord              = ^QWord;
  PBoolean            = ^Boolean;


Katso myös


Navikointipalkki: datatyypit
Yksinkertaiset datatyypit

boolean byte cardinal char currency double dword extended int8 int16 int32 int64 integer longint real shortint single smallint pointer qword word

Monimutkaiset datatyypit

array class object record set string shortstring