:P :P :P :Po sea, la segunda linea muestra donde apunta el puntero a puntero?
En una retornas el valor de cpp y en otra lo que contiene la direccion de cpp
otra duda es, con este codigo:No, lo que hace es reservar 16 bytes de memoria y asignarselos a float_values, exactamente asi es como normalmente se hace con dobles punteros.
Ahi lo que hace es crear 4 punteros en forma dinamica, no?, y si quiero crear en forma dinamica 4 punteros a punteros?
SIentonces la forma que mencionas para crear 4 punteros a punteros es erronea, o me equivoco?
que son capaces de apuntar a 4 punteros.Cita de: "JuanK"SIentonces la forma que mencionas para crear 4 punteros a punteros es erronea, o me equivoco?
No, lo que hace es reservar 16 bytes de memoria y asignarselos a float_values, exactamente asi es como normalmente se hace con dobles punteros.
float_values = (float***)malloc(4 *sizeof(float**));
Se reserva la memoria nada mas, lo cual, y gracias al cast, es un array de punteros sin inicializar.
y que estarias haciendo con esto?reservar memoria direccionada por un triple puntero, esa memoria sirve para guardar 4 punteros a punteros.
float_values = (float***)malloc(4 *sizeof(float**));
Pues yo no se, pero para mi que estamos hablando de lo mismo:
Por esa casualidad, el tamaño de un puntero y de un puntero a puntero no es el mismo?Código: Text
sizeof(**float) == sizeof(***float)
¿Vos ves que alguien use triple puntero para esto en algun lado? Esa pagina lo unico que demuestra es que ni siquiera para varias dimensiones se necesita el triple puntero.
Another good use for pointers to pointers is in dynamically allocated, simulated multidimensional arrays, which we'll discuss in the next chapter.
Por esa casualidad, el tamaño de un puntero y de un puntero a puntero no es el mismo?
CODE
sizeof(**float) == sizeof(***float)
sizeof(**float) == sizeof(***float)
otra duda es, con este codigo:mm bueno yo solo estaba contestando a esto.Código: Text
float **float_values; float_values = (float**)malloc(4 *sizeof(float*));
Ahi lo que hace es crear 4 punteros en forma dinamica, no?, y si quiero crear en forma dinamica 4 punteros a punteros?
segun yo y otras personas para reservar cuatro punteros a puntero no necesitas un triple puntero
y si quiero crear en forma dinamica 4 punteros a punteros?
El primer grafico no representa lo que yo le dije que hiciera, te lo dejo con el codigo y tal vez lo entiendas. Hay cuatro direcciones de memoria (punteros float **) reservadas con la primera linea del codigo y estas apuntan a otras cuatro direcciones de memoria (punteros float *) reservadas en un bucle en la segunda linea. Por lo tanto tenemos 4 PUNTEROS (float **) A PUNTEROS (float*) que apuntan a cuatro valores distintos asignados en las lineas siguientes. Posteriormente vemos los valores en pantalla y liberamos primero los cuatro float * y despues los cuatro float **. ¿No es lo que muestra tu grafico, no? Eso es un puntero a puntero, eso es lo que pidio AnioN y lo que vos propones es un PUNTERO, A PUNTERO, A PUNTERO (TRIPLE PUNTERO) que obviamente contiene un PUNTERO A PUNTERO (DOBLE PUNTERO) que es lo que yo propongo. Considero entonces que estas dando una solucion mas compleja que el problema planteado.si es como decis, en la primera linea reservas memoria para los dobles punteros, en el bucle para los punteros pero donde reservas para las variables que apuntan los punteros?Código: Text
float **float_value s= float_values = (float**)malloc(4 *sizeof(float*)); for (int x= 0; x < 4; x++) { float_values[x] = (float*)malloc(sizeof(float)); } *float_values[0] = 3.51; *float_values[1] = 4.62; *float_values[2] = 5.73; *float_values[3] = 6.84; for (int x= 0; x < 4; x++) { printf("%f\r\n", *float_values[x]); } for (int x= 0; x < 4; x++) { free(float_values[x]); } free(float_values);
Este grafico si representa mi codigo:
(http://img256.imageshack.us/img256/8640/4ptrtoptrshy6.th.jpg) (http://img256.imageshack.us/my.php?image=4ptrtoptrshy6.jpg)
Notese que puedo acceder a los datos con dos indirecciones, por algo sera, es un puntero a un puntero. ¿AnioN te parece que lo que vos querias era eso que dice JuanK? JuanK hacenos el favor y mostranos tu codigo completo que sirva para trabajar con 4 punteros a punteros.
si es como decis, en la primera linea reservas memoria para los dobles punteros, en el bucle para los punteros pero donde reservas para las variables que apuntan los punteros?
No entiendo que hace la s.
Hay cuatro direcciones de memoria (punteros float **) reservadas con la primera linea del codigo
y si quiero crear en forma dinámica 4 punteros a punteros?
para nada, eso no es lo que existe ahi.Si yo reservo 16 bytes tengo cuatro direcciones de memoria, aunque no te lo creas y puedo hacer que esas apunten a cuatro nuevas direcciones de memoria que me de malloc y esas direcciones ocupan el tamaño de un float. Por lo tanto son punteros a punteros.
El puntero NO es las 4 posiciones de memoria,
el puntero (float**) esta localizado en una posición memoria X y el contenido en esa posición de memoria es la dirección de la 'primera ' posición de memoria de 4 reservadas.
Si yo reservo 16 bytes tengo cuatro direcciones de memoria, aunque no te lo creas y puedo hacer que esas apunten a cuatro nuevas direcciones de memoria que me de malloc y esas direcciones ocupan el tamaño de un float. Por lo tanto son punteros a punteros.Eso que tu dices es lo siguiente:
pero tu nunca has mostrado que esas 4 apunten a 4 nuevas direcciones de memoria, eso es lo que he mostrado yo.
Lo que tu citas es un puntero a 4 punteros, no 4 punteros a punteros,exactamente es lo mismo que yo entiendo, pero no logro entender a lo que se refiere Eternal Idol.
float f;<- variable (que obviamente es una dirección de memoria donde se contiene el float)
float* fp;<- puntero a float, una variable que contiene una direccion de memoria, de ahi que para 'mover el puntero' se pueda hacer fp++ lo cual es aumentar el valor contenido en uno, o sea desplazarce una posicion en la direccion de memoria apuntada
float** fpp;-> puntero a puntero float, pero es solo un puntero que puede direccionar 4 posiciones de memoria reservadas.
Un reflexion adicional:
si tengoCódigo: Text
char *c; c = (char*)malloc(10);
esta claro que c contiene la direccion de memoria del bloque creado con malloc, pero ese bloque no es un 'bloque de punteros' es un 'bloque de caracteres'.
entoncesCódigo: Text
char** z; z = (char**)malloc(10 * sizeof(char*));
z tiene la dirección de un 'bloque de 10 punteros' , o sea z es un puntero a 'un bloque de 10 punteros'...
estos a su vez pueden apuntar a '10 bloques de caracteres' cada uno.
así que tenemos solo un puntero apuntado 4punteros más.
En conclusión z es puntero a puntero... solo 1 no 10.
Según he tradtado de en entendercreo que si.
el punto de vista de Eternal Idol es que dado que
float p
es una variable y toda variable es una direccion de memoria, el hecho de tener
float f= 2.0f;
float *pf= &f;
implica que pf este apuntando a f y que como f es otra dirección de memoria entonces pf es un puntero a un puntero, cosa que no estoy de acuerdo. <_<