In computing, a memory address is an identifier that locates a unit of storage where software or hardware can place or fetch data. The term is used widely in computer science and refers to positions inside a system's computer memory. An address does not contain the stored value itself but points to the location where that value resides.

Characteristics and units

Memory is partitioned into addressable units. Some architectures are byte-addressable (each address refers to one byte), while others use larger units called words. The width of an address (for example, 32-bit or 64-bit) determines the maximum number of distinct addresses and thus the theoretical address space of a system. Addresses are often represented in hexadecimal for compactness.

Types and addressing modes

  • Physical address: the actual location on RAM or other hardware.
  • Logical (virtual) address: used by programs and translated to physical addresses by memory management.
  • Relative and absolute addressing: used by CPUs and compilers to compute targets for instructions.

Processors support addressing modes—immediate, direct, indirect, indexed—that affect how an address is computed at runtime and enable pointer arithmetic in programming languages.

History, hardware, and operating systems

Early machines used simple physical addressing. As systems evolved, concepts like paging and segmentation introduced virtual addressing, allowing isolation, swapping, and demand loading. Memory-mapped I/O and hardware translation units (MMUs) are central to modern address translation and protection.

Memory addresses are central to programming (pointers and references), system performance (cache and alignment), and security (bounds checking, null pointers, and exploit mitigation). Misuse can cause faults, crashes, or vulnerabilities such as buffer overflows. Understanding addresses and their translation is fundamental for systems programming, operating-system design, and debugging.