Dev - C++ - Punteros :s

   
Vista:
Imágen de perfil de Nacho

Punteros :s

Publicado por Nacho (4 intervenciones) el 19/01/2015 00:05:09
(Si gustan pueden saltarse la biblia que escribí antes de la pregunta, e ir directo a las preguntas que estan abajo en negrita.)
Buenas, primero disculparme porque si les soy sincero no indague mucho en google para buscar la respuesta :C

Recordé este foro que participe activamente durante un tiempo así que decidí "porque no mejor en vez de responder pregunto algo" :3.

Mi lenguaje principal es Java, pero ya me aburrí un poco de el y ahora le estoy dando duro a C++, el tema es el siguiente, como sabrán en Java no se maneja el concepto de punteros (por ahí se encuentran unos anarquistas que dicen que java maneja punteros, pero como no se de esto no puedo opinar).

Algo en tiendo al respecto porque estudie un poco de Assembler hace un tiempo atrás, y bueno el tema de las direcciones de memoria son muy importante en aquel lenguaje.

El problema es el siguiente, lo único que hice fue crear una variable int, común y corriente y asignarla a un puntero, luego imprimí con cout su dirección de memoria. mi sorpresa fue que al ejecutar el programa por segunda vez la dirección es la misma, y luego ejecuto el programa dos veces, al mismo tiempo (asignando distintos valores de variables ya si por las dudas) y tienen la misma dirección.

Como entenderán esto me dejo un poco confundido, pensé en un principio que la asignación de memoria de una variable varia la primera y la segunda vez que se ejecuta, por el solo hecho de que esta se asigna dependiendo el uso actual de la memoria, y por segundo pensé que cada dirección era única. (como una PK)

entonces mi pregunta es la siguiente?

La asignación de memoria es relativa al programa, quiero decir, yo realmente no accedo a la dirección real, sino a una virtual que me entrega mi programa para poder trabajar con variables integras en el mismo? (si es así supongo que es por tema de seguridad)

en caso de que esto sea correcto como accedo a la dirección real?, mi pregunta es porque quiero intentar cambiar una variable del programa A, desde el programa B
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Punteros :s

Publicado por vangodp (287 intervenciones) el 19/01/2015 01:22:26
No se que has echo ya que no aportas nada en código.
Un puntero también es una variable, pero a diferencia de las demás es guarda la dirección de otra variable.
Por ejemplo si un cartero me pregunta el numero de una casa para entregar una carta y le indico el camino, el puntero soy yo. ¿Pero es que yo también tengo una dirección no? No vivo en la calle aun XD
Pero una cosa es cierta la dirección del puntero no va cambiar, pero si puede variar lo que apunta.
Entonces si tengo 2 variables, un puntero y un entero pues tengo 2 direcciones.
Vamos a ver como sacamos las direcciones de ambas y sus valores.

//variable tipo entero
int n = 10;

//puntero que apunta a int:
int *p = NULL; /*No confundir el asterisco a la hora de crear un puntero, ya que en ese caso no quiere decir nada, solo se pone el asterisco porque si no no se distingue un puntero a la hora de crearlo de un simple entero común.¿Sabrías decir cual es el puntero si le quitas el *?: int *n; */

//ahora guardaremos en el puntero la dirección de memoria de 'n'.
p = &n;

Fíjese que p como es un puntero funciona exactamente como un puntero a la hora de una asignacion. La diferencia entre el y un int es inexistente a la hora de asignar, lo que cambia es la variable apuntada ya que cuando pongo el operador de referencia '&' delante lo que quiero decir es que quiero su direccion y no su valor.

El puntero p guarda un entero como si fuera un entero, pero ese entero es un numero que indica la dirección donde esta n.

bien.. ¿Ahora que cosas chulas podemos hacer con ese puntero que apunta a n? podemos sacar el valor y direccion del mismo puntero o(<-fijese en este OOOO) lo mismo pero para la variable.

Si he dicho que un puntero es como una variable, si imprimo con cout de forma normal: cout << p << endl; obtengo el valor que guarda el puntero. Como dije antes, ese valor es la dirección de n y "NO SU VALOR". "Los punteros guardan números, pero esos números son direcciones de otras variables, incluyendo otros punteros"

Entonces si un puntero a efectos se parece a una variable del tipo entero podemos sacar su dirección también al igual que los enteros.

cout << &p << endl;

"El operador de referencia nos referimos a su dirección. La dirección de si mismo."

Bien... ahora hacemos lo mismo con n, sacamos el valor que guarda n y también su dirección.

Para sacar el valor que guarda n indirectamente desde de p usamos el operador de "indireccion(*)" que es el asterisco. XD

