Difference between const. pointer and reference?

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.

I wonder in what sort of scenarios would one be preferred over the other. How different is their C++ standard and their implementations?

cheers


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.


I assume that you mean a const-valued pointer (e.g. int* const ptr), not a pointer to const (e.g. int const* ptr).

  • Not initializing a reference is a compile error (avoids the problem of uninitialized pointers)
  • A pointer may also point to an array, or it can be NULL, where a reference always refers to exactly one object.
  • The syntax is very different

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 );
}