Another difference between Perl's references and pointers ala C, is that a reference knows what it refers to. It knows what kind of reference it is. It's not just a reference, but an array reference or a hash reference, etc.
Update: my lack of C knowledge should be self-evident. Thanks to frodo72 for explaining why I'm wrong.
Correct me if I'm wrong, but I was under the impression that the pointer itself doesn't know whether it's a pointer to a struct, or anything else. The pointer just points to a spot of memory. It's the syntax that you use that determines how the memory gets used.
Perl's references, on the other hand, know what they're referring to. If you try to use a hash reference as an array reference, perl can look at the reference type and say, "wait a minute, that's not an array reference!"
I don't know how much difference this makes in terms of usage, but it's certainly a difference between the two constructs.
No, a pointer in C/C++ is fully typed. The only pointer that really points to a chunk of memory is the void*, but you usually don't want to use it. As a result, it usually happens that you have to typecast a pointer explicitly if you want to make it act as if it was another pointer type:
int *p1 = &anint;
char *p2 = (char *) p1;