Está en la página 1de 13

Algortmica y Lenguajes de Programacin Punteros Introduccin a estructuras dinmicas

Punteros y estructuras dinmicas. Introduccin


!

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

Punteros y estructuras dinmicas. Punteros (i)


!

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

Punteros y estructuras dinmicas. Punteros (ii)


!

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.

crear (variable puntero) destruir (variable puntero)


!

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

Punteros y estructuras dinmicas. Punteros (iii)


!

Una vez se reserva memoria para un puntero es posible almacenar un dato en dicho espacio de memoria:
puntero " expresin del tipo apuntado

La siguiente sentencia asigna un valor a un puntero a real: preal " 3.1416


5

Punteros y estructuras dinmicas. Punteros (iv)


!

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

Punteros y estructuras dinmicas. Punteros (v)


Variables del algoritmo

pa pb x y

inicio x " 1 y " 2

Variables del algoritmo

pa pb x y 1 2

crear(pa) pa " 10 pb " pa

Variables del algoritmo

pa pb x y 1

inicio x " 1 y " 2

Variables del algoritmo

pa pb x y 1 2

10

crear(pa) pa " 10 pb " pa

Variables del algoritmo

pa pb x y 1 2

inicio x " 1 y " 2

Variables del algoritmo

pa pb x y 1 2

10

crear(pa) pa " 10 pb " pa

Punteros y estructuras dinmicas. Punteros (vi)


Variables del algoritmo

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

Punteros y estructuras dinmicas. Punteros (vii)


Variables del algoritmo

crear (pa) pa " 10 pa " NIL

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

Variables del algoritmo

crear (pa)
10

pa pb x y 1 2

pa " 10 pa " NIL

Variables del algoritmo

crear (pa)
10

pa pb x y 1 2

pa " 10 pa " NIL

Punteros y estructuras dinmicas. Punteros (viii)


!

Reglas para trabajar con punteros:


!

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

Punteros y estructuras dinmicas. Referencias (i)


! !

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

Punteros y estructuras dinmicas. Referencias (ii)

Referencias

Puntero

12

Punteros y estructuras dinmicas. Punteros FORTRAN (i)


!

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

Punteros y estructuras dinmicas. Punteros FORTRAN (ii)


!

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

Punteros y estructuras dinmicas. Punteros FORTRAN (iii)


!

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

Punteros y estructuras dinmicas. Punteros FORTRAN (iv)


!

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

Punteros y estructuras dinmicas. Estructura Dinmica (i)


Ejemplo algortmico:
tipos cliente = tupla nombre carcter siguientecliente puntero a cliente fin tupla variables colaSuper puntero a cliente nombre carcter inicio colaSuper " NIL mientras nombre . hacer escribir Deme su nombre (pulse . para finalizar): leer nombre si nombre . entonces ponerseCola (nombre, colaSuper) fin si fin mientras

17

Punteros y estructuras dinmicas. Estructura Dinmica (ii)


mientras nombre hacer nombre " atenderCliente (colaSuper) escribir nombre fin mientras accion ponerseCola (nombreCliente caracter,cola puntero a cliente) inicio si cola = NIL entonces crear (cola) cola.nombre " nombreCliente cola.siguienteCliente " NIL si no llamar ponerseCola (nombreCliente,cola.siguienteCliente) fin si fin accion

18

Punteros y estructuras dinmicas. Estructura Dinmica (iii)


carcter funcion atenderCliente (cola puntero a cliente) variables cursor puntero a cliente inicio si cola = NIL entonces atenderCliente " si no cursor = cola.siguienteCliente atenderCliente " cola.nombre destruir (cola) cola " cursor fin si fin funcion fin

19

Punteros y estructuras dinmicas. Estructura Dinmica (iv)


Ejemplo FORTRAN 90:
program ejemploCola implicit none ! Se define el tipo base de la cola ! type cliente character*64 nombre type(cliente), pointer :: siguienteCliente end type cliente ! La cola es un puntero al tipo base ! type(cliente), pointer :: colaSuper character*64 nombre ! Se inicializa la cola ! nullify (colaSuper)

20

Punteros y estructuras dinmicas. Estructura Dinmica (v)


do while (nombre/='.') print *, 'Deme su nombre (pulse . para finalizar):' read *, nombre if (nombre/='.') then call ponerseCola (nombre, colaSuper) end if end do do while (nombre/='') nombre = atenderCliente (colaSuper) print *, nombre end dO

21

Punteros y estructuras dinmicas. Estructura Dinmica (vi)


! Subprogramas utilizados por el programa principal ! contains ! Subrutina recursiva para aadir al final de la cola ! recursive subroutine ponerseCola (nombreCliente, cola) implicit none character*64, nombreCliente type(cliente), pointer :: cola if (.not.associated(cola)) then allocate(cola) cola%nombre=nombreCliente nullify(cola%siguienteCliente) else call ponerseCola (nombreCliente, cola%siguienteCliente) end if end subroutine ponerseCola

22

Punteros y estructuras dinmicas. Estructura Dinmica (vii)


! Funcin que retorna el nombre del primer cliente y lo elimina de la cola ! character*64 function atenderCliente (cola) implicit none type(cliente), pointer :: cola, cursor if (.not.associated(cola)) then atenderCliente = '' else cursor => cola%siguienteCliente atenderCliente = cola%nombre deallocate(cola) cola => cursor end if end function atenderCliente end

23

Punteros y estructuras dinmicas. Resumen (i)


!

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

Punteros y estructuras dinmicas. Resumen (ii)


!

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

También podría gustarte