What is the difference between a constant pointer and a reference?
Constant pointer as the name implies can not be bound again. Same is the case with the reference.
When you should use each:
reference: Use these by default. It is very common for people to dereference NULL pointers. You eliminate that risk with a reference.
const pointer: When you want a reference, but can't make one. For example, you are writing a driver, and you'd like a pointer to the beginning of a memory map. A reference doesn't make as much sense in that case. Also, if you need an array of the things, a reference won't work (though an array of simple classes with reference members will).
In the next example, a const pointer checks an error that a reference can't check:
int addFour( int* register ){
if(isNull(arg)){
throw NullPointerException();
}
// some stuff
*register += 4;
return register;
}
// This could be any function that does pointer math.
bool isNull(const int* ptr){
return( NULL == ptr );
}
I assume that you mean a const-valued pointer (e.g. int* const ptr), not a pointer to const (e.g. int const* ptr).
There are 3 types of const pointers:
//Data that p points to cannot be changed from p
const char* p = szBuffer;
//p cannot point to something different.
char* const p = szBuffer;
//Both of the above restrictions apply on p
const char* const p = szBuffer;
Method #2 above is most similar to a reference.
There are key differences between references and all of the 3 types of const pointers above:
Const pointers can be NULL.
A reference does not have its own address whereas a pointer does.
The address of a reference is the actual object's address.
A pointer has its own address and it holds as its value the address of the value it points to.
See my answer here for much more differences between references and pointers.
Almost all points have been covered by other answers, except this important one : It is possible to do arithmetics on pointers, but not on reference. E.g.
int a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1); // sets c = 18
Some differences:
A const pointer can point to NULL.
A const point can point to an array of objects.
A const pointer can be bound again by casting away the constness.