Puntero
Punteros en C
La sintaxis básica para definir un puntero es:
Esto declara ptr
como el identificador de un objeto, de la siguiente forma:
- puntero que apunta a un objeto de tipo
int
Esto usualmente se manifiesta de forma más sucinta como 'ptr
es un puntero a int
.'
Debido a que el lenguaje C no especifica una inicialización implícita para los objetos de duración automática de almacenamiento, frecuentemente se debe prestar atención para asegurarse de que la dirección a la que ptr
puntea es válida; por eso a veces se sugiere que un puntero pueda ser explícitamente inicializado al valor de puntero nulo, que es tradicionalmente especificado en C con la macro estandarizado NULL:
Desreferenciar un puntero nulo en C produce un comportamiento indefinido, que podría ser catastrófico. Sin embargo, la mayoría de las implementaciones [cita requerida], simplemente detienen la ejecución del programa en cuestión, usualmente con un fallo de segmentación.
Sin embargo, punteros inicializados podría obstaculizar innecesariamente el análisis del programa, ocultando de ese modo los bugs.
En cualquier caso, una vez que un puntero ha sido declarado, el siguiente paso lógico es que se apunte a algo:
Esto asigna el valor de la dirección de a
a ptr. Por ejemplo, si a
está almacenado en la ubicación de memoria de 0x8130 entonces el valor de ptr
será 0x8130 después de la asignación. Para eliminar la referencia al puntero, se utiliza de nuevo el asterisco:
Esto significa tomar el contenido de ptr
(que es 0x8130), "localizar" la dirección en memoria y establecer su valor en 8. Si, más tarde, se accede de nuevo, su nuevo valor será 8.
Este ejemplo puede ser más claro si la memoria no es directamente examinada. Supongamos que a
se localiza en la dirección 0x8130 en memoria y ptr
en 0x8134; también asume de que se trata de un equipo de 32 bits de tal manera que un int
tiene un ancho de 32 bits. Lo que sigue es lo que estaría en la memoria después de que se ejecuta el siguiente fragmento de código:
Dirección Contenido 0x8130 0x00000005 0x8134 0x00000000
(El puntero NULL que se muestra aquí es 0x00000000.) Mediante la asignación la direcciona de a
a ptr
:
produce los siguientes valores de memoria:
Dirección Contenido 0x8130 0x00000005 0x8134 0x00008130
Entonces desreferenciando ptr
mediante codificación:
la computadora tendrá el contenido de ptr (que es 0x8130), 'localizado' esa dirección, y asignar 8 a esa ubicación produciendo la siguiente memoria:
Dirección Contenido 0x8130 0x00000008 0x8134 0x00008130
Claramente, el acceso a a
producirá el valor de 8 porque la instrucción anterior modificó el contenido de a
por medio del puntero ptr
.
Comentarios
Publicar un comentario