Don't look at the exact addresses. Unless you know your system's memory layout, ASLR, etc. by heart (unlikely), addresses won't tell you anything about the particular segment your values are stored in.
With that out of the way, there are only two and two-halves simple rules you need to know:
If you declare a local variable, that variable goes to the stack. There's no implicit heap-allocation. (Conceptually at least – the compiler is free to optimize so that it doesn't even go to the stack and is stashed in a register instead.)
If you put a value inside a container that actively heap-allocates it, then of course that value goes to the heap. (The container itself may go to the stack or the heap or wherever, really.)
(statics go into static memory, but you don't seem to be asking about those.)
A reference is just a pointer (with extra compile-time checks). It points to wherever its pointee is – be it the stack, the heap, the static segment, wherever, really.
So, in your code:
var_1 is on the stack, conceptually.
p_var_1 is on the stack. It points to var_1 (so it points into the stack).
var_2, the box itself, is on the stack. The wrapped data of the box, i.e. the 77, aka *var_2, is on the heap.
p_var_2 is on the stack. It points to the box, so it points to the stack.
Since a box in itself is a pointer-like type, you can say that var_2 and *p_var_2 point to the heap.
Absolutely not. They are stored as their raw byte representation.