Pointer/fi

From Free Pascal wiki
Jump to: navigation, search

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 extended int64 integer longint pointer real shortint smallint word

Monimutkaiset datatyypit

array class object record set string shortstring