Problem : If a pointer stores the memory address 0x1234, what is the binary representation of this address?

0b0001001000110100 Notice that hexadecimal and binary are easily convertible from to another, because 16 is a power of 2 (namely 24). This means that each hexit (a hexadecimal digit) is equal to 4 bits. So, to convert from hexadecimal to binary, we just expand each hexit to its binary equivalent. 0x1 is 0b0001 0x2 is 0b0010 0x3 is 0b0011 0x4 is 0b0100 So 0x1234 is 0001 0010 0011 0100 or eliminating the spaces 0b0001001000110100

Problem : Why does a pointer only need to point to the beginning of a variable in memory?

Pointers are typed, meaning that if you have an integer pointer, the computer knows it is pointing to an integer. Since all integers are the same size, the computer can easily determine where a variable ends if it knows where it starts. Not all pointers have this nice property though; void pointers are an exception. We'll discuss those later.

Problem : If a pointer is assigned a random address in memory, what's to guarantee that an actual variable lives at that address?

Nothing; in fact if you're not careful, this can cause many problems in your code. It is essential that you always know what your pointers are pointing to, and that you be careful not to use them if they are not pointing to something valid.

Problem : Why does every byte of memory need to have an address?

Because if it didn't, the computer would have no way to access that memory.

Problem : Is it possible for two memory locations to have the same address?

No. If two memory locations had the same address, the computer would have no way to distinguish between those two addresses. In other words, if I told the computer that a variable was located at address 0x1234, and the computer had two pieces of memory with address 0x1234, how would it know which one to use? It wouldn't. Hence, every piece of memory is required to have a unique address.