Punteros y memoria
Escuela de ingeniería en Computación
Algoritmos y estructuras de datos II
Resumen 2
Apuntadores y memoria en C y C++
Kenneth Mora Mora
Prof. Gerardo Nereo Campos Araya
Año 2012
Definición de apuntador
Un apuntador es una variable cuyo valor es la dirección de memoria de otra variable. Se dice que un
Apuntador “apunta” a la variable cuyovalor se almacena a partir de la dirección de memoria que contiene el apuntador.
Referenciacion
La referenciacion es la obtención de la dirección de una variable. En C y C++ esto se hace a través del
Operador ‘&’, aplicado a la variable a la cual se desea saber su dirección.
int x = 25;
cout << "La dirección de x es: " << &x << endl;
Declaración de apuntadoresPara declarar un apuntador se especifica el tipo de dato al que apunta, el operador ‘*’, y el nombre del
Apuntador. La sintaxis es la siguiente:
int *ptr1; // Apuntador a un dato de tipo entero (int)
Asignación de apuntadores
Se pueden asignar a un apuntador direcciones de variables a través del operador de referenciacion (‘&’) o
Direcciones almacenadas en otros apuntadores.
int i =5;
int *p, *q;
p = &i; // Se le asigna a ’p’ la direccion de ’i’
q = p; // Se le asigna a ’q’ la direccion almacenada en ’p’ (la misma de ’i’)
Desreferenciacion de apuntadores
La desreferenciacion es la obtención del valor almacenado en el espacio de memoria donde apunta un apuntador.
int x = 17, y;
int *p;
p = &x;
cout << "El valor de x es: " << *p<< endl; // Imprime 17
y = *p + 3; // A ’y’ se le asigna 20
Verificación de tipos en apuntadores
Los apuntadores se enlazan a tipos de datos específicos (apuntadores a variables de cierto tipo), de manera que a un apuntador solo se le pueden asignar direcciones de variables del tipo especificado en la declaración del apuntador.
Direcciones inválidasy la direccion NULL
Un apuntador puede contener una direccion invalida debido a dos razones, que cuando un apuntador se declara, al igual que cualquier otra variable, el mismo posee un valor cualquiera que no se puede conocer con antelación, hasta que se inicialice con algún valor o después de que un apuntador ha sido inicializado, la direccion que posee puede dejar de ser valida si se libera lamemoria reservada en esa direccion, por lo que si se intenta desreferenciar un apuntador que contiene una direccion invalida pueden ocurrir cosas como:
1) Se obtiene un valor incorrecto en una o más variables debido a que no fue debidamente inicializada la zona de memoria que se accede a través de la direccion en cuestión.
2) Existe el riesgo de sobrescribir datos de otras variables.3) Existe la posibilidad de que la direccion este fuera de la zona de memoria utilizada para almacenar datos y más bien este, por ejemplo, en la zona donde se almacenan las instrucciones del programa.
Cuando no se desea que un apuntador apunte a algo, se le suele asignar el valor NULL, en cuyo caso se dice que el apuntador es nulo. Un apuntador nulo se utiliza para proporcionar a un programaun medio de conocer cuando un apuntador contiene una direccion valida.
Apuntadores a apuntadores
Dado que un apuntador es una variable que apunta a otra, fácilmente se puede deducir que pueden existir apuntadores a apuntadores, y a su vez los segundos pueden apuntar a apuntadores, y así sucesivamente.
char c = ’z’;
char *pc = &c;
char **ppc = &pc;
Apuntadores constantes yapuntadores a constantes
Es posible declarar apuntadores constantes. De esta manera, no se permite la modificación de la direccion almacenada en el apuntador, pero sı se permite la modificación del valor al que apunta.
int x = 5, y = 7;
int *const p = &x; // Declaración e inicialización del apuntador constante
*p = 3; // Esto es valido
p = &y; //...
Regístrate para leer el documento completo.