In relation to computers, a memory address is a numerical value that references a single element of datum inside of a storage medium. The location of computer memory could be inside the random access memory (RAM) of a computer, on the hard drive or file system, or even on a temporary storage device that is used as a form of virtual memory when there is insufficient system memory available. The size of the memory location depends on the architecture of the computer system or device but generally ranges from an 8-bit byte to a 64-bit integer. There are a variety of methods used to access and manage memory, many of them utilizing a piece of hardware known as a memory management unit (MMU), while others rely completely on software. All systems have a limit to the maximum memory address that can be accessed, which is usually the maximum size of the largest integer type available on the system.
The most common type of memory address refers to a location within the computer system’s RAM memory, which provides fast access to dynamically changing data. The actual information stored within computer memory can range from raw data such as numbers or text documents that are being modified or viewed, to the actual program code stored in specific memory addresses as it is executed. When a program has completed execution, the memory address information that was being used becomes invalid as the RAM is freed up for the next program to use.
As technology has progressed, the term "memory address" changed and, as of 2011, does not always refer to an actual physical address. Instead, it can refer to a location that can be resolved by the MMU of a computer or device. This means the MMU provides a level of abstraction between a programmer and program, instead allowing the operating system or other hardware to manage the movement and allocation of memory as it sees fit. The intermediary translation of a memory address means the programmer does not need to learn a new memory scheme or modify source code for different types of computer architectures.
In many computer systems and operating systems, a memory address might not always refer to data or code in memory. There are schemes in which an address could refer to an input or output point for a peripheral device such as a monitor or a virtual device such as a socket. In these cases, information that is placed at a specific address is actually transmitted to the hardware device it represents. This can be an incredibly efficient way to access a device such as a printer, but it also can lead to serious vulnerabilities and confusion when debugging a program.