[Tutorial C] IV.1 - Punteros
Página 1 de 1.
[Tutorial C] IV.1 - Punteros
Punteros
Un puntero, es una dirección a la memoria, "apunta" a la memoria. Normalmente, contienen la dirección a una o varias variables. Los punteros, contienen la dirección en la memoria como un número entero. Los punteros tienen nombre, contenido y dirección; la diferencia con las variables, es que aquí no es una referencia para el compilador, sino una referencia real.
Se declaran, y luego se usan. Para declarlas se hace como las variables, pero añadiendo un * en el tipo, uno o varios, pero eso ya lo veremos. Un ejemplo:
Un ejemplo más claro es este:
Un ejemplo más concreto para quien quiera debanarse los sesos.
Un puntero, es una dirección a la memoria, "apunta" a la memoria. Normalmente, contienen la dirección a una o varias variables. Los punteros, contienen la dirección en la memoria como un número entero. Los punteros tienen nombre, contenido y dirección; la diferencia con las variables, es que aquí no es una referencia para el compilador, sino una referencia real.
Se declaran, y luego se usan. Para declarlas se hace como las variables, pero añadiendo un * en el tipo, uno o varios, pero eso ya lo veremos. Un ejemplo:
- Código:
int x;
int* px = &x;
*px = 5;
Un ejemplo más claro es este:
- Código:
int x = 5;
float f = 0.2f;
int* px = &x;
float *pf = &f;
printf("x es %i, px apunta a %i, px es %i\n",x,*px,px);
printf("f es %f, pf apunta a %f, pf es %i",f,*pf,pf);
Un ejemplo más concreto para quien quiera debanarse los sesos.
- Spoiler:
- Código:
#include <stdio.h>
int i = 5;
int *p = &i;
int main()
{
int e = 3;
void second(int *q);
void third(int *r);
void fiveth();
void sixth();
printf("%i",*p);
second(&i);
third(&*p);
printf("%i",i);
fiveth();
sixth(e);
printf("%i", e);
return 0;
}
void second(int *q)
{
void fourth(int *s);
fourth(&*q);
printf("%i", *q);
}
void third(int *r)
{
printf("%i", *r);
}
void fourth(int *s)
{
printf("%i", *s);
*s = 7;
printf("%i", *s);
}
void fiveth()
{
i--;
printf("%i", i);
}
void sixth(int var_e)
{
var_e--;
printf("%i", var_e);
}
Iré número por número para que se entienda:
5 - printf("%i",*p); - *p apunta a la variable i, como se declara antes de main()
5 - yendo a la función second(&i), haciendo que int *p (un puntero) apunte a i (&i); tras eso se hace la función fourth(&*q) en la que se apunta a un puntero (si, se puede hacer punteros de punteros) entonces, el puntero *s apunta a *q, y *q a su vez apunta a i. Por eso al hacer - printf("%i", *s); - se imprime 5 de nuevo, por que al fin y al cabo es i lo que se imprime de nuevo.
7 - el puntero de *q y con ello de i, es *s, entonces si decimos *s = 7, es como poner i = 7, ¿por qué no poner i = 7?, lo explico al final... El caso es que al cambiar y poner de nuevo printf("%i", *s); pues imprime 7.
7 - printf("%i", *q); - un printf sin mucho misterio comparado con el anterior, impresión de puntero *q de i.
7 - la siguiente funcion que se ejecuta es third(&*p), pues el int *r se convierte en apuntador de apuntador, y como i ahora es 7, pues al imprimir *r, imprime *p, que es i, o sea 7. Esto sirve para demostrar como se usan punteros antes declarados.
7 - printf("%i",i); - un printf normal de i, saliendo 7
6 - con la funcion fiveth() que solo contiene código, resta 1 a i (i--) dando i = 6, entonces al mandar imprimir, ahora imprimirá 6. Ahora i pasa a valer 6, porque como es variable global (declarada antes de main) cualquier función puede cambiarla, pasemos a un caso nuevo, motivo de los punteros.
2 - en una funcion normal (sixth()), sin punteros, se coge la variable e como var_e dentro de la funcion, se le resta 1 (var_e--), y se imprime printf("%i", var_e); dando 2.
3 - PERO si decimos después en la función main() printf("%i", e); se imprime 3, porque el cambio de "e" a 2 ha sido SOLO para la funcion sixth(). Por eso si queremos usar funciones para muchas variables, y queremos que los cambios se mantengan se usan los PUNTEROS.
Temas similares
» [Tutorial] II.4 - glutKeyboardFunc()
» [Tutorial C] IV.3 - Estructuras
» [Tutorial C++] III.1 - Funciones
» [Tutorial C++] I - "HelloWorld++"
» [Tutorial C] V - Preprocesado
» [Tutorial C] IV.3 - Estructuras
» [Tutorial C++] III.1 - Funciones
» [Tutorial C++] I - "HelloWorld++"
» [Tutorial C] V - Preprocesado
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|