A normal variable has scope and life, a reference has only scope.
void f1()
{
int i; // start of scope and life i
int &ir = i; // start of scope ir, ir bound to i
ir = 5; // ok
} // end of life i, end of scope i and ir
And this can lead to problems:
{
int *ip = new int; // start of life *ip
int &ir = *ip; // start of scope ir, ir bound to *ip
delete ip; // end of life *ip here
ir = 5; // bad
} // end of scope ir