[Tutorial C] IV.1 - Punteros

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial C] IV.1 - Punteros

Mensaje  HarZe el Mar Dic 08, 2009 12:30 am

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:
Código:
int x;
int* px = &x;
*px = 5;
Es como decir directamente que x = 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);
Si aplicas algo al nombre del puntero, estás modificando la dirección. Si pones un asterisco antes del nombre del puntero, entonces editas aquello a lo que apuntas. Si pones que un puntero es igual a & y el nombre de una variable, estás indicando que el puntero es igual a la dirección de x. A través de ese ejemplo, comprobarás la dirección de los datos en la RAM, entre px y pf, que son enteros, debe haber una diferencia de 4, que es la longitud de int y float. Es la prueba de que el espacio previo al segungo, perteneciente al primero, es de verdad el espacio de 4 bytes.

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);
}
La salida de este programa es: 557777623

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.

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.