punteros

cks
27 de Febrero del 2006
hola a todos soy un programador novato y me gustaria saber como realmente se implementan los punteros o sea se que sirven para trabajar cuando no conocemos el volumen de datos pero no me convence ya que esto tambien lo podriamos hacer de otra forma por ejemplo si yo quiero saber el promedio y no se la cantidad de notas a promediar digo que ingrese las notas y luego 0 `para finalizar pongo un contador para saber cuantas notas ingreso y luego declaro un vector con la cantidad de posiciones = contador gracias

hiei
27 de Febrero del 2006
Eso que dices de hacer no se puede... por la forma en que trabaja la maquina... si en otros lenguajes (akam VisualBasic, Java, etc.) se hace es porque, internamente, se implementa con punteros...
Un puntero es solo una variable que indica una pocicion de memoria (en donde supuestamente tienes otra/s variable/s)... o mejor "apunta" a la direccion de memoria donde tienes esa(s) variable(s)

Un arreglo declarado como:
int vector[200];
Es estatico, esto es, tiene una cantidad de memoria asignada por el compilador "en tiempo de compilacion" (cuando se hace el ejecutable, tiempo de ejecucion es cuando ese programa se ejecuta) que no puede ser cambiada ni reasignada...
Hacer:

int n;
scanf( "%d", &n );
int vector[n];

Es IMPOSIBLE para el compilador de C (bien, es posible en C++, pero todavia te dira que hay un error pues no se sabe el valor de n... en tiempo de compilacion) ya que no se conoce "a priori" el valor de n... (n debe ser una constante que el compilador conosca su valor)

Aqui entra la asignacion dinamica de memoria... (que tiene mucho que ver con los sistemas operatibos...
Cuando se esta ejecutando un pograma, no solo este esta en memoria, tambien hay otros (en sistemas multitarea muchisimos, en DOS unos pocos mas llamados programas residentes) junto con el sistema operatibo (DOS, Linux, Windows, MacOS, etc.)
Estos programas tiene datos y codigo desparramados por varias zonas de memoria... y un puntero cuando se crea esta apuntando "a cualquier parte aleatoriamente"... esa parte de la memoria donde esta apuntando puede o no ser usable... pero para usar memoria legalmente se le deve "pedir" al sistema operatibo un sector "que el sepa" que esta para usar... Esta peticion es malloc....

int n;
int *vector; /* Vector, cu7ando se crea apunta a cualquier parte */
scanf( "%d", &n );
vector = malloc( sizeof(int)*n );
...demas...

malloc, recive "el numero de bytes" a asignar, nosotros queremos asignar "n" enteros... pero no savemos cuanto ocupa un entero -bueno, dos bytes, pero no siempre es asi- para eso es sizeof, en este caso devuelbe 2 (n*2 es el numero de bytes que ocupara nuestro vector...)
La funcion malloc, se encargara (de forma misteriosamente oscura para los mortales) de pedirle al sistema operativo "al menos" los bytes que necesita y cuando termine, retornara la pocicion de memoria (el puntero) donde empieza nuestra region recien asignada... esa direccion de memoria sera la que guardemos en el puntero y luego usemos como un arreglo normal (es factible hacer vector[10] para acceder el decimo elemento apuntado por el puntero vector porque, sintacticamente, C/C++ trata los arreglos como punteros "constantes" -es solo una caracteristica-)

Una vez terminado de trabajar con esta region de memoria (normalmente cuando termina el programa) deveriamos (es de buena costumbre...) liberar la meoria. En sistemas operatibos tipo POSIX (UNIX/Linux/*BSD/muy-parcialmente-DOS) el sistema operatibo se encarga de liberar la memoria asignada por el proceso (va, el programa) una vez que termina... En otras cosas como Windows, si no liveras tu la meoria ahi se queda... a la espera de que alguien la libere... pero como no hay nadie que sepa que tiene que liberarla porque el unico programa que la usaba termino... ahi se queda (en realidad Windows sabria bien que nadie mas usa esa memoria y puede liberarla tranquilamente, pero como es MUY cutre... no lo hace...)

Para liberar la memoria, se le deve pasar el puntero que nos debolbio malloc a la funcion free asi:

free( vector );

Esto hara que la memoria que estabamos usando ya no la podamos usar mas pero otros programas si...