Si acabas de iniciarte en punteros, al principio es un poco lioso pero una vez que coges bien el concepto es fácil:
veamos tu cuando declaras una variable de Tipo lo que sea por ejemplo long dato = 0 lo que estas haciendo realmente es reservar una dirección de memoria por ejemplo la direccion AAAAA cuyo contenido la inicializas a un 0
cuando haces long dato = 0 es como si a la dirección de memoria AAAA la llamaras dato y la inicializas a 0.
por otro lado un Puntero lo que hace es apuntar a una dirección de memoria por lo que si haces
long *p_dato ;
p_dato = dato;
lo que haces realmente es que el puntero apunte a la dirección de memoria AAAA cuyo contenido es 0 ahora mismo.
Ahora tu con el puntero puedes modificar el valor de lo que contiene esa dirección de memoria. por lo que si haces
*p_dato = 5;
estas haciendo que la dirección AAAA contenga ahora no un 0 sino un 5
por eso cuando haces un printf de la variable dato( que en realidad es la dirección AAAA) ya no vale 0 sino 5
Espero que esto te ayude a comprender un poco mejor el tema de los punteros
veamos tu cuando declaras una variable de Tipo lo que sea por ejemplo long dato = 0 lo que estas haciendo realmente es reservar una dirección de memoria por ejemplo la direccion AAAAA cuyo contenido la inicializas a un 0
cuando haces long dato = 0 es como si a la dirección de memoria AAAA la llamaras dato y la inicializas a 0.
por otro lado un Puntero lo que hace es apuntar a una dirección de memoria por lo que si haces
long *p_dato ;
p_dato = dato;
lo que haces realmente es que el puntero apunte a la dirección de memoria AAAA cuyo contenido es 0 ahora mismo.
Ahora tu con el puntero puedes modificar el valor de lo que contiene esa dirección de memoria. por lo que si haces
*p_dato = 5;
estas haciendo que la dirección AAAA contenga ahora no un 0 sino un 5
por eso cuando haces un printf de la variable dato( que en realidad es la dirección AAAA) ya no vale 0 sino 5
Espero que esto te ayude a comprender un poco mejor el tema de los punteros