I suspect you haven't understood pointers particularly well in C, since (almost) everything you can do with pointers in C is done in exactly the same way in C++. The only technical difference is that, in C, void pointers can be implicitly converted to any other pointer type in C, but the type conversion has to be explicitly done in C++. The practical differences are a bit larger: a lot of techniques in C involving significant usage of pointers are considered very poor practice in C++, since C++ provides viable alternatives (containers, so-called "smart pointers", etc) that are considered less error prone.
Practically, a reference is just an alternative name for a variable. Given a pointer p, then *p is a reference to whatever p points at (although this does not mean the compiler manages reference using pointers behind the scenes). However, the value of a pointer p can change, and changing the value of p changes what *p refers to. However, a reference cannot be changed in that way - assignment to a reference changes the variable itself.
Code:
int main()
{
int a, b;
int *p = &a; // p is a pointer to a, so *p is a reference to a
int &r = a; // r is a reference to a
*p = 42; // changes the value of a
r = 43; // changes the value of a
p = &b; // changes p so it points at b. *p is a now a reference to b
*p = 44; // changes the value of b
r = b; // this changes the value of a (not b).
}
Another difference between pointers and references is that a pointer can have a zero (also called NULL) value, indicating it does not point at a valid object (which means that the act of computing *p gives undefined behaviour). A null reference cannot be created (any code statement that creates a null reference, such as by dereferencing a NULL pointer, has undefined behaviour). So;
Code:
int main()
{
int a;
int *p = NULL;
int &r; // This will trigger a compiler error, since a reference must be initialised to refer to something.
int &r2 = *p; // this has undefined behaviour since p is NULL
if (p == NULL)
{
p = &a; // we are allowed to reseat p. Note that this does NOT affect r2 above.
*p = 42; // this changes the value of a.
}
r2 = 43; // since the creation of r2 gave undefined behaviour, this does too. Typical symptom is a program crash.
}