References are in most cases internally pointers (especially when stored or passed to functions). They operate the same way as a pointer would, as long as only operations valid for both are used.
The extra checks and syntactic sugar for references is strictly a compile-time feature, much like the type system (most information about data types is lost during compilation).
The important differences are
- Reference always points to an object (cannot be NULL)
- Reference points to one object only (not to an array like a pointer might)
- Reference must be initialized initially (otherwise you get a compile error)
- Reference cannot be modified after initialization to point somewhere else
- Deletion of the object pointed to by a reference, while the reference variable stays alive, is Undefined Behavior (but not a compile error)