Most of what I\'ve read about the address operator, &, says it\'s used to get just that - an address. I recently heard it described differently, though, as
The variable i1 has type int, so the expression &i1 takes the address of an int, yielding an expression of type int *. This expression is then assigned to p1, which is also of type int *.
So now p1 points to the memory location of i1, so the expression *p1 will be 5.