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.