Sign in Join
Wiki copytemporary

Pointer/fi

Deutsch · English · Français · Suomi · Русский

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

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.

pascal
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:

pascal
{$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:

pascal
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:

pascal
  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


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.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.