Apuntadores en C y C++
Enviado por Jerry • 16 de Diciembre de 2018 • 2.325 Palabras (10 Páginas) • 286 Visitas
...
C´odigo C y C++
float *p;
cout
*p = 3.5; // Incorrecto
2. Despu´es de que un apuntador ha sido inicializado, la direcci´on que posee puede dejar de ser v´alida si
se libera la memoria reservada en esa direcci´on, ya sea porque la variable asociada termina su ´ambito
o porque ese espacio de memoria fue reservado din´amicamente y luego se liber´o . Ejemplo:1
1La asignaci´on din´amica de memoria se explica en la secci´on 13
3
---------------------------------------------------------------
C´odigo C y C++
int *p, y;
void func()
{
int x = 40;
p = &x;
y = *p; // Correcto
*p = 23; // Correcto
}
void main()
{
func();
y = *p; // Incorrecto
*p = 25; // Incorrecto
}
Si se intenta desreferenciar un apuntador que contiene una direcci´on inv´alida pueden ocurrir cosas como
las siguientes:
Se obtiene un valor incorrecto en una o m´as variables debido a que no fue debidamente inicializada
la zona de memoria que se accede a trav´es de la direcci´on en cuesti´on. Esto puede ocasionar que el
programa genere resultados incorrectos.
Si casualmente la direcci´on es la misma de otra variable utilizada en el programa, o est´a dentro del
rango de direcciones de una zona de memoria utilizada, existe el riesgo de sobreescribir datos de otras
variables.
Existe la posibilidad de que la direcci´on est´e fuera de la zona de memoria utilizada para almacenar
datos y m´as bien est´e, por ejemplo, en la zona donde se almacenan las instrucciones del programa. Al
intentar escribir en dicha zona, f´acilmente puede ocurrir que el programa genere un error de ejecuci´on
y el sistema operativo lo detenga, o que el programa no responda y deje al sistema operativo inestable.
En muchos casos el sistema operativo detecta el acceso inadecuado a una direcci´on de memoria, en cuyo
caso detiene abruptamente el 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 (no apunta a nada). NULL es una macro t´ıpicamente definida en archivos de
cabecera como stdef.h y stdlib.h. Normalmente, en C++ se encuentra disponible sin incluir ning´un archivo
de cabecera. NULL se suele definir en estas librer´ıas as´ı:
C´odigo C y C++
#define NULL 0
Un apuntador nulo se utiliza para proporcionar a un programa un medio de conocer cu´ando un apuntador
contiene una direcci´on v´alida. Se suele utilizar un test condicional para saber si un apuntador es nulo o no
lo es, y tomar las medidas necesarias. El valor NULL es muy util para la construcci´´ on de estructuras de
datos din´amicas, como las listas enlazadas, matrices esparcidas, etc. Es igualmente incorrecto desreferenciar
el valor NULL por las mismas razones presentadas previamente.
9. Apuntadores a apuntadores
Dado que un apuntador es una variable que apunta a otra, f´acilmente se puede deducir que pueden existir
apuntadores a apuntadores, y a su vez los segundos pueden apuntar a apuntadores, y as´ı sucesivamente. Estos
4
---------------------------------------------------------------
apuntadores se declaran colocando tantos asteriscos (‘*’) como sea necesario. Ejemplo:
C´odigo C y C++
char c = ’z’;
char *pc = &c;
char **ppc = &pc;
char ***pppc = &ppc;
***pppc = ’m’; // Cambia el valor de c a ’m’
10. Apuntadores constantes y apuntadores a constantes
Es posible declarar apuntadores constantes. De esta manera, no se permite la modificaci´on de la direcci´on
almacenada en el apuntador, pero s´ı se permite la modificaci´on del valor al que apunta. Ejemplo:
C´odigo C y C++
int x = 5, y = 7;
int *const p = &x; // Declaraci´on e inicializaci´on del apuntador constante
*p = 3; // Esto es v´alido
p = &y; // Esto no es v´alido (el compilador genera un error)
Tambi´en es posible declarar apuntadores a datos constantes. Esto
...