&score
is a prvalue of type "pointer to int". prvalue means "purely a value that can go on the right-hand side of an assignment statement".
int* score_ptr
is an lvalue of type "pointer to int". That means it can go on the left hand side of an assignment statement.
The difference is that one is a value that has no identity, the other is a variable that has identity.
You cannot do &&score
, but you can do &score_ptr
. You can assign to score_ptr
, you cannot assign to &score
.
A pointer is akin to a piece of paper with a street address written on it. A value is a street address.
A pointer variable is a street address where there is a piece of paper saying where another street address is.
Suppose you where going moving houses every 4 months; maybe you are a coop student in a university. Giving someone your current address is a waste of time, as it will be garbage in a few months. Giving them your parent's address, and having them forward your mail to you, makes much more sense.
Here, you live in an int
. If you tell someone your parent's address -- an address to a variable of type int*
-- they can send stuff to you even after you move around.