Aanwijzers begrijpen en gebruiken in Delphi

elenabs/Getty Images
Ook al zijn aanwijzingen niet zo belangrijk in Delphi zoals ze zijn in C of C++ , ze zijn zo'n 'basis' hulpmiddel dat bijna alles wat ermee te maken heeft programmeren moet op de een of andere manier omgaan met aanwijzingen.
Het is om die reden dat je zou kunnen lezen dat een string of object eigenlijk slechts een aanwijzer is, of dat een gebeurtenishandler zoals OnClick eigenlijk een aanwijzer naar een procedure is.
Aanwijzer naar gegevenstype
Simpel gezegd, een pointer is een variabele die het adres van iets in het geheugen bevat.
Om deze definitie te concretiseren, moet u er rekening mee houden dat alles dat door een toepassing wordt gebruikt, ergens in het geheugen van de computer wordt opgeslagen. Omdat een aanwijzer het adres van een andere variabele bevat, wordt gezegd dat hij naar die variabele verwijst.
Meestal wijzen verwijzingen in Delphi naar een specifiek type:
|__+_|De syntaxis om een pointergegevenstype te declareren gebruikt a caret (^) . In de bovenstaande code is iValue een integer type variabele en pIntValue is een integer type pointer. Aangezien een pointer niets meer is dan een adres in het geheugen, moeten we er de locatie (adres) van de waarde aan toewijzen die is opgeslagen in de iValue integer-variabele.
De @ operator retourneert het adres van een variabele (of een functie of procedure zoals hieronder zal worden gezien). Gelijk aan de @-operator is Addr-functie . Merk op dat de waarde van pIntValue niet 2001 is.
In deze voorbeeldcode is pIntValue een getypte integer-pointer. Een goede programmeerstijl is om zoveel mogelijk getypte aanwijzers te gebruiken. Het gegevenstype Pointer is een algemeen pointertype; het vertegenwoordigt een verwijzing naar alle gegevens.
Merk op dat wanneer '^' verschijnt na een aanwijzervariabele, dit de verwijzing naar de aanwijzer de-refeert; dat wil zeggen, het retourneert de waarde die is opgeslagen op het geheugenadres dat door de aanwijzer wordt vastgehouden. In dit voorbeeld heeft variabele j dezelfde waarde als iValue. Het lijkt misschien alsof dit geen doel heeft wanneer we iValue eenvoudig aan j kunnen toewijzen, maar dit stukje code ligt achter de meeste oproepen naar Win API.
NILing-aanwijzers
Niet-toegewezen aanwijzers zijn gevaarlijk. Aangezien pointers ons rechtstreeks met het geheugen van de computer laten werken, kunnen we een toegangsfout krijgen als we (per ongeluk) proberen naar een beveiligde locatie in het geheugen te schrijven. Dit is de reden waarom we altijd een aanwijzer naar NIL moeten initialiseren.
NIL is een speciale constante die aan elke aanwijzer kan worden toegewezen. Wanneer nul is toegewezen aan een aanwijzer, verwijst de aanwijzer nergens naar. Delphi presenteert bijvoorbeeld een lege
Karakteraanwijzers
De fundamentele typen PAnsiChar en PWideChar vertegenwoordigen verwijzingen naar AnsiChar- en WideChar-waarden. De generieke Pchar vertegenwoordigt een aanwijzer naar een Char-variabele.
Deze karakteraanwijzers worden gebruikt om null-terminated te manipuleren snaren. Beschouw een PChar als een verwijzing naar een op nul eindigende tekenreeks of naar de array die er een vertegenwoordigt.
Verwijzingen naar records
Wanneer we een record of ander gegevenstype definiëren, is het gebruikelijk om ook een verwijzing naar dat type te definiëren. Dit maakt het gemakkelijk om instanties van het type te manipuleren zonder grote geheugenblokken te kopiëren.
De mogelijkheid om verwijzingen naar records (en arrays) te hebben, maakt het veel gemakkelijker om gecompliceerde gegevensstructuren in te stellen als gekoppelde lijsten en bomen.
|__+_|
Het idee achter gekoppelde lijsten is om ons de mogelijkheid te geven om het adres op te slaan naar het volgende gekoppelde item in een lijst in een NextItem-recordveld.
Verwijzingen naar records kunnen bijvoorbeeld ook worden gebruikt bij het opslaan van aangepaste gegevens voor elk item in de boomstructuur.
Procedure- en methodeaanwijzingen
Een ander belangrijk aanwijzerconcept in Delphi zijn procedure- en methodewijzers.
Pointers die verwijzen naar het adres van een procedure of functie worden procedurele pointers genoemd. Methodewijzers zijn vergelijkbaar met procedurewijzers. In plaats van te verwijzen naar op zichzelf staande procedures, moeten ze echter verwijzen naar klassenmethoden.
Method pointer is een pointer die informatie bevat over zowel de naam als het object dat wordt aangeroepen.
Aanwijzers en Windows API
Het meest voorkomende gebruik voor pointers in Delphi is de interface naar C- en C++-code, inclusief toegang tot de Windows API.
ramen API-functies gebruiken een aantal gegevenstypen die de Delphi-programmeur misschien niet kent. De meeste parameters bij het aanroepen van API-functies zijn verwijzingen naar een bepaald gegevenstype. Zoals hierboven vermeld, gebruiken we null-terminated strings in Delphi bij het aanroepen van Windows API-functies.
In veel gevallen, wanneer een API-aanroep een waarde in een buffer of een verwijzing naar een gegevensstructuur retourneert, moeten deze buffers en gegevensstructuren door de toepassing worden toegewezen voordat de API-aanroep wordt gedaan. De SHBrowseForFolder Windows API-functie is een voorbeeld.
Aanwijzer en geheugentoewijzing
De echte kracht van aanwijzers komt van de mogelijkheid om geheugen opzij te zetten terwijl het programma wordt uitgevoerd.
Dit stukje code zou voldoende moeten zijn om te bewijzen dat het werken met pointers niet zo moeilijk is als het op het eerste gezicht lijkt. Het wordt gebruikt om de tekst (bijschrift) van het besturingselement te wijzigen met de meegeleverde handgreep.
|__+_|