Introduction to Computer Science - C++
Constant Pointers
You can declare constant variables. Here is an example:
 
    const int var = 9;
 
 
  You can also declare pointers which are constant.  But we must distinguish between two types of constant pointers.  -  a pointer that
  points to a constant variable. (This pointer may be used to point to any number of constants in succession.)
  
    const a = 34;
    const int * ptr2Const;  //something which points to a constant!
   
 ptr2Const = &a;
  
   - a pointer which can point to only one memory location ever. 
  
     int a = 34;
     
int * const constPtr = &a;
  
   int * const constPtr  points to a single memory location, it can never be changed once it is assigned.
 
 Let us remeber something about constants. When you create a regular constant you must inialize it at the time when you declare it.
  If you try to initialize it later, you will get a compiler error. This is because the compiler has no way to know that
  you are not attempting to change the value of a constant. You think you are setting the value for the first time, but the compiler
  just sees that you are assigning it a new value, and that is not allowed.
  
  const int A;
  
A = 10; //compiler error
  
//rather you must do this
  
const int A = 10;
For the same reason, you must initialize a constant pointer when you declare it, as I did above.  Just like it would be pointles to create
a constant variable and not initialize at the time of declaration because then you could never use it for anything, so too would it
be pointles to create
a constant pointer variable and not initialize it.
  
     
int * const constPtr;// pointless, constPtr can never serve any useful purpose
  
Let's see some examples in code that are based on the above principles.
 const int F  =10;
 int * Fptr = &F;// compiles but illegal -- you are trying to point to a constant with a variable pointer
 (*Fptr) = 11; // compiles but crashes program -- if this would really work, you would be changing a const!
 const int *  Fptr= &F;  // the right way to do it
 (*Fptr)= 11;  //Now this won's compile, but that is good because you should not be changing constants
 int c = 200;
 int d = 300;
 int * const C = &c;
 int * const D ;  //compiles but never useful just as useless as const int G; you should give D a value.
 const int * B;
 const int * E;
 E = &d; // a pointer to a const can point to a variable also
 
 (*D) = 17; // compiles but you are accessing memory that does not belong to you. Don't do this!
 (*C) = 17; // compiles but you are accessing memory that does not belong to you. Don't do this!
 C = &d ;  or C = &c; // error because C is a read only variable, you can only assign C at time of declaration
 B = &c;  //compiles but you cannot change c via B because B thinks he is pointing to a constant
 (*B)++;// wont compile because B thinks he is pointing to a const int
 (*B) =  17;  //error because B read only location, the location the B points to is suppose to be a constant
        
  
  #include 
  using namespace std;
		       int main()
		       {
		       int a = 9;
		       int b = 10;
		       const int * ptr = &a;//the thing pointed to is constant
		       int * const ptr1 = &a;// the address the pointer has is constant
		       int const * ptr2 = &a; // ptr and ptr2 are the same kind of pointer, no difference
		       //*ptr = 10;
		       ptr = &b;
		       //*ptr2 = 10;
		       ptr2 = &b;
		       //ptr1 = &b;
		       *ptr1 = 11;
		       int arr[10] = { 1,2,3 };
		       //arr = &b;
		       *arr = 12;
		       system("pause");
		       return 0;
		       }
  
© Nachum Danzig December 2017