Ver Mensaje Individual
  #10  
Antiguo 14-12-2011
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.939
Reputación: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Marthian Ver Mensaje
pero tengo ahora tal curiosidad su función es apuntar a un puntero de la pila tal cual como se hace en el viejo asm?????

que beneficios nos trae como programador...
por que si puedo decir pi^= p2 y a ambos le coloco una simplicidad como = 5
Te lo pongo de esta manera.

Supon que existe este codigo:

Código Delphi [-]
procedure nombre
var
  MiNombre:String
begin
  MiNombre := 'Marthian';
end;

Imagina que la memoria de un computador es exactamente como una hoja de Excel, que al principio esta vacia y es aleatoria (porque en excel pones valores donde te da la gana. Si estan organizados es cosa tuya).

Ahora bien, si pones tu nombre en una celda, veras que realmente esa celda es "A1". "A1" es la dirección del valor de tu nombre.

Sin embargo, tu diras: MOMENTO ESO NO TIENE SENTIDO! porque el nombre esta dentro de una variable (A1)! Aja, pero y DONDE esta esa variable? En *otra* celda!

Como asi?

En Excel (osea, la memoria) tendrias esto:

B1 A1
Nombre Marthian

Asi, que en este caso, el *valor* esta en A2 pero la *variable* (que es como la etiqueta del valor) esta en B1. El *apuntador* es como interrogar esa indireccion, donde en la memoria si pregunto "Nombre"=B1 realmente quiero es "Marthian"=A2. Eso es lo que se quiere el 99% de las veces. Pero que pasa si quiero no el valor pero si la celda donde esta la vble (B2), entonces uso el sombrerito.

El *porque* es una cosa bizarra. Basicamente, es para hacer "trucos". Por ejemplo, para hacer un virus.

Digamos que en B1 esta el código que ejecuta un programa:


B1= RUN NotePad.exe (Lo real)
A1= NotePad.exe (Solo el nombre)

(que conste que eso que escribi no tiene mucho sentido)

Ahora, tu virus pregunta:

Dame B1. Pero el compilador responde: NotePad.exe.

NO! yo quiero hacer un virus!, asi que tu preguntas:

Dime ^B1. El te responde "RUN NotePad.exe". Ahora tu dices:

Cambia ^B1 por "RUN BorrarDisco.exe", que es como quien dice, un trastorno. Ahora has cambiado la realidad interna de lo que la memoria tiene.

Entonces, si preguntan: A1, responde "NotePad.exe", pero realmente ejecuta "RUN BorrarDisco.exe".

---

Los casos de uso en Delphi mas comunes los puedes leer aqui: http://delphi.about.com/od/objectpas...a/pointers.htm

Como un apuntado permite "mover" los valores de una vble(etiqueta) a otra:

http://www.delphibasics.co.uk/RTL.asp?Name=Pointer
Código Delphi [-]
var
  generalPtr : Pointer;  // A pointer to anything
  formPtr    : ^TForm;   // A pointer to a form object

begin
  // The current unit's form is addressable via the self keyword
  generalPtr := Addr(self);

  // We can assign this pointer to the form pointer
  formPtr := generalPtr;

  // And set the form caption to show this
  formPtr.Caption := 'Test program';
end;

Como ves, la forma estaba almacenada en una vble, pero se le cambio la direccion de su etiqueta a otra celda, usando los apuntadores.

P.D Aunque use pointers algunas veces, solo me alcanzo el nirvana hace unos meses tratando de explicar como funcionaba las vables. Si no fuera por excel, estaria frito
__________________
El malabarista.
Responder Con Cita