Let me try to make you understand in easy way. When you declared any variable in your c++ program then compiler create an entry in the symbol table for that variable and later an appropriate space in memory provided for it.
In case of reference variable there will be a new entry in the symbol table which having the same storage of referenced varible, there will be no space allocated for it later, it is just an alias name like you may be refer by two names (like name, nick name).
Now lets take a case of pointer varible. Irrespective of it is a pointer but it is a variable so it will also have a symbol table entry and space will be allocated for it later.
So from above statements you can easily find the below difference between address(pointer) and reference variable
1) There will no extra memory allocated for the reference variable but for pointer variable there will be 4 or 8 bytes depends on the system (32 or 64 bit operating system) for which you are going to compile and run the code.
2) you can't deference the reference variable later on normally so you can't changed the reference but in case of pointer variable it can contain different pointer.
The same is applicable for passing by reference and passing by address. Hope it will help you to understand in better way.
Try execute the below code and you will find that the address of variable and reference variable is same
int main()
{
int i = 10;
int& j = i;
printf(" address of i = %u address of j = %u", &i, &j);
return 0;
}