# Dirección de memoria

En informática, una dirección de memoria es un formato de localización de bytes de memoria con la cual un programa informático o un dispositivo de hardware accede o almacena datos para su posterior utilización.
Una forma común de describir la memoria principal de un ordenador es como una colección de celdas que almacenan datos e instrucciones. Cada celda está identificada unívocamente por un número o dirección de memoria.
Para poder acceder a una ubicación específica de la memoria, la CPU genera señales en el bus de dirección, que habitualmente tiene una longitud de 32 bits en la mayoría de máquinas actuales. Un bus de dirección de 32 bits permite especificar hasta $2^{32}$ = 4.294.967.296 direcciones de memoria distintas.
Las direcciones de memoria se expresan a menudo en código hexadecimal. Por ejemplo, para expresar el valor binario 111111010100000000000010101100 se escribe 0x3F5000AC en hexadecimal.

## Aplicación informática

En aplicaciones informáticas las direcciones son asignadas por el sistema operativo a cada programa en ejecución, asegurándose este, comúnmente por medio de un daemon, que las direcciones utilizadas por un ejecutable u otro proceso no se solapen o se escriba en posiciones protegidas de memoria, por ejemplo, en el sector de arranque.
Los sistemas operativos actuales son comúnmente diferenciados según el ancho de palabra soportado por sus registros, es decir 32 y 64 bits. Estas cifras se refieren a la máxima capacidad que dichos sistemas operativos pueden direccionar, así un sistema de 32 bits podría acceder y direccionar, sin utilizar memoria virtual, un máximo de 2$^{32}$ posiciones de memoria, usualmente designadas por un código hexadecimal. Debido a esto, el rango de valores naturales que pueden ser almacenados en 32 bits es de 0 hasta 4.294.967.295 (0x0 - 0xFFFFFFFF), que vienen a ser los famosos 4 gigabytes de capacidad límite de los sistemas operativos de 32 bits.
Para los sistemas de 64 bits, siguiendo el razonamiento anterior, obtendríamos 2$^{64}$ posibilidades, lo que se traduce en un rango de valores desde 0 hasta 18.446.744.073.709.551.615 (0x0 - 0xFFFFFFFFFFFFFFFF), 18,4 exabytes o 18.400.000.000 de gigabytes direccionables.
En los lenguajes de programación, se puede acceder a las direcciones de memoria utilizando punteros. Si bien algunos sistemas operativos y lenguajes actuales no permiten acceder a determinadas direcciones de memoria (o incluso, lenguajes como Java que no implementan punteros), esto no significa que dichas direcciones no existan o no sean correctas, por ejemplo, la posición de memoria 0h es una posición válida y correcta y es normal que se trabaje sobre ella por ejemplo cuando se modifica la tabla descriptora de interrupciones. Pero cuando se trabaja en modo protegido, los programas ejecutándose como aplicaciones de usuario no tienen acceso a algunas posiciones (entre ellas la 0h), pero en el sistema operativo DOS que trabaja en modo real, se puede acceder a toda la memoria disponible con un simple programa de usuario.

## Aplicación electrónica

En aplicaciones electrónicas una dirección es el identificador único de cada dispositivo conectado a un bus de datos, así el dispositivo maestro dispondrá de un código para seleccionar uno, y solo uno, de los dispositivos esclavos conectados a él.