cout << *p << endl; // En ese caso el operador '*' es muy importante, y no como en la declaración que lo unico que hace es distinguir un puntero de un entero normal. En ese caso con * me refiero al valor de n. No digo que en la declaración de un puntero el asterisco carezca de importancia, solo que al declarar quiere decir una cosa y a la hora de extraer o modificar el contenido al que apunta es otra cosa.
En este caso el asterisco tiene ambos significados.
int otron = 100;
int *otrop = otron; // se crea el puntero y se usa el asterisco para reservar memoria
¿Si no ponemos el asterisco queda raro no? int otrop = otron;. Es como 2 enteros loles XD

Con eso me refiero indirectamente a n y me devuelve el valor guardado en n que es 10. Lo mismo es para asignar: *p = 1000. ¿Ves por que debemos poner el * antes de p? si hago p = 1000 esta fatal eso ya que hago que p deje de apuntar a n y pase a apuntar algo que esta en la dirección 1000 de la memoria. :O

Sigamos... ¿Puedo sacar la dirección de n? Claro, pero es algo mas lioso. Veamos un ejemplo.
Primero debo destacar que es el mismo valor que guarda p pero en vez de imprimir lo que guarda p, digamos que voy a donde esta n y saco su dirección.

cout << &*p << endl;

En efectos &*p es lo mismo que p pero si imprimo p imprimo lo que guarda, pero si imprimo &*p es como ir a n y hacer &n. Si pongo * me refiero a valor de n, si pongo &* me refiero que me diga n donde se encuentra.

Te dejo un código para que lo analices:
http://codepad.org/9HjKwq09

Si ya te has esclarecido puedes ver el por que del error.

Recuerde! "Un puntero es una variable que apunta a otra/s variable/s incluido los punteros".
Los operadores de referencia y de indereccion y los punteros en general son muy importantes en C y C++.

Si tienes dudas puedes preguntar. Si pones código me evitas escribir la biblia nuevamente XDD

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de vangodp

Punteros :s

Publicado por vangodp (287 intervenciones) el 19/01/2015 01:43:14
Con respecto a las preguntas en negrita.

Como bien haz dicho no puedes acceder a variables de otros programas ya que están en procesos separados y no comparten memoria(culpa del sistema XD). Sin embargo existen mecanismos que sirven para comunicar programas tales como forks, socketes, tuberías(pipes) etc etc.

Busque en google "como comunicar 2 programas distintos en C C++" o algo asi XD

Si el programa lo haces tu puedes usar procesos, hilos y un sin fin de abanicos para lograr lo que quieres.
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Nacho

Punteros :s

Publicado por Nacho (4 intervenciones) el 19/01/2015 02:49:07
Respuesta muy completa, xD!, la leí toda, ya sabia como utilizar punteros y como funcionaban y todo, pero nunca esta de mas repasar. gracias.

Bueno acerca de mis dos preguntas (lamento no poner código, no lo creí necesario), veras te explico cual es la problematica.

en java almenos se abusa mucho de la encapsulacion, poner atributos privados y cosas por el estilo para que no se pueda cambiar el valor externamente, y quiero comprobar que esto es asi, por el simple hecho de comprobarlo (soy como un niño cuando se trata de estas cosas)

Entonces cuando lei el tema de los punteros, dije "Bueno, quizás acá si pueda, seguro que c++ me lo permite" (con java ni lo intente, como no tiene acceso directo al sistema). y bueno, ese es mi objetivo.

Estoy "simplemente" intentando cambiar el valor de una variable en un programa hecho por mi en java desde c++, sin hacer ningún arreglo en el programa hecho en java, la idea no es hacer una conexión socket ni nada, estoy probando con variables publicas y privadas quiero ver cual es la diferencia.

Espero poder haberme expresado mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Punteros :s

Publicado por vangodp (287 intervenciones) el 19/01/2015 04:52:00
No conozco a java. Pero los mecanismos son los mismos. O al menos eso creo, pero he leido muy poco sobre java.
Los mecanismos son 3 para las clases. protected, privete, public.
Es casi exactamente como java a excepción de que no tienes por que poner tantos private adelante de todas las variables XDD, por defecto ya es privado. A menos que pongas otra cosa todo sera privado, si pones public en la 3º linea desde esta linea sera publico hasta que pongas otra cosa.

Pero realmente eso no quiere decir que puedas compartir nada con java al hacer algo publico. Las variables de un programa solo se pueden compartir dentro de un mismo proceso.

Y es que a mi no me interesa que otros programas tengan acceso a las variables de mi programa tan fácilmente. Si así fuera de fácil estaríamos perdidos. XDD

