Apuntadores ( Pointer ) en lenguajes de programación orientada a objetos ( Java y C# )

Los hardcore de la programación deben recordar que es un apuntador, digo hardcore por que ahora hay puro soft por ahí con sus lenguajes bonitos

Cuenta la leyenda que no hay apuntadores en los lenguajes orientados a objetos, pero como todas las leyendas tienen una parte de verdad y otra falsa. Pero para poder saber si tiene o no apuntadores preguntemos ¿ que es un apuntador ?

Apuntador

Es un tipo de variable especial que apunta a una dirección de memoria, esta zona de memoria debería ser previamente definida por una variable de un tipo específico por ejemplo un INT

¿ Que caso tiene apuntar a una zona donde ya se declaró previamente una variable ?

Obviamente suena redundante porque una variable int ya reservo su espacio de RAM y ya cuenta con su propia dirección de memoria. Pero las variables tienen un limitante en los lenguajes medios y altos solo se mantienen en memoria mientras se está ejecutando la función que las declaró además de que su rango de acción está limitado al bloque de código de la función.

Pero qué pasa si tienes por ejemplo una función aislada que necesita modificar un valor en una zona de código en la que no tiene acceso debido a que esta zona de código esta fuera de su radio de acción, o debido a que no es parte de la función si no es parte de otra función remota.

Una solución sería declarar una variable global pero esto está muy limitados, sin embargo si el código en tiempo de ejecución de alguna forma supiera la dirección de memoria de la variable que desea modificar este podría ir directamente a la dirección de la memoria y modificarla y así de simple termina el problema.

Los apuntadores son una cosa muy bonita, pero peligrosa, sin embargo en las manos correctas hacen magia en una computadora. En lenguaje C un apuntador funciona de diferentes formas dependiendo de la forma en que se trate la variable apuntador o las variables comunes

Por ejemplo un apuntador a int

Se declara

Int *apuntador;

Una asignación directa a apuntador sin el * significa que vamos a ingresar una dirección de memoria.

apuntador = 0x0FF5;

Una asignación directa a apuntador con el * significa que vamos a modificar el valor contenido en la zona de memoria para este ejemplo 0x0FF5

*apuntador = 10; // la dirección de memoria 0x0FF5 tiene asignado el valor 10

Una variable convencional puede entregar el contenido de su dirección de memoria o su dirección de memoria, una variable convencional precedida por un & significa que lo que debe entregar es su dirección de memoria, si un apuntador sin * lo que recibe es una dirección de memoria, entonces la siguiente asignación daría por resultado que apuntador “ apunte “ hacia la dirección de la memoria de una variable común

Apuntador = &varaiblecomun;

Ahora que apuntador tiene la dirección de la varaiblecomun cualquier asignación a esa dirección de memoria afectaría directamente a la variablecomun

*apuntador = 10;

Significa que variablecomun se le inyecto en su zona de memoria reservada el valor 10 como si se hubiera hecho una asignación directa de memoriacomun = 10;

Ejemplo

Int *apuntador;
Int variablecomun;

apuntador = &variablecomun;
*apuntador = 10;

Ahora variablecomun contiene el valor 10 ;

El siguiente condigo completo en C puede ayudar a entender completamente el concepto.


#include

void otraFuncion(int *X)
{

*X = 10;

}

int main()
{
int entero = 0;
int *apuntador = &entero;

printf ("Valor de entero: %d\n",*apuntador);

otraFuncion (&entero);

printf ("Valor de entero: %d\n",*apuntador);

return 0;
}

Ahora queda claro que es un apuntador veamos si tal cosa existe en programación orientada a objetos.

En la practica si, pero no estoy muy seguro de llamarle apuntador, un comportamiento similar a un apuntador de memoria existe al momento de asignar un objeto a otro del mismo tipo/clase por ejemplo.

Miclase objeto1 = new Miclase();
Miclase objeto2 = new Miclase();

objeto2 = objeto1;

el código anterior termina creando un enlace de memoria tipo puntero entre los 2 objetos, esto significa que aunque en teoría son 2 objetos separados todos los parámetros de estos objetos se igualan a la misma dirección de memoria después de la asignación de objetos.

Significa que si después modifico algo en el objeto1 también se estará modificando en el objeto2, al igual que un puntero nativo esto es útil para poder alcanzar zonas de memoria que están fuera de tu espacio de nombres.

Ojo esta regla no se cumple cuando se trata de variables primitivas por ejemplo

Int variablecomun1, variablecomun2;

Variablecomun1 = 0;
Variablecomun2 = 10;

Varaiblecomun1 = variablecomun2;

El resultado sería que en lugar compartir el espacio de memoria simplemente se le asignaría el valor de variacomun2 a variablecomun1 , ambas variables valdrían 10 pero no por compartir la misma memoria si no porque sería el valor igualado en sus respectivas zonas de memoria.

Un código de ejemplo en C#

** Mi blog no respeta los TAB para alinear el código


using System;

namespace apuntador
{

class claseDatos
{
private string cadena;

public string datos {
get
{
return cadena;
}

set
{
this.cadena = value;
}

}

}

class otraClase
{
private claseDatos ObjetoX = new claseDatos();
public otraClase(claseDatos X){
ObjetoX = X;
X.datos = "Modificado en el constructor de otraClase\n";

}
}

class Program
{

static void Main(string[] args)
{

claseDatos objeto1 = new claseDatos();
claseDatos objeto2 = new claseDatos();

objeto2 = objeto1;

objeto2.datos = "Hola Amigo\n";
Console.WriteLine(objeto1.datos);

otraClase otroObjeto = new otraClase(objeto2);
Console.WriteLine(objeto1.datos);
Console.ReadLine();
}
}
}

Una vez compilados y ejecutados ambos códigos dan la siguiente salidas.


Ver mas grande

Yo siendo un viejo en estos asuntos de programación, puedo decirme amargado y por lo tanto en mi opinión en los lenguajes orientados a objetos no hay apuntadores solo una igualación entre objetos que simulan ser un apuntador, la respuesta para mi es NO, no los hay

————Agregado despues de la publicacion.———————-

Parece ser que en C# si hay punteros. https://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

2 Comments

Add a Comment

Comment spam protected by SpamBam