Apuntadares
Enviado por NEMAKA • 14 de Febrero de 2012 • 1.036 Palabras (5 Páginas) • 595 Visitas
“QUE ES UN APUNTADOR Y MEMORIA DINÁMICA”
Apuntador:
• Variable que almacena una dirección de memoria.
• Una variable de este tipo "apunta" o hace referencia a uno ó más objetos
• Desde su declaración "sabe" el tipo de objetos a que hace referencia.
• Tipos de apuntadores: a tipos primitivos, arreglos, apuntadores, estructuras y funciones, e.g. (*p).field == p->field
• El identificador de un arreglo equivale a un apuntador a la dirección del primer elemento, e.g. a+i == &a[i] y *(a+i) == a[i]
Parámetros por referencia: en vez de una copia del valor de un parámetro, con apuntadores pasas la dirección del objeto y por lo tanto, la función puede alterar el objeto "externo".
Apuntador Universal: (void *) declara un apuntador genérico, i.e. apunta a cualquier tipo de objeto.
Operadores permitidos: asignar, sumar con contantes, restar, comparar, convertir y manejo de bits.
Operadores PROHIBIDOS: multiplicar, dividir y sumar dos o más apuntadores.
Apuntador NULO: valor reservado, dirección cero, significa "apuntador vacío", definido en <stdlib.h>, i.e. NULL == (void *)0
PELIGRO: Un apuntador puede accesar indirectamente el contenido de un objeto.
PRECAUCION: Todo apuntador debe inicializarse antes de usarse.
Beneficios:
Generar elementos bajo demanda, i.e. asignación dinámica de memoria
Manipular y recorrer grandes espacios de memoria
Generar estructuras de datos complejas
Parámetros de entrada/salida para funciones, i.e. parámetros por referencia
Dificultades:
Programación avanzada, caótica y/o complicada
Programación más susceptible de errores muy difíciles de depurar
Dificultad para leer y comprender código
Apuntadores: Operaciones Básicas
Op Función Ejemplo Explicación
(void *) Convierte entero a dirección (void *)0 dirección nula
* Para declarar apuntadores int *p; p es un apuntador
& Obtener dirección de.. q=&i; q apunta a i
= Asignar dirección p=q=&i; p y q apuntan a i
* Operador indirección *p=7; a donde apunta p almacena un 7
++ Incremento-dato ++*p; incrementa el valor que apunta p
++ Incremento-apuntador *p++; incrementa apuntador p
%p Especificador tipo apuntador printf("%p",p); imprime dirección almacenada en p
== igualdad entre apuntadores p==q regresa falso si no son iguales
!= desigualdad entre apuntadores p!=q regresa falso si son iguales
< menor, <= menor o igual p<=q regresa falso si p es mayor que q
> mayor, >= mayor o igual p>=q regresa falso si p es menor que q
sizeof Espacio que ocupa un dato en bytes sizeof(void *) tamaño de cualquier apuntador
MEMORIA DINAMICA:
¿Qué es la memoria dinámica?
Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un ejemplo simple podría ser el de un programa que lee las líneas de un archivo y las ordena. Por tanto, deberemos leer un número indeterminado de líneas, y tras leer la última, ordenarlas. Una manera de manejar ese ``número indeterminado'', sería declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamaño MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo). Nuestro programa no sólo quedaría limitado por ese valor máximo, sino que además gastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de los ficheros.
La solución consiste en utilizar memoria dinámica. La memoria dinámica
...