Mire... para programación conjunta existe otras formas como JNI, JNA, http://zeromq.org/...

Pero de verdad, no se por que te empeñas en programar de esta forma. ¿Si aprendes C++ para que va uno a necesitar java? XDD

Poco mas te puedo ayudar ya que no entiendo mucho sobre el tema. pasa te en el foroselhacker.net o en forosdelweb y alli hay mas expertos que yo por lo menos jaja. Visita la parte tanto de C/C++ como la de Java que los del otro bando algo deben saber jaja

Suerte.

PD procure leer sobre procesos y hilos y ya entenderás el por que no se puede hacer eso. Pero como dije lea todo sobre lo que te mencioné que no es poco. XDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nacho

Punteros :s

Publicado por Nacho (4 intervenciones) el 19/01/2015 06:02:15
El tema es que si se puede, o al menos eso creo, la razón por la cual me empeño tanto en esto, es porque recuerdo que hace añooos atrás (antes de estudiar programación y eso) utilice un programa que cambiaba ciertos valores de un videjuego, por ejemplo señalabas que buscar la variable con el valor 3 (3 era el valor de vidas que tenia), luego señalabas que buscar todas las variables que encontró anterior mente pero que esta vez fuera 2 (esto lo hacías cuando perdías una vida)... de esta manera encontrabas 1 o 3 variables que coincidían con ambos valores, y en este punto podías cambiar el valor de cada una de estas variables y ponerlas como 99, de esta manera el juego íntegramente modificaba su variable y la hacia 99... pues ahora tenia 99 vidas.

Recuerdo eso y me pregunto.... bueno, como es que ese programa lo hizo, recuerdo numeros hexadecimal (que supongo que eran las direcciones de memoria).

(mientras escribía esto, busque por google, el programa que comento es cheat engine, y me causa curiosidad averiguar como es que lo hace, ahora me pondré en ello)

PD: en respuesta a tu pregunta: ¨Pero de verdad, no se por que te empeñas en programar de esta forma. ¿Si aprendes C++ para que va uno a necesitar java? XDD¨. Me empeño en hacerlo por pura y mera curiosidad.

PD: Gracias por el dato del encapsulado (private, public, protected) en java es lo mismo con excepcion de que existen cuatro - private, public, protected, "friendly". Friendly es el por defecto (se puede acceder a la variable desde cualquier clase que ente en el mismo paquete, o carpeta, hasta ahora no le veo ningún buen uso xD! y mira que estoy por certificarme en java xD!).

Lamento tanto bla bla bla, no conozco a nadie con el cual "compartir conocimientos", es raro encontrar a alguien con el que pueda hablar de este tipo de temas xD!

Suerte y gracias por tus respuestas... lamento ser cabeza dura :C

modifico para agregar info, por si te pica la curiosidad: http://es.wikipedia.org/wiki/Cheat_Engine
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Punteros :s

Publicado por vangodp (287 intervenciones) el 19/01/2015 06:50:41
En C++ tambien hay friendly aun que no se llama así, se llama friend. Pero es una especie de modificador.

A ver... A lo que te refieres es a eso:
http://code0x66.blogspot.com.es/2014/03/tutorial-cheat-engine.html
http://code0x66.blogspot.com.es/2014/03/tutorial-cheat-engine-parte-2-solitario.html

Vamos a ver. Hay formas de hackear la memoria que es la que tu te refieres usando por ejemplo el cheat engine.

Yo creo que si existe alguna forma y incluso mas de una. Lo que no lo pillas es que no te puedo ayudar mucho debido a mis conocimientos limitados.

No me importa en absoluto el parloteo XDD. Si fuera así no andaba por los foros.

Te he intentado ayudar todo lo que he podido. Me he vaciado la cabeza y como ultimo recurso te recomendé esos foros. Para mi esos foros son el ultimo recurso ya, como cuando ya doy por vencido. XD

Eh estado leyendo sobre memory maps y varias cosas por que también me pica la curiosidad. No estoy a punto de sacar el titulo ya que ni termine la escuela básica. Aprendo completamente autodata pero ya lleo algunos años en eso.

Particurlamente creo que haces bien bajando un escalon. No es que java sea malo, ni que C o C++ sean mejor. Creo que uno tiene ciertas ventajas sobre el otro.
Algún día quizás aprenda a programar java cuando me de por satisfecho con C++.
Pero es que con un lenguaje como C++ de verdad no creo que haya alguno que le pueda hacer frente. y si aun necesito mas potencia me puedo bajar un escalón hacia C que tambien se bastantes cosillas. XD

