Título: Punteros dobles / Punteros a puntero. Publicado por: NOB2014 en 13 Abril 2016, 02:58 am Hola, a todos.
Desearía que alguien me ayude a entender la utilidad práctica de los punteros dobles, entiendo que una variable puntero apunta a la dirección de memoria donde está alojada una variable del mismo tipo, o sea su valor es la dirección de memoria de una variable común.- Un puntero doble apunta a otro puntero, si bien mi descripción no es para escribir un libro pero es lo que hay.- Por ahí leí que los punteros dobles se asemejan a los array de 2 dimensiones, es esto cierto y porque?.- El manual con el que estoy estudiando punteros pone este ejemplo pero no tengo claro el beneficio en utilizar punteros dobles, el autor en este caso no da demasiadas explicaciones sobre el tema, no me cabe dudas que más adelante profundizara sobre el particular pero me gustaría aprenderlo de Uds. El libro tiene más de 200 páginas dedicadas exclusivamente a punteros y de paso está en inglés.- Código
Bueno es todo por el momento y desde ya muchas gracias.- Daniel Título: Re: Punteros dobles / Punteros a puntero. Publicado por: AlbertoBSD en 13 Abril 2016, 07:10 am Un beneficio de utilizar dobles puntero dependiendo de lo que vallas a hacer con tu programa es hacer mejor uso de memoria dinamica.
Hace unos dias participe en el siguiente tema Re: Sistema de cifrado por lote de texto plano (https://foro.elhacker.net/criptografia/sistema_de_cifrado_por_lote_de_texto_plano-t450183.0.html;msg2064059#msg2064059) Deje el codigo y utliza dobles punteros para almacenar unas listas de longitud dinámica cada lista. El detalle que si los usas mal y/o no asginas y/o liberas memoria incorrectamente terminaras haciendo un completo desmadre y posiblemente el programa termine colgándose. Imaginate esto, quieres hacer un programa que almacene las calificaciones de todos los alumnos de una escuela para despues hacer cualquier otro proceso con ellos. Código
Estamos de acuerdo que la instrucción anterior solo "reserva" en la pila un espacio para guardar un apuntador. Código
Mientras tanto en la pila se muestra asi (Uso 4 bytes para los int, y para los apuntadores asumo que estamos en un sistema x86): Pila: Código: [4 bytes variable calificaciones] << === Un apuntador doble Asignamos memoria para nuestra variable calificaciones Asumimos que son 30 salones, incluso se podria ser variable menos salones o mas salones incluso mil o un millon suponiendo que hay memoria suficiente no sera problema reservarla. Código Como mencione si el apuntador es de 4 bytes, se nos devolvera una direccion de memoria de longitud 30x4 bytes y como es la funcion calloc la memoria esta limpia esto es los 120 bytes estaran en 0 cada uno. calificaciones => [Bloque de 120 continuos] ahora bien la variable calificaciones apunta a un espacio en memoria de 120 bytes donde podemos guardar lo que queramos, pero siguiendo con el ejemplo de apuntadores damos por hecho que cada 4 bytes es un apuntador a otra direccion de memoria (Actualmente no apuntan a ningun lugar ya que no hemos inicializado esos 30 apuntadores). Como es un ejemplo didactico supondre que alumnosXsalon ya esta inicializado y es un arreglo 30 de enteros y cada uno indica la cantidad de alumnos en cada salon por ejemplo alumnosXsalon = {20, 30, 10 , 24, 12, 3, 8, 18 , .....} Ahora vamos a inicializar esos 30 apuntadores: Código
Con esto logramos reservamos la memoria para todas las calificaciones. calificaciones ==>> [120 bytes, cada 4 bytes es un apuntador a otra segmento de memoria] o ma claro aun calificaciones => [[1ros apuntador => 20 enteros],[2do apuntador => 30 enteros], .... ] Y ahora solo queria escribir las cientos de calificaciones en sus respectivos espacios asignados Para entenderlo mejor ha que aprender a depurar un poco el código y mostrar las direcciones de memoria sus valores antes y depues asi como a donde estan apuntando. Si dominas esto entenderas muy bien los apuntadores lo cual es una de las mejores caracteristicas del lenguaje C Ejemplo comentado: Código
Salida Código: i esta en 0xbfbfe834: [0] Respondiendo tus preguntas: Por ahí leí que los punteros dobles se asemejan a los array de 2 dimensiones, es esto cierto y porque?. No del todo, depende de como se usen. Si declaras un array de 2 dimenciones por ejemplo 15x10 es y sera siempre de 15x10. En cambio si apuntador lo declaras de 15 x 10 es en ese momento de 15x10 y se podria quedar asi o modificarse, liberar la memoria asginar algunos elementos (digamos los primeros 5) a una longitud de solo 7 por ejemplo. Si se asemejan paro para fines didacticos pero los apuntadores son mejores. Ve el ejemplo anterior tengo un apuntador dinamico de 30 apuntadores apuntado a 1, 2, 3, 4, .. respectivamente, Título: Re: Punteros dobles / Punteros a puntero. Publicado por: NOB2014 en 13 Abril 2016, 14:01 pm Mi nivel de aprendizaje no me da todavía para siquiera intentar hacerte preguntas por lo que no entiendo, igual muchas gracias por tu tiempo.-
Daniel Título: Re: Punteros dobles / Punteros a puntero. Publicado por: AlbertoBSD en 13 Abril 2016, 14:45 pm Buen dia.
Entiendo lo que dices, en su momento yo tambien no entendia los apuntadores pero como lo mencione es una de las mejores caracteristicas del lenguaje. Asumi erroneamente por tu pregunta (Dobles apuntadores) que ya sabias lo que es un apunador. Un apuntador independientemente del tipo de variable que sea, es una variable que apunta a una direccion de memoria. Título: Re: Punteros dobles / Punteros a puntero. Publicado por: NOB2014 en 13 Abril 2016, 15:00 pm Citar Asumi erroneamente por tu pregunta (Dobles apuntadores) que ya sabias lo que es un apunador. Citar entiendo que una variable puntero apunta a la dirección de memoria donde está alojada una variable del mismo tipo, o sea su valor es la dirección de memoria de una variable común.- Título: Re: Punteros dobles / Punteros a puntero. Publicado por: MAFUS en 13 Abril 2016, 16:00 pm Apuntar a un puntero parece una redundancia pero tiene sus usos:
1. Construcción de una tabla de forma dinámica: Para un compilador que no implemente el estándar C99 o superior la única forma de obtener una tabla de MxN de la que las dimensiones no se conocen en tiempo de programación (a partir de ahora en tiempo de compilación) es usando punteros e instrucciones alloc. Ejemplo: Código
2. Construcción de una tabla de diente de sierra. Es parecido al anterior pero con la ventaja de que se gasta menos memoria. Si, por ejemplo, se necesita una tabla de la siguiente forma: 123456 123 1 123456 123 Se puede generar de la siguiente manera: Código
3. Cambiar la dirección a la que apunta un puntero e una función externa Tenemos un dato definido por nosotros, por ejemplo una lista, y decidimos que tenga una funcinalidad, una función, que borre un nodo y deje ese puntero del nodo NULL para no tener problemas extraños si más adelante se referenciara ese nodo borrado: al ser NULL se pararía el programa y se lanzaría un mensaje de error, con lo que nos ayudaría con la depuración. La función sería así: Código
Hay más funcionalidades para punteros a punteros, pero estas son las más comunes. Ya las irás viendo a medida que avances con C. |