yo aun me lio con algunas cosas de apuntadores, pero a ver si consigo explicarme bien:
primero, en vez de declarar un puntero como
int *a intenta declararlo como
int* a. parece una tonteria, y para el compilador es lo mismo, pero de la segunda manera se ve claramente que
a es una variable de tipo
puntero a int. en cambio de la primera se puede pensar que
*a es un
puntero a int.
segundo, imaginate a la variable tipo
puntero a int como una variable que almacena 2 datos, una direccion de memoria a la que apunta y el valor que hay en esa direccion. si haces un
printf("%d", a), el resultado sera un numero largo que indica la direccion de memoria a la que apunta. en cambio,
*a indica el valor almacenado en esa direccion de memoria.
las diferencias entre, por ejemplo, una variable
int a y una variable
int* b son que:
1. el valor almacenado se saca con:
a y con
*b2. la direccion de memoria donde esta almacenada la propia variable se saca con:
&a y
&b3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con:
bquizas te preguntes entonces que para que sirven los punteros ya que aparentemente hacen lo mismo pero de una manera distinta y mas complicada. pues el principal uso de los punteros es poder gestionar la memoria de manera dinamica (poder asignar y liberar memoria despues de haber compilado). algo que, por ejemplo, te permitiria hacer un programa que preguntase al usuario cuantos datos quiere ingresar y entonces tu podrias usar la memoria justa sin riesgo a usar demasiada ni a quedarte corto.
te dejo un pequeño codigo tipico de aprender apuntadores (da algunos warnings al compilar pero corre perfectamente):
#include <stdio.h>
int main()
{
int a=12, *b;
printf("\nPARA a:\ndireccion propia: &a= %d\nvalor de a: a= %d\n\n", &a
, a
); b=&a; //hacemos que el puntero b apunte a la variable a
printf("PARA b:\napunta a la direccion: b= %d\nel valor almacenado ahi es: *b= %d\ndireccion propia: &b= %d\n\n", b
, *b
, &b
); return 0;
}
su salida:
PARA a:
direccion propia: &a= 1606416780
valor de a: a= 12
PARA b:
apunta a la direccion: b= 1606416780
el valor almacenado ahi es: *b= 12
direccion propia: &b= 1606416768
y ultimo, cuando hagas alguna funcion con parametros tienes que preguntarte si
modificaras el valor de algun parametro. si no te interesa hacerlo, puedes pasar el parametro como una "variable normal" y usarla como tal. si necesitas modificar el valor de la variable, entonces le tienes que pasar a la funcion la direccion de memoria donde esta almacenada la variable, para que asi digamos que pueda escribir sobre ella. y para pasar la direccion de memoria entonces tienes que usar punteros.
ultimo codigo de ejemplo:
#include <stdio.h>
void funcion(int n, int* p);
int main() {
int a=1, b=5;
printf("VARIABLES ANTES DE LA FUNCION:\na= %d\nb= %d\n", a
, b
); funcion(a, &b);
printf("VARIABLES DESPUES DE LA FUNCION:\na= %d\nb= %d\n", a
, b
); return 0;
}
void funcion(int n, int* p) {
// n es una variable de tipo int "normal". n contiene el valor de la variable a. PASO POR VALOR (no se puede modificar)
// p es una variable de tipo puntero a int. p contiende la direccion de memoria de b. PASO POR REFERENCIA (se puede modificar)
printf("VALORES EN LA FUNCION:\nn= %d\n*p= %d\n", n
, *p
); // intentamos modificar las variables
(*p)=3;
n=2;
}
y su salida, donde se ve que 1 variable se ha modificado y la otra no:
VARIABLES ANTES DE LA FUNCION:
a= 1
b= 5
VALORES EN LA FUNCION:
n= 1
*p= 5
VARIABLES DESPUES DE LA FUNCION:
a= 1
b= 3
espero que sirva de ayuda... si tienes alguna duda no tienes mas que consultar. un saludo!