No puedo comprender los punteros (&,*)
por mas que leo y leo no entiendo claro como son.
Alguien podria darme una breve explicacion facil de entender?

Segun entiendo el (&) encuentra la direccion y (*) agarra el valor?
gracias
| |||
Enrredada con Punteros Hola, No puedo comprender los punteros (&,*) por mas que leo y leo no entiendo claro como son. Alguien podria darme una breve explicacion facil de entender? ![]() Segun entiendo el (&) encuentra la direccion y (*) agarra el valor? gracias |
| |||
Hola que tal, con respecto a los punteros, el * es un puntero que apunta a una direccion de memoria y el & se usa para pasar las cosas por referencia, o mas bien para modificar el contenido de esa direccion de memoria. Por ejemplo, no se si conoces las listas, bueno cuando vas creano una lista, declaras un puntero que va a apuntar a una direccion de memoria, y a otra y a otra segun cuantos elementos tengas en la lista, ahora bien, si tuvieras que hacer un recorrido, y modificar en el camino algun elemento de esa lista ya sea actualizarlo o eliminarlo, entonces tendras que usar el puntero de esta forma *&nombre permitiendo en este caso modificar la direccion de memoria y el contenido. Basicamente, tene en cuenta esto: El puntero * lo usas para apuntar a una direccion de memoria y lo usas de solo lectura. El puntero & lo usas para modificar los contenidos en la memoria, elminar registros, etc. Bueno espero que mas o menos te haya servido la explicacion y si alguien puede colaborar con esto les agradeceria, ya que es un tema muy importante y que tiene que ser bien asimilado para lograr buenos programas y hacer lo que uno quiera con esta herramienta que es tan potente. Si me llegase a haber confundido por favor corrijanme. Por lo menos eso es lo que vimos en la facultad la semana pasada. Un abrazo ![]() ![]() ![]()
__________________ Nada es imposible, con un poco de esfuerzo se logran las cosas.- |
| |||
Me olvidaba, mirá esta página tiene curso sobre C++ y sobre las Apis para programar para windows. Esta bastante bueno con ejemplos y codigos fuentes para bajar. http://c.conclase.net
__________________ Nada es imposible, con un poco de esfuerzo se logran las cosas.- |
| |||
Gracias. Desde que puse el tema asta esta hora he estado estudiando los punteros, con lo que me dices y con lo que he visto llego a esta conclusión: cada variable tiene un domicilio en la memoria, entonces los punteros hacienden a ese domicilio y pueden cambiar el valor que hay en esa variable. Ejemplo que me hice como de primaria jeje Si Variable de nombre “a” vive en la casa numero 16 (dirección de memoria) y La variable “b” vive en la casa 18 entonces continuamos así: declarando dos punteros int *pun, * pun1 Hora usamos el puntero para darle valor a variable a y b (claro que si lla tienen valor pues ya nimodo) pun = &a // ahora pun tiene el domicilio de "a" (casa numero 16) *pun = 3 // ahora "a" vale 3 pun1 = &b // ahora pun1 tiene el domicilio de "b" (casa 18) *pun1 = 5 // ahora "b" vale 5 Hora modificamos cosillas Pun = pun1 // creo que aquí pun toma el domicilio de "b" (me equivoco?) Ya me confundi jeje al rato en la noche modifico y agrego cosas. Bueno el caso es que voy comprendiendo un poco, y con lo de la lista que me dices ya me da mas sentido para que usarlos, por que yo creo que no es lo mismo aprender una formula a saber en que usarla. Eso me pasa mucho en programación. Gracias de nuevo y corríjanme en lo que puse porfa Última edición por coco129; 23/10/2004 a las 18:37 |
| ||||
Hay que tratar de ser un poco más riguroso con el lenguaje pues nos puede llevar a confusión. Veamos: Los punteros SON VARIABLES que almacenan direcciones de memoria al tipo de dato especificado. int *puntero; En una variable tipo "puntero a entero" El símbolo & es el OPERADOR MONÁDICO, que devuelve la dirección de memoria de una variable (la que sea). El simbolo * es el OPERADOR DE INDIRECCIÓN que devuelve el contenido de una variable apuntada por un apuntador. Es decir, siguiendo con el código anterior, si yo escribo: puntero = &a; La variable puntero almacena la dirección de la variable a. Ahora: b = *puntero; La variable b toma el valor de la variable a la que apunta puntero. *puntero = b; La variable a la que apunta puntero toma el valor de b. puntero1 = puntero2; Ya que los punteros son variables y almacenan direcciones, la instrucción anterior copiará el contenido de puntero2 a puntero1. (La dirección que almacena puntero2 también la almacenará puntero1) El siguiente código utiliza un puntero a puntero: #include <stdio.h> int main() { int a, *puntero, **puntero_a_puntero; a = 10; //a toma el valor de 10 puntero = &a; //puntero toma la dirección de a puntero_a_puntero = &puntero; //puntero_a_puntero toma la dirección de puntero //Se imprime el contenido de lo que apunta aquello a lo que apunta puntero_a_puntero printf("El valor de a es: %d", **puntero_a_puntero); getchar(); return(0); }
__________________ Mi pequeño espacio en la web: VisiónE "El cosmos es todo lo que es, todo lo que fue, y todo lo que será alguna vez." Última edición por KnowDemon; 23/10/2004 a las 20:25 |
| |||
Tnx KnowDemon compile el ejemplo e imprime 10 Ya comprendo mas de el tema, pero tengo una preocupacion y seria como usarlos en que ocaciones etc No tendrias un ejersicio o algun ejemplo para asi comprender mas afondo Creo que para continuar con el manual y pasar a Vectores, etc tengo que comprender bien punteros verdad Bueno gracias pues, ya la llevo adelante |
| |||
No, para nada, no esta aburrido al contrario muy interesante lo que has puesto, y muchas gracias por tomarte el tiempo de ponerlo. ![]() Con lo que me has dado creo que tengo material para el día de hoy y estudiar al respecto, algo que me dijeron mucho amigos estudiantes es que no me preocupara de direcciones de memoria ni de números en hex... pero ahora veo que están equivocados pues si es necesario para poder comprender bien el tema. Gracias de nuevo y mañana te digo que no comprendí, necesito revisarlo bien para asimilar correcta mente. (ya tengo días con pesadillas por los punteros ![]() ![]() |
| ||||
¿Recuerdas que dijimos que el apuntador almacena la dirección de una variable? Haré una correción y diré simplemente que almacena una dirección. ¿Por qué?, por que puede almacenar una dirección que no pertenezca a ninguna variable. Los punteros son ideales para la asignación dinámica de memoria. En tiempo de ejecución puedes "crear" y "destruir" variables. En C puedes hacer algo como esto: #include <stdio.h> #include <stdlib.h> int main() { int *dinamic; //Declaro un apuntador a entero //Reservo un espacio de memoria del tamaño de un entero, si se consigue, //dinamic apuntara a dicha dirección de memoria: dinamic = (int *)malloc(sizeof(int)); *dinamic = 99; //Asigno a ese espacio de memoria el valor de 99 printf("El valor de lo que apunta dinamic es: %d", *dinamic); //Lo imprimo free(dinamic); //Libero la memoria previamente reservada getchar(); return(0); } Aquí puedes encontrar un sencillo manual de C que habla de apuntadores, estructuras dinámicas, etc:
__________________ Mi pequeño espacio en la web: VisiónE "El cosmos es todo lo que es, todo lo que fue, y todo lo que será alguna vez." Última edición por KnowDemon; 25/10/2004 a las 01:48 |
| ||||
Coco129 Puse los valores en hexadecimal, por mero hábito. No es realmente necesario, pero, es más fácil escribir un hexadecimal, que intentar colocar su representación decimal cuando estamos hablando de memoria y punteros. En, fin, si puedo ayudarte con algo más... Hasta luego. |