viernes, 19 de octubre de 2012

APUNTADORES - VENTAJAS Y DESVENTAJAS


Dirección de memoria

Cuando una variable se declara, se asocian tres atributos fundamentales con la misma: su nombre, su tipo y su dirección de memoria.
Int n;
Asocia al nombre n, el tipo int y la dirección de alguna posición de memoria donde se almacena el valor de n.
Al valor de la variable se accede por medio de su nombre. Por ejemplo; se puede imprimir el valor de n con la sentencia:
Printf(“%d”, n);
A la dirección de la variable se accede por medio del operador de dirección &. Por ejemplo; se puede imprimir la dirección de n con la sentencia:
printf(“%p”, &n);

Asignacion dinamica de memoria
Los programas pueden crear variables globales o locales. Las variables declaradas globales en sus programas
se almacenan en posiciones fijas de memoria, en la zona conocida como segmento de datos del programa,
y todas las funciones pueden utilizar estas variables. Las variables locales se almacenan en la pila (stack)
y existen solo mientras est´an activas las funciones donde est´an declaradas. En ambos casos el espacio de
almacenamiento se reserva en el momento de la compilacion del programa.
Tambien es posible reservar y utilizar memoria dinamicamente, tomada de la zona de memoria llamada
montıculo (heap) o almacen libre. En C estan disponibles varias funciones que permiten realizar reservar y
librerar memoria, pero C++ adem´as provee un m´etodo mas facil y seguro de hacerlo.
Inicializacion de apuntadores
La inicialización de un puntero proporciona a ese puntero la dirección del dato correspondiente. Para asignar una dirección de memoria a un puntero se utiliza el operador de referencia &.
&valor
Int i;
Int*p;
P=&i; //asigna la dirección de i ap//
*P=50; //asigna un valor a la dirección de memoria//

null y void
Un puntero nulo no apunta a ninguna parte, no direcciona ningún dato valido en memoria; se declara:
Int *ptr-0;
Un puntero void se declara de modo que apunte a cualquier tipo de dato, es decir, no se asigna a un tipo de dato especifico; se declara:
Void*prt
Aritmética de apuntadores


Una variable del tipo char ocupa 1 byte en la memoria y una variable de tipo int ocupa 4 bytes (verifiquen que tamaño tienen estos tipos de datos en sus compiladores).Ahora bien, supongamos que creamos una variable de tipo char y ésta se aloja en la dirección 0x400, luego creamos un puntero a esa variable.
            char c; // se crea en 0x400
            char* pc;
            pc = &c; // pc ahora apunta a 0x400
Utilizando los operadores de adición y sustracción podemos movernos a partir de la dirección relativa a la que apunta un puntero.
           pc = pc + 1; /* pc
ahora apunta a una direccion distinta, ya que se ha desplazado 1 byte en sentido positivo (1 direccion de memoria más alta), es decir que pc paso de apuntar de
          0x400 a 0x401 */
Para volver a la posición anterior solo debemos escribir:
         pc-- o pc = pc - 1 o pc -= 1
Es indistinto. Lo mismo ocurre con el operador +.

Apuntadores y arreglos  de apuntadores

Los arreglos y apuntadores estan fuertemente relacionados. El nombre de un arreglo es simplemente un apuntador constante al inicio del arreglo. Se pueden direccionar arreglos como si fueran apuntadores y apuntadores como si fueran arreglos.

int lista_arr[5] = {10, 20, 30, 40, 50};
int *lista_ptr;
lista_ptr = lista_arr; // A partir de aqu´ı ambas variables apuntan al mismo sitio
cout << lista_arr[0]; // Imprime 10
cout << lista_ptr[0]; // Instrucci´on equivalente a la anterior
cout << *lista_arr; // Instrucci´on equivalente a la anterior
cout << *lista_ptr; // Instrucci´on equivalente a la anterior
cout << lista_arr[3]; // Imprime 40
cout << lista_ptr[3]; // Instrucci´on equivalente a la anterior

Comparación apuntadores

Para la comparación de punteros se utilizan los operadores básicos de comparación que usábamos con variables bases, tales como int. Por lo que para saber por ejemplo si un puntero apunta a la misma dirección a la que apunta otro, utilizaríamos: p1 == p2, para saber si son distintos utilizaríamos el operador !=, para saber si p1 apunta a una dirección de memoria más baja que p2 colocaríamos p1 < p2, y así con los demás operadores de comparación.

apuntadores y vectores

En C los apuntadores y los vectores están fuertemente relacionados, hasta el punto de que el nombre de un vector es en sí mismo un puntero a la primera (0-ésima) posición del vector. Todas las operaciones que utilizan vectores e índices pueden realizarse mediante punteros.
int v[10];
v: designa 10 posiciones consecutivas de memoria donde se pueden almacenar enteros.
int *ip;
Designa un puntero a entero, por lo tanto puede acceder a una posición de memoria. Sin embargo, como se ha dicho antes v también puede considerarse como un puntero a entero, de tal forma que las siguientes expresiones son equivalentes:
ip = &v[0]
ip = v
x = *ip;
x = v[0];
*(v + 1)
v[1]
v + I
&v[i]




VENTAJAS DE LOS APUNTADORES
Ofrecen potencia y la flexibilidad en C.
Se pueden tener apuntadores a cualquier tipo de variable.
También son útiles para pasarle parámetros a las funciones de tal modo que les permiten modificar y regresar valores a la rutina que las llama.
·    Es la única forma de expresar algunos cálculos.
·    Se genera código compacto y eficiente.
·    Es una herramienta muy poderosa
El operador unario o monádico y devuelve la dirección de memoria de una variable.
Declarar e inicializar apuntadores es bastante fácil.
Existe una relación estrecha entre los punteros y los arreglos. En C, un nombre de un arreglo es un índice a la dirección de comienzo del arreglo. En esencia, el nombre de un arreglo es un puntero al arreglo.
Mientras un programa está corriendo todas las variables se guardan en memoria, cada una tiene su dirección o localidad única. 
DESVENTAJAS DE LOS APUNTADORES
No es posible en otros lenguajes.
Un apuntador a cualquier tipo de variables es una dirección en memoria -- la cual es una dirección entera, pero un apuntador NO es un entero.
El manejo complicado del almacenamiento.  
Alta sobrecarga por el movimiento de líneas.
No asignar un apuntador a una dirección de memoria antes de usarlo.

1 comentario:

  1. Gracias por aclararme un poco más sobre este tema, ya tenia tiempo que me venia surgiendo las dudas, acerca de las ventajas y desventajas.

    ResponderEliminar