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 *b
2. la direccion de memoria donde esta almacenada la propia variable se saca con: &a y &b
3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con: b
quizas 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):
su salida:
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:
y su salida, donde se ve que 1 variable se ha modificado y la otra no:
espero que sirva de ayuda... si tienes alguna duda no tienes mas que consultar. un saludo!
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 *b
2. la direccion de memoria donde esta almacenada la propia variable se saca con: &a y &b
3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con: b
quizas 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):
Código (c) [Seleccionar]
#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:
CitarPARA 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:
Código (c) [Seleccionar]
#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:
Citar
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!