• Lunes 18 de Noviembre de 2024, 10:52

Autor Tema:  Puntero A Punteros  (Leído 8621 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Puntero A Punteros
« en: Jueves 29 de Marzo de 2007, 21:32 »
0
Hola, tengo una duda con el tema que no puedo lograr entender.

Por ej en este cidigo:

Código: Text
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include<stdlib.h>
  4.  
  5.  
  6. int main()
  7. {
  8.   char **cpp;
  9.   char *cp;
  10.   char c = 'a';
  11.  
  12.   cp = &c;
  13.  
  14.   cpp = &cp;
  15.  
  16.   printf("%c\n", c);
  17.   printf("%x\n", &c);
  18.  
  19.   printf("%p\n", &cpp); // que diferencia hay entre esta linea y
  20.   printf("%p\n", cpp);   //  esta
  21.  
  22.  
  23.   return 0;
  24. }
  25.  
  26.  

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #1 en: Jueves 29 de Marzo de 2007, 21:37 »
0
:P  :P  :P  :P


En una retornas el valor de cpp y en otra lo que contiene la direccion de cpp
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #2 en: Jueves 29 de Marzo de 2007, 21:40 »
0
Cita de: "Bicholey"
:P  :P  :P  :P


En una retornas el valor de cpp y en otra lo que contiene la direccion de cpp
o sea, la segunda linea muestra donde apunta el puntero a puntero?

Código: Text
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include<stdlib.h>
  4.  
  5.  
  6. int main()
  7. {
  8.  char **cpp;
  9.  char *cp;
  10.  char c = 'a';
  11.  
  12.  cp = &c;
  13.  
  14.  cpp = &cp;
  15.  
  16.  printf("%c\n", c);
  17.  printf("%x\n", &c);
  18.  
  19.  printf("%p\n", &cpp);
  20.  printf("%p\n", cpp);   //  esta es equivalente a  printf("%x\n", &cp);
  21.  
  22.  return 0;
  23. }
  24.  

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #3 en: Jueves 29 de Marzo de 2007, 21:55 »
0
otra duda es, con este codigo:

Código: Text
  1.  
  2.  float **float_values;
  3.  float_values = (float**)malloc(4 *sizeof(float*));
  4.  

Ahi lo que hace es crear 4 punteros en forma dinamica, no?, y si quiero crear en forma dinamica 4 punteros a punteros?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #4 en: Jueves 29 de Marzo de 2007, 22:02 »
0
Código: Text
  1.   float ***float_values;
  2. float_values = (float***)malloc(4 *sizeof(float**));
  3.  

desde luego los punteros ** estan sin inicializar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #5 en: Jueves 29 de Marzo de 2007, 22:50 »
0
o sea podes almacenar 4 punteros no? con esto?

float **float_values;
float_values = (float**)malloc(4 *sizeof(float*));

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #6 en: Jueves 29 de Marzo de 2007, 22:52 »
0
SI
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #7 en: Jueves 29 de Marzo de 2007, 22:53 »
0
Código: Text
  1.  
  2. printf("%p\n", &cpp); // que diferencia hay entre esta linea y
  3. printf("%p\n", cpp);   //  esta
  4.  
  5.  

La primera obtiene la direccion en memoria de la variable local cpp y la segunda su contenido (el primer puntero por decirlo de alguna manera). Si queres obtener el doble puntero tenes que desreferenciar la variable cpp y eso se hace con el *, eso te daria la direccion de c y con doble ** obtendrias el valor de c.


Cita de: "AnioN"
otra duda es, con este codigo:

Ahi lo que hace es crear 4 punteros en forma dinamica, no?, y si quiero crear en forma dinamica 4 punteros a punteros?
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.

Código: Text
  1.  
  2. float **float_values;
  3. float_values = (float**)malloc(4 *sizeof(float*));
  4. for (int x= 0; x < 4; x++) {  float_values[x] = (float*)malloc(sizeof(float)); }
  5. *float_values[0] = 3.51;
  6. *float_values[1] = 4.62;
  7. *float_values[2] = 5.73;
  8. *float_values[3] = 6.84;
  9. for (int x= 0; x < 4; x++) { printf("%f\r\n", *float_values[x]); }
  10. for (int x= 0; x < 4; x++) {  free(float_values[x]); }
  11. free(float_values);
  12.  
  13.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #8 en: Jueves 29 de Marzo de 2007, 22:53 »
0
Cita de: "JuanK"
SI
entonces la forma que mencionas para crear 4 punteros a punteros es erronea, o me equivoco?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #9 en: Jueves 29 de Marzo de 2007, 23:05 »
0
Cita de: "AnioN"
Cita de: "JuanK"
SI
entonces la forma que mencionas para crear 4 punteros a punteros es erronea, o me equivoco?
que son capaces de apuntar a 4 punteros.

float_values = (float***)malloc(4 *sizeof(float**));

pero sin inicializar, es decir apuntando a cualquier cosa.

Cita de: "Eternal Idol"
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.

Se reserva la memoria nada mas, lo cual, y gracias al cast,  es  un array de punteros sin inicializar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #10 en: Jueves 29 de Marzo de 2007, 23:09 »
0
no te entiendo que es lo que queres decir, podes ser un poco mas claro?. Si me decis que con esto se puedel almacenar 4 punteros entonces son punteros a punteros.

float **float_values;
float_values = (float**)malloc(4 *sizeof(float*));

y que estarias haciendo con esto?
float_values = (float***)malloc(4 *sizeof(float**));

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #11 en: Jueves 29 de Marzo de 2007, 23:13 »
0
Cita de: "JuanK"
float_values = (float***)malloc(4 *sizeof(float**));

Eso es un triple puntero ...

Código: Text
  1.  
  2. float ***float_values = (float***)malloc(4 *sizeof(float**));
  3. float_values[0] = (float**)malloc(sizeof(float) * 56);
  4. float_values[0][54] = (float*)malloc(sizeof(float));
  5. *float_values[0][54] = 3.53;
  6.  
  7.  

Cita de: "JuanK"
Se reserva la memoria nada mas, lo cual, y gracias al cast,  es  un array de punteros sin inicializar.

Tambien se le asigna a la variable local float_values el valor devuelto por malloc, para eso esta el cast sino daria error al no coincidir los tipos en la asignacion.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #12 en: Jueves 29 de Marzo de 2007, 23:20 »
0
Cita de: "AnioN"
y que estarias haciendo con esto?
float_values = (float***)malloc(4 *sizeof(float**));
reservar memoria direccionada por un triple puntero, esa memoria sirve para guardar 4 punteros a punteros.

se lee, un apuntador que apunta a una coleccion de apuntadores a apuntadores.

Código: Text
  1. float **float_values;
  2. float_values = (float**)malloc(4 *sizeof(float*));
  3.  

esto es reservar memoria que se direcciona con un doble puntero, esa memoria sirve para guardar 4 punteros.

se lee, un apuntador que apunta a una coleccion de apuntadores.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #13 en: Jueves 29 de Marzo de 2007, 23:25 »
0
AnioN mira el codigo que te deje y sino mira esto:
http://www.codeproject.com/useritems/pointertopointer.asp
http://www.eskimo.com/~scs/cclass/int/sx8.html

Esto es un puntero: char *
Esto es un puntero a un puntero (doble puntero): char **
Esto es un puntero a un puntero a un puntero (triple puntero): char ***

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #14 en: Jueves 29 de Marzo de 2007, 23:40 »
0
Pues yo no se, pero para mi que estamos hablando de lo mismo:

[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #15 en: Jueves 29 de Marzo de 2007, 23:46 »
0
Por esa casualidad, el tamaño de un puntero y de un puntero a puntero no es el mismo?
Código: Text
  1.  
  2. sizeof(**float) == sizeof(***float)
  3.  
  4.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #16 en: Jueves 29 de Marzo de 2007, 23:49 »
0
Cita de: "JuanK"
Pues yo no se, pero para mi que estamos hablando de lo mismo:

¿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.

Cita de: "Enko"
Por esa casualidad, el tamaño de un puntero y de un puntero a puntero no es el mismo?
Código: Text
  1.  
  2. sizeof(**float) == sizeof(***float)
  3.  
  4.  


Obvio jeje, no es mas que una direccion de memoria, en x86 4 bytes/32 bits y en x86-64 8bytes/64bits.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #17 en: Viernes 30 de Marzo de 2007, 00:06 »
0
Citar
¿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.

pues lo que yo veo es aca:

http://www.codeproject.com/useritems/pointertopointer.asp


usan un doble puntero para acceder a un array de 'dos dimensiones', lo cual es tal cual lo que he dicho

Desde luego que incluso sin necesidad de eso se puede 'emular'  un array bidimensional usando aritmética, pero eso es otra cosa.

Y en esta otra

http://www.eskimo.com/~scs/cclass/int/sx8.html

lo único que dicen de dimensiones es:

Citar
Another good use for pointers to pointers is in dynamically allocated, simulated multidimensional arrays, which we'll discuss in the next chapter.

Independientemente de en que se use

un triple puntero es un puntero a una coleccion de punteros a punteros.

y es muy simple de ver ya que si un ** es un array de 2d un nuevo puntero lo convierte en un array de 3d .

El cual inicialmente se inicia asi:

Código: Text
  1. float_values = (float***)malloc(4 *sizeof(float**));
  2.  

ya luego hay necesidad de iniciar sus miembros 2d  cada uno con:

Código: Text
  1. (float**)malloc(4 *sizeof(float*));
  2.  

etc.


Citar
Por esa casualidad, el tamaño de un puntero y de un puntero a puntero no es el mismo?
CODE

sizeof(**float) == sizeof(***float)

asi es, en el codigo se indica el nivel de indirección solo por razones de legibilidad .


Por cierto el codigo que has colocado tiene los punteros a la izquierda y debe ser a la derecha del tipo.

Citar
sizeof(**float) == sizeof(***float)
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #18 en: Viernes 30 de Marzo de 2007, 00:10 »
0
Como quieras, que yo sepa esto empezo por tu insistencia en la necesidad de usar un triple puntero cuando el codigo de AnioN usaba un doble puntero, segun yo y otras personas para reservar cuatro punteros a puntero no necesitas un triple puntero, ahi deje un ejemplo y en las paginas hay otro. Es todo lo que tengo que decir al respecto.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #19 en: Viernes 30 de Marzo de 2007, 00:25 »
0
Cita de: "AnioN"
otra duda es, con este codigo:

Código: Text
  1.  
  2.  float **float_values;
  3.  float_values = (float**)malloc(4 *sizeof(float*));
  4.  

Ahi lo que hace es crear 4 punteros en forma dinamica, no?, y si quiero crear en forma dinamica 4 punteros a punteros?
mm bueno yo solo estaba contestando a esto.


Citar
segun yo y otras personas para reservar cuatro punteros a puntero no necesitas un triple puntero

Claro que no, eso es solo una forma de hacerlo y permite acceder al contenido como un array de 3 dimensiones. [][][]
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #20 en: Viernes 30 de Marzo de 2007, 01:09 »
0
cada vez entiendo menos, a ver, vamos por partes.

Segun esto:
Código: Text
  1.  
  2.  
  3.           float **float_values;
  4.  
  5.  
  6.  
  7.      //allocate memory for rows
  8.  
  9.      float_values = (float**)malloc(4 *sizeof(float*));
  10.  
  11.  



Con esto se estarian creando 4 punteros?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Puntero A Punteros
« Respuesta #21 en: Viernes 30 de Marzo de 2007, 04:20 »
0
Bingo, se están creando aunque no se ha inicializado.

Para ser mas exactos se ha creado un puntero y se ha reservado memoria para 4 punteros mas, es decir tienes un puntero que puede apuntar a uno de los otros 4 a la vez, que es  lo que he dicho siempre y lo mismo que eternal idol ha dicho.


Cita de: "AnioN"
y si quiero crear en forma dinamica 4 punteros a punteros?

Teniendo en cuenta que estabas preguntando acerca de la forma:
Código: Text
  1.    float_values = (float**)malloc(4 *sizeof(float*));
  2.  

Para crear un cuatro punteros a puntero puedes hacerlo de mucha formas, y sobre todo dependiendo del uso que le quieras dar, pero con base al contexto de tu pregunta lo que debes hacer es lo que te sugiero:

Código: Text
  1. float ***float_values;
  2. float_values = (float***)malloc(4 *sizeof(float**));
  3.  

esto SI te crea lo que tu mencionabas es decir 4 punteros a punteros, y tal como dije antes aun hace falta inicializar las otras dimensiones del array de 3 dimensiones (si lo quieres ver asi).

Esto describe mas gráficamente de lo que estoy hablando y es un ejemplo de lo que se puede hacer:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #22 en: Viernes 30 de Marzo de 2007, 09:26 »
0
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.

Código: Text
  1.  
  2. float **float_values = (float**)malloc(4 *sizeof(float*));
  3. for (int x= 0; x < 4; x++) {  float_values[x] = (float*)malloc(sizeof(float)); }
  4. *float_values[0] = 3.51;
  5. *float_values[1] = 4.62;
  6. *float_values[2] = 5.73;
  7. *float_values[3] = 6.84;
  8. for (int x= 0; x < 4; x++) { printf("%f\r\n", *float_values[x]); }
  9. for (int x= 0; x < 4; x++) {  free(float_values[x]); }
  10. free(float_values);
  11.  
  12.  

Este grafico si representa mi codigo:


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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #23 en: Viernes 30 de Marzo de 2007, 13:38 »
0
Cita de: "Eternal Idol"
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.

Código: Text
  1.  
  2. float **float_value s= float_values = (float**)malloc(4 *sizeof(float*));
  3. for (int x= 0; x < 4; x++) {  float_values[x] = (float*)malloc(sizeof(float)); }
  4. *float_values[0] = 3.51;
  5. *float_values[1] = 4.62;
  6. *float_values[2] = 5.73;
  7. *float_values[3] = 6.84;
  8. for (int x= 0; x < 4; x++) { printf("%f\r\n", *float_values[x]); }
  9. for (int x= 0; x < 4; x++) {  free(float_values[x]); }
  10. free(float_values);
  11.  
  12.  

Este grafico si representa mi codigo:


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.
Código: Text
  1. float **float_value s= float_values = (float**)malloc(4 *sizeof(float*));
  2.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Puntero A Punteros
« Respuesta #24 en: Viernes 30 de Marzo de 2007, 14:14 »
0
Cita de: "AnioN"
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?

Variable tenemos siempre una sola: float_values, a esta le asignamos la direccion de memoria que nos devuelve el primer malloc y cuyo tamaño es de 16 bytes (de memoria contigua):

float_values es igual a DIR0 que al principio es:
DIR0: INDEFINIDO
DIR1: INDEFINIDO
DIR2: INDEFINIDO
DIR3: INDEFINIDO

Entonces hacemos un bucle donde asignamos eso con punteros a otra memoria reservada para cada uno del tamaño necesario.

DIR0: float *
DIR1: float *
DIR2: float *
DIR3: float *

Tenemos entonces que float_values[X] apunta a un float *, es un puntero que apunta a un puntero, no a un valor, es un doble puntero. Por eso para poder obtener el valor tenemos que hacer *float_values
  • . Si hacemos *float_values obtenemos DIR0 (ES UN PUNTERO QUE APUNTA A UN PUNTERO) y si hacemos **float_values obtenemos *DIR0 que en este caso es el float cuyo valor es 3.51, podes verlo asi:
Código: Text
  1.  
  2. float **float_values = (float**)malloc(4 *sizeof(float*));
  3. ZeroMemory(float_values, 4 *sizeof(float*));
  4. printf("%p\r\n", *float_values);
  5. for (int x= 0; x < 4; x++) {  float_values[x] = (float*)malloc(sizeof(float)); }
  6. printf("%p\r\n", *float_values);
  7.  
  8.  

En vez de tener memoria indefinida ahora sabemos que tenemos cuatro punteros nulos al usar ZeroMemory (una simplificacion de memset) sobre toda la memoria. Primero vemos que *float_values (equivalente a float_values[0]) es justamente 0, apunta a 0 y despues es igual a lo que devuelva malloc. Lo mismo pasa con los otras 3 siguientes direcciones de memoria, primero seran punteros nulos y despues punteros a float.

Cita de: "AnioN"
No entiendo que hace la s.

Nada, problemas de copy + paste, ahi lo cambie.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.