A memory unit is built from memory cells (storing one byte each) and a tree of logic gates which are basically small switches. An address is a set of bits which indicate to the switches which memory cell to read or update. ┌───[byte] ┌─[switch] │ ┊ └───[byte] CPU <--> [switch] ┊ ┊ │ ┌───[byte] ┊ └─[switch] ┊ ┊ └───[byte] ┊ ┊ Address: bit0 bit1 Above is an illustration showing how one out of four memory cells connected by switches can be selected by two bits. So the two bits `00` you get the first byte, `01` you get the second byte and so forth. You just need one additional switch any time you double the amount of memory, so with 3 bit you can address 8 bytes, 4 bits give you 16 bytes, and 16 bits give you 65,536 bytes. So an address is just a set of bits which correspond to a chain of switches which gets us to a specific memory cell. A set of bits can also be interpreted as an integer number, and we call that number the address of the memory cells. In other words, a memory cell does not really get the address *assigned*. Rather, the address follows logically from where the cell is located in the hierarchy of switches. Of course this gets a lot more complicated on modern processors where there are multiple levels of caches, virtual memory mapping into physical memory and so forth. But fundamentally an address is just a set of bits corresponding to a set of switches which lets us select a specific memory cell.