2011-07-13 27 views
10

A continuación se muestra un ejemplo simple del uso de puntero en Delphi.¿Cuáles son las reglas para usar^para apuntar al valor?

Type 

TRecord1 = Record 
field1 : String; 

end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    Rec : TRecord1; 
    Ptr: ^TRecord1; 

begin 
    Rec.field1:= 'field1'; 
    Ptr := @Rec; 
    memo1.Lines.Add (Ptr^.field1); 
    memo1.Lines.Add (Ptr.field1); // it also works. 

end; 

En tal caso, Ptr^y Ptr funcionan ambos. Parece que Delphi es para permitirle al usuario más flexibilidad al señalar el valor. Pero al leer las dos líneas, son sintácticamente diferentes y pueden significar de manera diferente. En tal caso ambos funcionan. Pero mi pregunta es:

  1. ¿cómo puede un usuario conocer en otras situaciones en las que^pueden o no pueden ser omitidos o, en su^con o sin^significa lo mismo o diferente?
  2. ¿Cuáles son esas situaciones? Se apreciarán ejemplos.
  3. ¿Por qué? (Opcional)

Muchas gracias de antemano.

+0

Cuando 'ptr' es un tipo de puntero (incluidos los punteros implícitos), se puede omitir la eliminación de referencias. –

Respuesta

9

¿cómo puede saber un usuario en otras situaciones en las que^puede o no puede omitirse o, donde con^o sin^significa lo mismo o diferente?

¿Cuáles son esas situaciones? Se apreciarán ejemplos.

Una llanura Pointer no tiene ningún campos o propiedades, por lo que haciendo caso omiso de inteligencia de Delphi, la sintaxis Pointer.Field no tiene sentido. Por eso no puede haber un conflicto entre Pointer^.Field y Pointer.Field, simplemente porque la sintaxis . no tiene sentido si no se desreferencia el puntero.

Si el tipo apuntado por el puntero no tiene ningún campo, debe usar la sintaxis ^. Es decir, cuando el puntero es un puntero a un tipo básico o es un puntero sin tipo.

¿Por qué? (Opcional)

referencias instancia de clase (lo que mucha gente llama "objetos") también son punteros en Delphi, asumo la sintaxis se introdujo para que el trabajo con los punteros menos detallado y más como el uso de clases. También es inofensivo, porque como se mencionó anteriormente, el compilador no puede equivocarse.

Personalmente prefiero la sintaxis ^., porque deja en claro que estoy trabajando con un puntero y no un registro o clase.

+4

"Las clases también son punteros en Delphi" - ¿no debería ser esto "Las referencias a los objetos también son punteros en Delphi"? – mjn

+3

@mjn Debería ser mejor que "Las instancias de clase también sean punteros en Delphi", ya que "Referencia de objeto" podría referirse a la palabra clave 'object', ¿no es así? Lo que sea, todos entendimos el punto. ;) –

+0

@ A.Buez ya que el objeto es un tipo de valor de referencia de objeto puede significar solo uno. Personalmente prefiero que el uso de un objeto en las discusiones signifique una instancia de una clase. Es menos prolijo. –

2

ptr.property nunca es válido y distintamente diferente de ptr^.property, por lo que Delphi le permite omitir ^. si ptr no está tipeado (o es un tipo de datos básico), entonces^siempre es obligatorio.

+0

ptr.property es una sintaxis válida, incluso si ptr^.property es más correcto. –

+2

@ A.Bouchez: Creo que entendiste mal la respuesta aquí. Hizo la misma observación que Cosmin y dijo que 'ptr.property' nunca tendría sentido y que Delphi no puede hacer nada incorrecto (+1 para compensar el voto a la baja) – jpfollenius

+2

@Smasher, @ A.Bouchez, también creo que la fraseología La respuesta de Gordy es realmente confusa: si comprendes el problema subyacente, puedes adivinar cuál es el significado, pero de lo contrario la respuesta es engañosa. A.Bouchez es perfectamente correcto, 'ptr.property' * es * sintaxis válida, y sin más explicaciones, la mitad de la respuesta es incorrecta. –

1

Es muy simple. Si el uso de ptr.field no es ambiguo, es decir, si no puede tener otro significado que ptr^.field, se puede omitir ^.

Pero solo entonces. En los casos donde omitir^crea una construcción ambigua (es decir, donde podría tener diferentes significados), no se puede omitir.

3

La única diferencia es que

Ptr1 := Ptr2 

no es igual a

Ptr1^ := Ptr2^ 

La primera línea hará que ptr1 y ptr2 que apuntan a la misma área de memoria, la segunda será asignar el valor apuntado por Ptr2 a la "variable" apuntada por Ptr1.

Por esta razón, creo que permitir la sintaxis del valor de Ptr.Field debería ser un error, porque aunque no surja ambigüedad del lado del compilador, introduce una forma perezosa de escribir código, que podría fallar en situaciones como las anteriores .

Cuestiones relacionadas