¡Muchas gracias por todo! Lo has explicado muy bien y de paso, ahora
entiendo por qué existen los ** XD

Probaré DDD, a ver que tal se me da.

Saludos.

El 22 de abril de 2012 21:37, Miguel Angel
<[email protected]>escribió:

> Tienes que diferenciar entre la posición de memoria en la que se almacenan
> las variables y la dirección a la que apuntan. De esta manera, la posición
> de memoria en la que se encuentra "p" contiene, exactamente, la posición de
> memoria de "*p".
>
> Y debería aplicarme el cuento, ya que me equivoqué :D
>
> Cuando usas "*p = *j" estás diciendo: allí donde apunta p, guarda lo que
> apunta j". Pero como una imagen vale más que mil palabras, te mando la
> imagen (punteros.png).
>
> Te invito a que tú también utilices DDD. Es un poco raro al principio, ya
> que no se ha actualizado en casi 10 años, pero puedo asegurarte que no he
> visto un depurador mejor (ni .Net, Java ni leches).
>
> Como ves, cuando hago el "*k = *j" tengo un segmentation fault, ya que
> estoy haciendo una burrada :D
>
> El código es el siguiente:
>
> int main()
> {
>   int value = 5;
>
>   int* a;
>   int* b;
>
>   int* j;
>   int* k;
>
>   a = &value;
>   b = a;
>
>   j = &value;
>   *k = *j;
>
>
>   return 0;
> }
>
>
> Sin embargo, con este código sí que sería válido:
>
> int main()
> {
>   int value = 5;
>
>   int* a;
>   int* b;
>
>   int** j;
>   int** k;
>
>   a = &value;
>
>   j = &a;
>   k = &b;
>   *k = *j;
>
>   return 0;
> }
>
>
> Como verás, puedo hacer "*k = *j" porque ambos son punteros a punteros
> (punteros2.png).
>
> En fin... espero haberlo explicado bien (ahora sí) :D
>
> Un saludo!
>
> El 22 de abril de 2012 20:39, Dani <[email protected]> escribió:
>
> Gracias Miguel Ángel por haberte tomado el tiempo de explicármelo.
>>
>> Pero solo tengo una pregunta más, cuando dices:
>>
>> *Cuando igualas punteros, sólo estás haciendo que ambas variables
>> apunten a la misma posición de memoria.*
>>
>> ¿Eso no ocurre si, por ejemplo, hago p=j;? Hasta ahora, creía que cuando
>> se hacía la operación *p=*j, imaginando que son enteros, ¿no se crea una
>> nueva posición de memoria? Es decir, que si modifico j, no cambiaría el
>> valor de p;
>>
>> Saludos.
>>
>> El 22 de abril de 2012 19:10, Miguel Angel 
>> <[email protected]>escribió:
>>
>> Hola!!
>>>
>>> Para entenderlo bien, lo suyo es que comprendas cómo funciona un puntero.
>>>
>>> Básicamente, cuando tienes un puntero que apunta a una estructura, estás
>>> guardando datos en dos sitios: por una parte, el puntero es una dirección
>>> de memoria, que se guardará en el Heap; por otro, la estructura estará
>>> almacenada en la posición de memoria, en el Stack.
>>>
>>> Cuando igualas punteros, sólo estás haciendo que ambas variables apunten
>>> a la misma posición de memoria. En este caso tenemos tres zonas de memoria:
>>> el puntero inicial y el segundo, que se encontrarán en el Heap, y la propia
>>> estructura, que estará en el Stack.
>>>
>>> Cuando utilizas memcpy, lo que estás haciendo es realizar una copia de
>>> la posición de memoria (el Stack) en otro sitio(también en el Stack). Ten
>>> cuidado, porque memcpy no reservará esa memoria.
>>>
>>> Si comprendes la diferencia entre el Heap y el Stack, todo es más
>>> sencillo. Cuando haces:
>>>
>>>    - int i;
>>>    - void* pointer;
>>>
>>> etc, estás reservando memoria en el Heap. Ésta es volátil y la suele
>>> gestionar el propio compilador.
>>>
>>> Cuando utilizas las funciones *alloc (Malloc, Alloc, Calloc, Strdup,
>>> ...) estás usando el Stack, y eres tú el encargado de gestionar su
>>> liberación.
>>>
>>> Por eso, cuando usas: "*p = *j", estás utilizando sólo el Heap. Cuando
>>> usas "strcpy", estás leyendo y escribiendo en el Stack.
>>>
>>> Pintándolo:
>>> http://video.google.com/videoplay?docid=-3462836456663764635&q=Pointer+C
>>> Diferencias entre el Heap y el Stack:
>>> http://wiki.answers.com/Q/What_is_difference_between_heap_memory_and_stack_memory
>>>
>>> Espero haberme explicado. Un saludo!!
>>>
>>> El 22 de abril de 2012 17:43, Dani <[email protected]> escribió:
>>>
>>>> ¡Buenas a todos!
>>>>
>>>> Pues simplemente quería preguntaros cual es la diferencia entre las
>>>> siguientes sentencias, siendo variables definidas por una estructura g, en
>>>> C:
>>>>
>>>> *p=*j;
>>>> memcpy(p, j  , sizeof(struct q));
>>>>
>>>> Espero que alguien me pueda sacar de la duda.
>>>> Gracias.
>>>>
>>>> _______________________________________________
>>>> CRySoL mailing list
>>>> http://crysol.org/
>>>> https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol
>>>>
>>>>
>>>
>>>
>>> --
>>> Miguel Ángel García Martínez
>>> http://www.magmax.org
>>> Mail <[email protected]> | Twitter<http://twitter.com/#magmax9>
>>>  | LinkedIn <http://www.linkedin.com/in/miguelangelgarciamartinez> |
>>> about.me <http://about.me/miguelangelgarcia>
>>>
>>>
>>
>
>
> --
> Miguel Ángel García Martínez
> http://www.magmax.org
> Mail <[email protected]> | Twitter<http://twitter.com/#magmax9>
>  | LinkedIn <http://www.linkedin.com/in/miguelangelgarciamartinez> |
> about.me <http://about.me/miguelangelgarcia>
>
>
_______________________________________________
CRySoL mailing list
http://crysol.org/
https://arco.esi.uclm.es/cgi-bin/mailman/listinfo/crysol

Responder a