Ver Mensaje Individual
  #9 (permalink)  
Antiguo 18/05/2005, 19:07
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Problema: ¿Que son los punteros para que sirven?
Variante: Funciona con todas, pero es la manera tradicional en C
Solucion:

Los punteros o apuntadores son variables que en vez de contener un valor comun como 345, 'h' o 4.56 tienen una dirección de una localidad de memoria.
Los punteros pueden ser de distintos tipos, de hecho pueden ser tantos como tipos de variables.

Algunos ejemplos de punteros y sus modo de uso son:


int *puntero;
Puntero que que va a contener la direccion de un dato tipo int.

MI_ESTRUCTURA *puntero2;
Puntero que va a contener la direccion de memoria de un dato tipo MI_ESTRUCTURA

*puntero=10;

Si puntero contiene una direccion valida, el 10 se guardara en esta dirección. Si no, el valor 10 se guardara en una direccion desconocida y podria causar problemas.

puntero=10;

Esto hace que el puntero apunte a la direccion 10(no es muy recomendable hacer eso).

puntero=&variable;

Apunta a la direccion donde se almacena la variable.

& En caso de punteros es el operador de referencia. Es para hacer referencia a una localidad de memoria.
* Es el operador de dereferencia, que es para obtener el valor de de una localidad de memoria.

Es muy importante saber manejar los punteros con precaucion. El mal uso de un puntero puede llevar a efectos secundarios muy dificiles de depurar.
Para empezar siempre hay que tener en mente que un puntero sin inicializar es un peligro andante.... bueno, no tanto asi, pero siempre es mejor tenerlos bien inicializados.

Hay varios tipos de inicializacion:

int *puntero;

1- puntero=NULL;
Esto, pone tu puntero a un valor nulo que puede ser -1(0xFFFFFFFF) ó 0, depende del compilador. Con esto, es mas facil que el compilador te avise si estas usando un puntero con una localidad de memoria no valida.

2- puntero=&variable;
Esto le da a puntero una direccion de memoria valida y la memoria es donde variable esta almacenada.

3-puntero=arreglo;
Esto hace que el puntero contenga la direccion del primer elemento del arreglo.

4-puntero=&arreglo[0];
Es equivalente al 3.

5-puntero=malloc(4); ó puntero=new int[1];
Esto le da a puntero una direccion de memoria valida lista para usarse en el programa.

6-puntero=0xFFFF0000;
Esto es EXTREMADAMENTE PELIGROSO. No deberia usarse asi un puntero almenos que de plano sepas muy bien lo que estas haciendo. Si conoces muy bien el mapa de memoria de tu CPU y quieres hacer cosas medio raras con el sistema operativo puedes intentarlo, pero para esto hay mejores opciones y mucho mas seguras.

NUNCA hay que olvidar que si usamos malloc() o new, siempre debemos avisarle a nuestro sistema operativo que la memoria que nos prestó, ya la terminamos de usar. Para esto usamos free o delete en C y en C++ respectivamente.

free(puntero);
delete puntero;

Asi de facil.

Para que sirven?

Los punteros son la parte mas poderosa del lenguaje C, es lo que hace a este lenguaje tan rico y con infinidad de posibilidades a diferencia de otros lenguajes.
Sus usos mas comunes los puedes encontrar en la libreria estantar. Por ejemplo:

printf(char *text, ...);

Como veras printf resive punteros. Esto es para poder pasarle texto de cualquier extension. Si no pidiera punteros, entonces la funcion estaria limitada a un numero especifico de caracteres por llamada, lo cual obviamente no es muy eficiente.

Otro ejemplo tipico son las listas, colas, pilas, etc. dinamicas.

Gracias a los punteros, podemos ampliar nuestra memoria en un programa.
En vez de usar

char variable[64];

que tiene limite y que podemos llegar a este provocando un desbordamiento de memoria, podemos usar memoria dinamica con punteros.

char *variable.

despues, almacenamos memoria segun nuestras necesidades.

variable=(char *)malloc(sizeof(char)*cuantas_necesite);

Y los usos mas importantes es el paso de valor por referencia. Esto es, que dentro de una funcion podamos modificar por medio de punteros variables fuera de esa funcion. Si en vez de pasar el valor por referencia se pasa por valor, entonces la variable original no cambiria nunca, con referencia si cambia, tal como en printf.

Hay muchas mas utilidades para los punteros.
Una lista hecha por MaxExtreme nos da una idea.

- Representar una dirección de memoria
- Poder operar con ellas
- Pasar, en vez de valores, direcciones a un valor. Esto sirve para:
# No tener que copiar estructuras enteras
# Hacer referencia a variables, funciones, clases, estructuras (...) de fuera que necesiten ser manejadas por la función.
- Poder usar la memoria dinámica (según la necesidad)
- Poder implementar listas, colas, pilas, etc etc
- Poder crear objetos y variables en tiempo de ejecución
- Y muchas cosas más detallistas.

Hay una infinidad de utilidades, pero eso ya depende del programador.

Última edición por Instru; 17/07/2007 a las 01:31