Array

Comprender y usar punteros en Delphi

-

Illustration of computer programming

Aunque los punteros son tan importantes en Delphi como en C o C ++, son tan importantes en el caso de Delphi como en C o C ++, son una cantidad básica; herramienta que casi cualquier cosa que tenga que ver con la programación debe tratar con punteros de alguna manera.

Es por eso que puede leer acerca de cómo una cadena u objeto es realmente solo un puntero, o que un controlador de eventos como OnClick es en realidad un puntero a un procedimiento.

Puntero al tipo de datos

En pocas palabras, un puntero es una variable que contiene la dirección de cualquier cosa en la memoria.

Para concretar esta definición, tenga en cuenta que todo lo que usa una aplicación se almacena en algún lugar de la computadora y la memoria de Apos; s. Debido a que un puntero contiene la dirección de otra variable, se dice que sí apunta a esa variable.

Video destacado

La mayoría de las veces, los punteros en Delphi apuntan a un tipo específico:

& lt; pre & gt; var & lt; br & gt ;
iValue, j: entero ; pIntValue: ^ entero; & lt; br & gt ;
begin & lt; / br & gt;
iValue: = 2001; pIntValue: = @iValue ;…j: = pIntValue ^; & lt; br & gt ;
final & lt; / br & gt;
;
& lt; / br & gt; & lt; / pre & gt ;

La sintaxis para declarar un tipo de datos de puntero utiliza un caret (^) . En el código anterior, iValue es una variable de tipo entero y pIntValue es un puntero de tipo entero. Como un puntero no es más que una dirección en la memoria, debemos asignarle la ubicación (dirección) del valor almacenado en la variable entera iValue.

El operador @ devuelve la dirección de una variable (o una función o procedimiento como se verá a continuación). Equivalente a la función @ operador es Addr . Tenga en cuenta que el valor de pIntValue & amp; apos; s no es 2001.

En este código de muestra, pIntValue es un puntero entero mecanografiado. Un buen estilo de programación es usar punteros mecanografiados tanto como puedas. El tipo de datos del puntero es un tipo de puntero genérico; representa un puntero a cualquier dato.

Tenga en cuenta que cuando & amp; quot; ^ & amp; quot; aparece después de una variable de puntero, desreferencia el puntero; es decir, devuelve el valor almacenado en la dirección de memoria que contiene el puntero. En este ejemplo, la variable j tiene el mismo valor que iValue. Puede parecer que esto no tiene ningún propósito cuando simplemente podemos asignar iValue a j, pero este código se encuentra detrás de la mayoría de las llamadas a Win API.

Punteros NILing

Los punteros no asignados son peligrosos. Dado que los punteros nos permiten trabajar directamente con la memoria de la computadora y los apos; si intentamos (por error) escribir en una ubicación protegida en la memoria, podríamos obtener un error de violación de acceso. Esta es la razón por la que siempre debemos inicializar un puntero a NIL.

NIL es una constante especial que se puede asignar a cualquier puntero. Cuando nulo se asigna a un puntero, el puntero no hace referencia a nada. Delphi presenta, por ejemplo, una matriz dinámica vacía o una cadena larga como un puntero nulo.

Punteros de caracteres

Los tipos fundamentales PAnsiChar y PWideChar representan punteros a los valores de AnsiChar y WideChar. El PCH genérico representa un puntero a una variable Char.

Estos punteros de caracteres se utilizan para manipular cadenas terminadas en nulo. Piense en un PChar como un puntero a una cadena terminada en nulo o en la matriz que representa una.

Punteros a registros

Cuando definimos un registro u otro tipo de datos, es una práctica común también definir un puntero a ese tipo. Esto facilita la manipulación de instancias del tipo sin copiar grandes bloques de memoria.

La capacidad de tener punteros para grabar (y matrices) hace que sea mucho más fácil configurar estructuras de datos complicadas como listas vinculadas y árboles.

& lt; pre & gt; tipo & lt; br & gt ;
pNextItem = ^ TLinkedListItem & lt; br & gt ;
TLinkedListItem = record sName: String; iValue: Integer; NextItem: pNextItem; & lt; br & gt ;
final & lt; / br & gt;
;
& lt; / br & gt; & lt; / br & gt; & lt; / pre & gt ;

La idea detrás de las listas vinculadas es darnos la posibilidad de almacenar la dirección en el siguiente elemento vinculado en una lista dentro de un campo de registro NextItem.

Los punteros a los registros también se pueden usar al almacenar datos personalizados para cada elemento de vista de árbol, por ejemplo.

Punteros de procedimiento y método

Otro concepto importante de puntero en Delphi son los punteros de procedimiento y método.

Los punteros que apuntan a la dirección de un procedimiento o función se denominan punteros de procedimiento. Los punteros de método son similares a los punteros de procedimiento. Sin embargo, en lugar de señalar procedimientos independientes, deben apuntar a métodos de clase.

El puntero de método es un puntero que contiene información sobre el nombre y el objeto que se invoca & amp; apos; s.

Punteros y API de Windows

El uso más común para punteros en Delphi es la interfaz con el código C y C ++, que incluye el acceso a la API de Windows.

Las funciones de la API de Windows utilizan varios tipos de datos que pueden ser desconocidos para el programador Delphi. La mayoría de los parámetros al llamar a las funciones API son punteros a algún tipo de datos. Como se indicó anteriormente, utilizamos cadenas terminadas en nulo en Delphi al llamar a las funciones de la API de Windows.

En muchos casos, cuando una llamada API devuelve un valor en un búfer o puntero a una estructura de datos, la aplicación debe asignar estos búferes y estructuras de datos antes de realizar la llamada API. La función API de Windows SHBrowseForFolder es un ejemplo.

Puntero y asignación de memoria

El poder real de los punteros proviene de la capacidad de reservar memoria mientras el programa se está ejecutando.

Este código debería ser suficiente para demostrar que trabajar con punteros no es tan difícil como parece al principio. It & amp; apos; s solía cambiar el texto (subtítulo) del control con el Mango provisto.

& lt; pre & gt; procedimiento GetTextFromHandle (hWND: THandle); & lt; br & gt ;
var & lt; / br & gt;
pText: PAR; // un puntero a char (ver arriba) TextLen: entero; & lt; br & gt ;
comenzar & lt; / br & gt;
& lt; br & gt ;
{Obtenga la longitud del texto} & lt; / br & gt;
TextLen: = GetWindowTextLength (hWND); & lt; br & gt ;
{alocar memoria} & lt; / br & gt;
& lt; br & gt ;
GetMem (pText, TextLen); // toma un puntero & lt; br & gt ;
{Obtenga el texto de control & amp; apos; s} & lt; / br & gt;
GetWindowText (hWND, pText, TextLen + 1); & lt; br & gt ;
{mostrar el texto} & lt; / br & gt;
ShowMessage (String (pText)) & lt; br & gt ;
{libere la memoria} & lt; / br & gt;
FreeMem (pText); & lt; br & gt ;
final & lt; / br & gt;
;
& lt; / br & gt; & lt; / pre & gt ;
& amp; # x203A; Informática

Dejar respuesta

Please enter your comment!
Please enter your name here

FOLLOW US

spot_img

Related Stories