Forstå og bruke pekere i Delphi
elenabs/Getty Images
Selv om tips ikke er like viktige Delphi som de er i C eller C++ , de er et så 'grunnleggende' verktøy som nesten alt som har med å gjøre programmering må håndtere pekere på en eller annen måte.
Det er av den grunn at du kan lese om hvordan en streng eller et objekt egentlig bare er en peker, eller at en hendelsesbehandler som OnClick faktisk er en peker til en prosedyre.
Peker til datatype
Enkelt sagt er en peker en variabel som holder adressen til alt i minnet.
For å konkretisere denne definisjonen, husk at alt som brukes av en applikasjon er lagret et sted i datamaskinens minne. Fordi en peker holder adressen til en annen variabel, sies det å peke til den variabelen.
Mesteparten av tiden peker pekere i Delphi til en bestemt type:
|_+_|De syntaks for å erklære en pekerdatatype bruker a caret (^) . I koden ovenfor er iValue en heltallstypevariabel og pIntValue er en heltallstypepeker. Siden en peker ikke er noe mer enn en adresse i minnet, må vi tilordne den plasseringen (adressen) til verdien som er lagret i heltallsvariabelen iValue.
De @ operatør returnerer adressen til en variabel (eller en funksjon eller prosedyre som vil bli sett nedenfor). Tilsvarer @-operatøren er Addr funksjon . Merk at verdien til pIntValue ikke er 2001.
I denne eksempelkoden er pIntValue en skrevet heltallspeker. God programmeringsstil er å bruke maskinskrevne pekere så mye du kan. Pointer-datatypen er en generisk pekertype; den representerer en peker til alle data.
Legg merke til at når '^' vises etter en pekervariabel, fjerner den referansen til pekeren; det vil si at den returnerer verdien som er lagret på minneadressen som holdes av pekeren. I dette eksemplet har variabel j samme verdi som iValue. Det kan se ut som at dette ikke har noen hensikt når vi ganske enkelt kan tilordne iValue til j, men denne kodebiten ligger bak de fleste kall til Win API.
NILing-pekere
Ikke-tildelte pekere er farlige. Siden pekere lar oss jobbe direkte med datamaskinens minne, kan vi få en tilgangsbrudd feil hvis vi prøver å (ved en feiltakelse) skrive til et beskyttet sted i minnet. Dette er grunnen til at vi alltid bør initialisere en peker til NIL.
NIL er en spesiell konstant som kan tilordnes enhver peker. Når null er tilordnet en peker, refererer ikke pekeren til noe. Delphi presenterer for eksempel en tom
Karakterpekere
De grunnleggende typene PAnsiChar og PWideChar representerer pekere til AnsiChar- og WideChar-verdier. Den generiske PChar representerer en peker til en Char-variabel.
Disse tegnpekerne brukes til å manipulere null-terminerte strenger. Tenk på en PChar som en peker til en nullterminert streng eller til matrisen som representerer en.
Pekere til poster
Når vi definerer en post eller annen datatype, er det vanlig praksis også å definere en peker til den typen. Dette gjør det enkelt å manipulere forekomster av typen uten å kopiere store minneblokker.
Muligheten til å ha pekere til poster (og matriser) gjør det mye enklere å sette opp kompliserte datastrukturer som koblede lister og trær.
|_+_|
Tanken bak lenkede lister er å gi oss muligheten til å lagre adressen til neste lenkede element i en liste i et NextItem-postfelt.
Pekere til poster kan også brukes når du for eksempel lagrer tilpassede data for hvert trevisningselement.
Prosedyre- og metodepekere
Et annet viktig pekerkonsept i Delphi er prosedyre- og metodepekere.
Pekere som peker til adressen til en prosedyre eller funksjon kalles prosedyrepekere. Metodepekere ligner prosedyrepekere. Men i stedet for å peke på frittstående prosedyrer, må de peke på klassemetoder.
Metodepeker er en peker som inneholder informasjon om både navnet og objektet som blir påkalt.
Pekere og Windows API
Den vanligste bruken av pekere i Delphi er grensesnitt til C- og C++-kode, som inkluderer tilgang til Windows API.
Windows API-funksjoner bruker en rekke datatyper som kanskje er ukjente for Delphi-programmereren. De fleste parameterne i å kalle API-funksjoner er pekepinner til en eller annen datatype. Som nevnt ovenfor bruker vi nullterminerte strenger i Delphi når vi kaller Windows API-funksjoner.
I mange tilfeller, når et API-kall returnerer en verdi i en buffer eller peker til en datastruktur, må disse bufferne og datastrukturene tildeles av applikasjonen før API-kallet foretas. SHBrowseForFolder Windows API-funksjonen er ett eksempel.
Peker og minnetildeling
Den virkelige kraften til pekere kommer fra muligheten til å sette til side minne mens programmet kjører.
Denne kodebiten burde være nok til å bevise at det ikke er så vanskelig å jobbe med pekere som det kan virke med det første. Den brukes til å endre teksten (teksten) til kontrollen med håndtaket som følger med.
|_+_|