Punteros ** y *** en C. ¿Para que sirven?

Iniciado por Agente Naranja, 16 Septiembre 2007, 16:09 PM

0 Miembros y 1 Visitante están viendo este tema.

Agente Naranja

Hola, leyendo un libro de programación en C, en la parte de punteros, me ponen una pregunta así:

¿Cual debe ser el tipo de var1, var2, var3?
 
    var1 = 5.5;
    var2 = &var1;
    *var3 = var2;
    *var2 = var1 + **var3;


Luego, var1 se ve que es float, var2 es un pointer, pero llegados a var3 me confundí un poco.
*var3=var2 quiere decir, que el valor al que apunta la dirección en memoria almacenada en var3 es igual a var2, o sea a otra dirección en memoria. Lo cual, como leí, hace que var3 sea un float **var3.

Entonces, ¿cual es la utilidad de estos "apuntadores a apuntadores"??  Además, he visto otros como ***Ptr, todavía peor. ¿Cuál puede ser la utilidad de estas variables?

Gracias.

Nanocity

Pues la principal aplicación de los apuntadores dobles (**int) es por ejemplo hacer matrices dinámicas, osea tener un vector de vectores (o array de array's), luego también para modificar un puntero en función lo tienes que pasar por referencia asique tambiém necesitarás un puntero doble.

En principio no se me ocurren más aplicaciones pero vamos... en cuanto al ejercicio del libro de C, la verdad esque no entiendo muy bien para que ponen ese tipo de ejemplos (sí, entiendes como referirte al contenido de un puntero, etc) que no reflejan un uso muy práctico de los punteros pero vaya...

Un saludo.
Eran nueve, nueve bajo las tres lunas,
bajo la luz del atardecer de otoño.
Mientras el mundo caía, ellos se alzaban
hacia el corazon de la historia

EvilGoblin

Es como te dijeron... un puntero con (**) estamos hablando de un puntero de dos dimensiones.. (arrays) var3 seria algo asi float var3[]

mayormente no tiene mucha logica hacer un puntero a un puntero... pero la unica utilidad que le veo es digamos una Agenda no sabes la cantidad de contactos que vas a tener

si haces nombre[100][20] quizas sea poco.. .o quizas mucho.... no sabrias cuantos espacio de memoria resevar

pero si haces

**nombre

y luego le das el tamaño que quieras con malloc y lo amplias con realloc cada vez que vas a añadir un nuevo contacto.. nunca tendrias problemas de quedarte sin espacio en memoria y te asegurarias de usar solo lo justo que necesitas...

=)

Suerte ^^
Experimental Serial Lain [Linux User]

theinzide

#3
un puntero toma la direccion de memoria de una variable, mientras que un doble puntero toma la direccion de memoria de un puntero y los triple punteros apuntan a la direccion de un doble puntero

int a = 1;

int *p1 = &a;

int *p2 = p1;

int **p3 = &p2;

int ***p4 = &p3;

entonces p1 y p2 tendria la direccion de a, mientras que p3 tendria la direccion de p2 y p4 tendria la direccion de p3.