{"id":1515,"date":"2015-10-08T12:16:10","date_gmt":"2015-10-08T18:16:10","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1515"},"modified":"2015-10-08T14:54:22","modified_gmt":"2015-10-08T20:54:22","slug":"apuntadores-pointer-en-lenguajes-de-programacion-orientada-a-objetos-java-y-c","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1515","title":{"rendered":"Apuntadores ( Pointer ) en lenguajes de programaci\u00f3n orientada a objetos ( Java y C# )"},"content":{"rendered":"<p>Los hardcore de la programaci\u00f3n deben recordar que es un apuntador, digo hardcore por que ahora hay puro soft por ah\u00ed con sus lenguajes bonitos<\/p>\n<p>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 \u00bf que es un apuntador ?<\/p>\n<p><strong>Apuntador<\/strong><\/p>\n<p>Es un tipo de variable especial que apunta a una direcci\u00f3n de memoria, esta zona de memoria deber\u00eda ser previamente definida por una variable de un tipo espec\u00edfico por ejemplo un INT<\/p>\n<p><strong>\u00bf Que caso tiene apuntar a una zona donde ya se declar\u00f3 previamente una variable ?<\/strong><\/p>\n<p>Obviamente suena redundante porque una variable int ya reservo su espacio de RAM y ya cuenta con su propia direcci\u00f3n de memoria. Pero las variables tienen un limitante en los lenguajes medios y altos solo se mantienen en memoria mientras se est\u00e1 ejecutando la funci\u00f3n que las declar\u00f3 adem\u00e1s de que su rango de acci\u00f3n est\u00e1 limitado al bloque de c\u00f3digo de la funci\u00f3n.<\/p>\n<p>Pero qu\u00e9 pasa si tienes por ejemplo una funci\u00f3n aislada que necesita modificar un valor en una zona de c\u00f3digo en la que no tiene acceso debido a que esta zona de c\u00f3digo esta fuera de su radio de acci\u00f3n, o debido a que no es parte de la funci\u00f3n si no es parte de otra funci\u00f3n remota.<\/p>\n<p>Una soluci\u00f3n ser\u00eda declarar una variable global pero esto est\u00e1 muy limitados, sin embargo si el c\u00f3digo en tiempo de ejecuci\u00f3n de alguna forma supiera la direcci\u00f3n de memoria de la variable que desea modificar este podr\u00eda ir directamente a la direcci\u00f3n de la memoria y modificarla y as\u00ed de simple termina el problema.<\/p>\n<p>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<\/p>\n<p>Por ejemplo un apuntador a int<\/p>\n<p>Se declara<\/p>\n<p><code>Int *apuntador;<\/code><\/p>\n<p>Una asignaci\u00f3n directa a apuntador sin el * significa que vamos a ingresar una direcci\u00f3n de memoria.<\/p>\n<p><code>apuntador = 0x0FF5;<\/code><\/p>\n<p>Una asignaci\u00f3n directa a apuntador con el * significa que vamos a modificar el valor contenido en la zona de memoria para este ejemplo 0x0FF5<\/p>\n<p><code>*apuntador = 10; \/\/ la direcci\u00f3n de memoria 0x0FF5 tiene asignado el valor 10<\/code><\/p>\n<p>Una variable convencional puede entregar el contenido de su direcci\u00f3n de memoria o su direcci\u00f3n de memoria, una variable convencional precedida por un &#038; significa que lo que debe entregar es su direcci\u00f3n de memoria, si un apuntador sin * lo que recibe es una direcci\u00f3n de memoria, entonces la siguiente asignaci\u00f3n dar\u00eda por resultado que apuntador \u201c apunte \u201c hacia la direcci\u00f3n de la memoria de una variable com\u00fan<\/p>\n<p><code>Apuntador = &varaiblecomun;<\/code><\/p>\n<p>Ahora que apuntador tiene la direcci\u00f3n de la varaiblecomun cualquier asignaci\u00f3n a esa direcci\u00f3n de memoria afectar\u00eda directamente a la variablecomun<\/p>\n<p><code>*apuntador = 10;<\/code><\/p>\n<p>Significa que variablecomun se le inyecto en su zona de memoria reservada el valor 10 como si se hubiera hecho una asignaci\u00f3n directa de memoriacomun = 10;<\/p>\n<p>Ejemplo<\/p>\n<p><code>Int *apuntador;<br \/>\nInt variablecomun;<\/p>\n<p>apuntador = &variablecomun;<br \/>\n*apuntador = 10;<\/code><\/p>\n<p>Ahora variablecomun contiene el valor 10 ;<\/p>\n<p><code>El siguiente condigo completo en C puede ayudar a entender completamente el concepto.<\/code><\/p>\n<p><code><br \/>\n#include <stdio .h><\/p>\n<p>void otraFuncion(int *X)<br \/>\n{<\/p>\n<p>        *X = 10;<\/p>\n<p>}<\/p>\n<p>int main()<br \/>\n{<br \/>\n        int entero = 0;<br \/>\n        int *apuntador = &entero;<\/p>\n<p>        printf (\"Valor de entero: %d\\n\",*apuntador);<\/p>\n<p>        otraFuncion (&entero);<\/p>\n<p>        printf (\"Valor de entero: %d\\n\",*apuntador);<\/p>\n<p>        return 0;<br \/>\n}<br \/>\n<\/stdio><\/code><\/p>\n<p>Ahora queda claro que es un apuntador veamos si tal cosa existe en programaci\u00f3n orientada a objetos.<\/p>\n<p>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.<\/p>\n<p><code>Miclase objeto1 = new Miclase();<br \/>\nMiclase objeto2 = new Miclase();<\/p>\n<p>objeto2 = objeto1;<\/code><\/p>\n<p>el c\u00f3digo anterior termina creando un enlace de memoria tipo puntero entre los 2 objetos, esto significa que aunque en teor\u00eda son 2 objetos separados todos los par\u00e1metros de estos objetos se igualan a la misma direcci\u00f3n de memoria despu\u00e9s de la asignaci\u00f3n de objetos.<\/p>\n<p>Significa que si despu\u00e9s modifico algo en el objeto1 tambi\u00e9n se estar\u00e1 modificando en el objeto2, al igual que un puntero nativo  esto es \u00fatil para poder alcanzar zonas de memoria que est\u00e1n fuera de tu espacio de nombres.<\/p>\n<p><strong>Ojo esta regla no se cumple cuando se trata de variables primitivas por ejemplo<\/strong><\/p>\n<p><code>Int variablecomun1, variablecomun2;<\/p>\n<p>Variablecomun1 = 0;<br \/>\nVariablecomun2 = 10;<\/p>\n<p>Varaiblecomun1 = variablecomun2;<\/code><\/p>\n<p>El resultado ser\u00eda que en lugar compartir el espacio de memoria simplemente se le asignar\u00eda el valor de variacomun2 a variablecomun1 , ambas variables valdr\u00edan 10 pero no por compartir la misma memoria si no porque ser\u00eda el valor igualado en sus respectivas zonas de memoria.<\/p>\n<p><strong>Un c\u00f3digo de ejemplo en C#<\/strong><\/p>\n<blockquote><p>** Mi blog no respeta los TAB para alinear el c\u00f3digo<\/p><\/blockquote>\n<p><code><br \/>\nusing System;<\/p>\n<p>namespace apuntador<br \/>\n{<\/p>\n<p>    class claseDatos<br \/>\n    {<br \/>\n        private string cadena;<\/p>\n<p>        public string datos   {<br \/>\n            get<br \/>\n            {<br \/>\n                return cadena;<br \/>\n            }<\/p>\n<p>            set<br \/>\n            {<br \/>\n                this.cadena = value;<br \/>\n            }<\/p>\n<p>        }<\/p>\n<p>  }<\/p>\n<p>    class otraClase<br \/>\n     {<br \/>\n        private claseDatos ObjetoX = new claseDatos();<br \/>\n            public otraClase(claseDatos X){<br \/>\n            ObjetoX = X;<br \/>\n            X.datos = \"Modificado en el constructor de otraClase\\n\";<\/p>\n<p>    }<br \/>\n}<\/p>\n<p>class Program<br \/>\n    {<\/p>\n<p>        static void Main(string[] args)<br \/>\n        {<\/p>\n<p>            claseDatos objeto1 = new claseDatos();<br \/>\n            claseDatos objeto2 = new claseDatos();<\/p>\n<p>            objeto2 = objeto1;<\/p>\n<p>            objeto2.datos = \"Hola Amigo\\n\";<br \/>\n            Console.WriteLine(objeto1.datos);<\/p>\n<p>            otraClase otroObjeto = new otraClase(objeto2);<br \/>\n            Console.WriteLine(objeto1.datos);<br \/>\n            Console.ReadLine();<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p><\/code><\/p>\n<p><strong>Una vez compilados y ejecutados ambos c\u00f3digos dan la siguiente salidas.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/apuntadorpoo.jpg\" alt=\"\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/apuntadorpoo.jpg\">Ver mas grande<\/a><\/p>\n<p>Yo siendo un viejo en estos asuntos de programaci\u00f3n, puedo decirme amargado y por lo tanto en mi opini\u00f3n en los lenguajes orientados a objetos no hay apuntadores solo una igualaci\u00f3n entre objetos que simulan ser un apuntador, la respuesta para mi es NO, no los hay<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;Agregado despues de la publicacion.&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n<p>Parece ser que en C# si hay punteros. <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/y31yhkeb.aspx\">https:\/\/msdn.microsoft.com\/en-us\/library\/y31yhkeb.aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los hardcore de la programaci\u00f3n deben recordar que es un apuntador, digo hardcore por que ahora hay puro soft por ah\u00ed 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&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1515","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1515"}],"version-history":[{"count":5,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1515\/revisions"}],"predecessor-version":[{"id":1520,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1515\/revisions\/1520"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}