Que no te de malas impresiones que para lo que estoy aquí es para ayudar, pero mi ayuda es limitada debido a mis limitaciones, as veces es como dices, sabes algo que has visto, no te sirve hoy pero mañana quien sabe. XD

Vaya al foro estos que te dije, halla estan algunos de los mejores programadores que he visto hasta hoy. uno de ellos es el de la pagina de cheat engine que te pase, su nombre es ivancea.
Luego hay otros que son amchacon, eferion, angellex, leo samsam, rir3760 creo jaja nunca me acuerdo de esos numeritos. Este ultimo es quizas el mas fiera de todos aun que no se...Queda difícil saber cual es el mejor jaja, seguro me he olvidado de alguno.
Si esos no saben es que no se donde puedes buscar esta info de veras.

Si encuentras una solución igual me interesa a mi también. si quieres pasar y dejar un mensaje =D
Te voy a dejar unas pagina que me servio y me sigue sirviendo.

Esta es de un profesor muy majo de barcelona tengo entendido.
http://v1.minidosis.org/C++/

http://www.c.conclase.net/

Esta quizás sea la mejor referencia de internet junto a stackoverflow
http://www.cplusplus.com/reference/

http://www.zator.com/Cpp/E_Ce.htm

los 2 foritos juntos con este y otro que es este: http://www.elrincondelc.com/nuevorincon/foros/. Ahí le veras al rir3760 que comente, es un moderador ahí.

En youtube hay varios mas canales de programación muy muy buenos si los buscas.
Ese es mi material de aprendizaje. XD

Si me necesitas me puedes agregar en skype que allá me llamo igual. XD
Y si no pues aquí estaré siempre o hasta que me eche un moderador jaja

suerte.

PD ¿Por cierto? Te gusta hacer juegos? >_<
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nacho

Punteros :s

Publicado por Nacho (4 intervenciones) el 19/01/2015 07:46:54
xDDDD, bueno yo ya no posteo por ayuda, solo para hablar xDDD!.

la verdad es que c++ no es mi segundo lenguaje, sera quizás como sexto o quinto... xD!

No te pierdes de nada con el tema de los estudios, como te dije, no tengo con quien hablar de este tema, ya que los profesores en la universidad se concentran en su area, los negocios y esas cosas, prácticamente solo saben hacer mantenedores (que no me mal entiendas, no esta mal que se centren en un sector), pero yo intento buscar un poco mas... porque no tengo a nadie que mantener, solo me concentro en esto.

Respecto a tu pregunta, en este momento estoy haciendo uno con un amigo, en c#, el problema es que el no sabe mucho y por esta razón estoy estudiando c++ (empece ayer, pero como es similar a otros lenguajes de programacion ya tengo todo lo básico), intentare crear un videojugo en c++ en lo que mi amigo estudia lo que necesita de c# para hacer uno mas completo.

Otro tena que me llamo la atención eso de bajar un escalón, xDD! si ahora bajo un escalón porque hace un tiempo atrás salte desde un maldito risco, (estudie Ensamblador, porque me molesta un poco que al intentar hacer algo en otro lenguaje me digan "No puedes hacerlo porque es de alto nivel", y te aseguro que si el código binario fuera factible también estaría en ello xD) <Si te lo preguntas, ensamblador me la gano, lo estudie unos 3 dias y bueno no me llamo tanto la atención.>

Gracias por las respuestas... y no se que hora sea en donde vivas, pero aca son casi las 4am, y mañana trabajo temprano, a ver si me quedo despierto la noche por culpa de este foro xD!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Punteros :s

Publicado por vangodp (287 intervenciones) el 19/01/2015 08:22:23
bueno...
Yo como lenguaje solo se C/C++, pero no creo que dar el salto sea nada del otro mundo, sea cual sea el lenguaje. Al igual que desde java a C++, se te hará pan comido ya lo veras.

Yo no se nada de ensamblador, me atrae vagamente. Puede ser el potente que quieras, pero si para escribir un hola mundo necesito varias lineas no me gana para nada. aun que se puede combinar con C/C++ tengo entendido. ^^
Eso es lo que hay, si vas hacia abajo mas control tienes pero a la vez mas lento programar y mas complicado.

Por si te interesa en SFML se hacen cositas muy buenas en 2d, y ya mas arriba pues esta opengl que lo puedes combinar por ejemplo con SFML, o incluso otras librerías para el 3D. O bien ya te tiras a Directx, pero prefiero favorecer el código abierto y multiplataforma si posible, uso codeblocks y mingw XD.

Bueno... Que tengas suerte. Si necesitas algo y puedo ayudar... ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar