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] ┌───[byte]
┌─<switch>┤ ┌─[switch]
│ ┊│ └─[byte] ┊ └───[byte]
<switch>─┤
CPU <--> [switch] ┊
┊ │ ┊ │ ┌─[byte] ┌───[byte]
┊ └─<switch>┤ ┊ └─[switch]
┊ ┊ └───[byte]
┊ └─[byte]
┊
Address: bit0 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.