Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Transparencias Leccion9
Transparencias Leccion9
Las variables globales pertenecen al programa principal y existen desde que ste se inicia hasta que finaliza; tambin se las denomina estticas. Las variables locales pertenecen a funciones y subrutinas y slo existen durante la ejecucin del subprograma; tambin se les denomina automticas. Las variables cuya creacin y destruccin no coincide con el inicio y el fin de un algoritmo o subprograma; es decir, es controlada por el programador se denominan variables dinmicas. La mayor parte de lenguajes de programacin pueden manipular este tipo de variables.
2
Un puntero es un tipo simple que siempre est asociado a otro tipo (punteros a enteros, a reales, a registros, etc.) Se pueden ver los punteros como variables que almacenan direcciones de memoria; de aqu se deduce:
! ! !
Un puntero es un medio para acceder al contenido real apuntado por la variable. La declaracin de un puntero no implica que exista contenido apuntado por el misma. Es necesario crear y destruir explcitamente el contenido apuntado por punteros. Una direccin postal permite acceder al lugar fsico indicado. El hecho de disponer de una direccin postal no garantiza que el lugar exista.
Se puede establecer una analoga entre los punteros y las direcciones postales:
! !
Para declarar variables de tipo puntero en la notacin algortmica se utiliza la sintaxis siguiente: variable puntero a tipo Por ejemplo, preal puntero a real
3
Una vez se declara un puntero pueden llevarse a cabo dos acciones bsicas sobre el mismo:
!
Asignarle memoria para almacenar un dato del tipo al que apunta: crear. Eliminar la memoria que tiene asignada y con ella el dato apuntado: destruir.
Es posible asignar a un puntero el contenido de otro; para hacer esto es necesario que la variable a la que vamos a asignar un valor no apunte a ningn dato pues en ese caso el dato original quedara inaccesible. As pues, slo deberamos asignar un puntero a otro si el puntero asignado no tiene memoria reservada. 4
Una vez se reserva memoria para un puntero es posible almacenar un dato en dicho espacio de memoria:
puntero " expresin del tipo apuntado
Ejemplo sencillo:
variables x, y a entero pa, pb puntero a entero inicio x " 1 y " 2 crear(pa) pa " 10 pb " pa escribir x + y escribir pa + pb destruir (pa) fin
pa pb x y
pa pb x y 1 2
pa pb x y 1
pa pb x y 1 2
10
pa pb x y 1 2
pa pb x y 1 2
10
destruir (pa)
pa pb x y 1 2
Al liberar la memoria asignada a pa la variable pb continua apuntando a la posicin de memoria anteriormente asignada que, tras la destruccin de la variable referenciada, no contiene ningn dato vlido.
Por tanto, cuando a un puntero se asigna el contenido de otro puntero hay que cuidar que el puntero no termine referenciando posiciones sin datos vlidos; para lograr esto existe una constante que se asigna a un puntero indicando que el referencia ninguna posicin de memoria, nos referimos a NIL. En el algoritmo anterior una vez se ha destruido el puntero habra que ejecutar: pb " NIL
8
El hecho de asignar NIL a un puntero no libera la memoria asignada sino que simple y llanamente la hace inaccesible. Si en el algoritmo anterior se sustituye la sentencia destruir (pa) por esta otra pa " NIL se tendra...
pa pb x y 1 2
crear (pa)
10
pa pb x y 1 2
crear (pa)
10
pa pb x y 1 2
Por cada sentencia de reserva de memoria tiene que haber una sentencia de liberacin. Para asignar un puntero a otro, el puntero asignado no debe tener asignada memoria previamente. Para asignar un valor a la memoria referenciada por un puntero es necesario que se haya reservado memoria previamente. Cuando la memoria apuntada por un puntero ha desaparecido se debe asignar el valor NIL al puntero. Nunca se pueden perder todas las referencias a memoria reservada pues entonces ya no se podra liberar.
10
Se parecen a los punteros. Se trata de alias puesto que se trata de variables que apuntando a otra variable pueden ser utilizadas como si se tratase directamente con la variable apuntada. Poseen una serie de propiedades que las hacen diferentes de los punteros:
!
Los punteros pueden declararse y no reservarse memoria para los mismos (no apuntan a ninguna parte). Las referencias deben inicializarse en el momento de crearlas. La memoria asignada a un puntero puede destruirse en cualquier momento. La variable apuntada por una referencia no puede ser destruida. Es posible cambiar en cualquier momento la variable apuntada por un puntero. No se puede hacer esto con una referencia.
11
Referencias
Puntero
12
Mediante la palabra reservada pointer es posible utilizar los punteros o referencias de FORTRAN 90 (no son exactamente punteros ni tampoco referencias). Para declarar variables con el atributo pointer en FORTRAN 90 se utiliza la sintaxis siguiente: tipo, pointer:: variable Una vez un puntero ha sido declarado pueden llevarse a cabo las dos acciones bsicas de asignacin y liberacin de memoria; para ello se emplean las funciones allocate y deallocate
13
NO es posible asignar el contenido de un pointer a otro pointer mediante el operador asignacin (=); para hacer que un puntero "apunte" al mismo objetivo que otro se emplea el operador =>. El operador de asignacin se utiliza para dar valores a la variable referenciada por el puntero (es decir, a la memoria asignada al mismo).
14
Ejemplo sencillo:
program programa implicit none integer, pointer :: pa,pb integer x,y x=1 y=2 allocate(pa) pa = 10 pb => pa print *, x + y print *, pa + pb deallocate(pa) end
15
Para lograr en FORTRAN que un puntero apunte a NIL se utiliza la funcin nullify: nullify (variable pointer) Tambin aqu es cierto que el hecho de hacer que un pointer apunte al equivalente de NIL no significa que la memoria haya sido liberada slo que es inaccesible. Para saber si un pointer apunta a algo o no se dispone de la funcin booleana: associated (variable pointer)
16
17
18
19
20
21
22
23
Frente a las variables globales (estticas) y locales (automticas) existe un tercer tipo denominadas variables dinmicas puesto que son creadas y destruidas en tiempo de ejecucin. Las variables dinmicas son la base para construir estructuras dinmicas de datos (como colas, pilas, rboles, etc.) Los punteros permiten crear y destruir variables dinmicas; un puntero es una variable que almacena una direccin de memoria (por tanto, apunta a la direccin ocupada por otra variable). Los punteros presentan una serie de caractersticas:
! ! !
Un puntero es un medio para acceder al contenido real apuntado por la variable. La declaracin de una variable de tipo puntero no implica que exista un contenido apuntado por la misma. Es necesario crear y destruir explcitamente el contenido apuntado por las variables de tipo puntero.
Para declarar variables de tipo puntero en la notacin algortmica se utiliza la siguiente sintaxis: variable puntero a tipo Una vez un puntero ha sido declarado puede asignrsele memoria y eliminar la memoria asignada; para ello se emplean las acciones crear y destruir. Para trabajar con punteros es necesario tener en cuenta las siguientes reglas:
! ! !
Por cada sentencia de reserva de memoria tiene que haber una sentencia de liberacin. Para asignar un puntero a otro, el puntero asignado no debe tener asignada memoria previamente. Para asignar un valor a la memoria referenciada por un puntero es necesario que se haya reservado memoria previamente. Cuando la memoria apuntada por un puntero ha desaparecido se debe asignar el valor NIL al puntero. Nunca se pueden perder todas las referencias a memoria reservada pues entonces ya no se puede liberar.
! !
24
Las referencias se parecen a los punteros aunque, en realidad, son alias ya que, aunque apuntan a una variable, se utilizan como si se tratase directamente con la variable apuntada. Hay varias propiedades que diferencian a una referencia de un puntero:
!
Los punteros pueden declararse y no reservarse memoria para los mismos; las referencias deben inicializarse en el momento de su creacin. La memoria asignada a un puntero puede destruirse en cualquier momento; sin embargo, la variable referenciada por una referencia no puede ser destruida. Siempre se puede cambiar la variable apuntada por un puntero; en cambio, no se puede cambiar el objetivo de una referencia.
FORTRAN 90 dispone de la palabra reservada pointer; esta palabra permite modificar el comportamiento de una variable de tal manera que se comporte como un puntero en algunos aspectos y como una referencia en otros. Las acciones para reservar y liberar memoria en FORTRAN 90 son allocate y deallocate, respectivamente. El operador para cambiar la referencia a la que apunta un pointer es => ya que el operador = sirve para asignar un valor a la variable referenciada. En FORTRAN 90 no existe una constante NIL pero s una funcin nullify que consigue un efecto anlogo. Para saber si un pointer es nulo o apunta a alguna referencia se utiliza la funcin booleana associated.
25