Pointers

The C language allows the programmer to ``peek and poke'' directly into memory locations. This gives great flexibility and power to the language, but it also one of the great hurdles that the beginner must overcome in using the language.

All variables in a program reside in memory; the statements

    float x;
    x = 6.5;

request that the compiler reserve 4 bytes of memory (on a 32-bit computer) for the floating-point variable x, then put the ``value'' 6.5 in it.

Sometimes we want to know where a variable resides in memory. The address (location in memory) of any variable is obtained by placing the operator ``&'' before its name. Therefore &ampx is the address of x. C allows us to go one stage further and define a variable, called a pointer, that contains the address of (i.e. ``points to'') other variables. For example:

    float x;
    float* px;
 
    x = 6.5;
    px = &x;

defines px to be a pointer to objects of type float, and sets it equal to the address of x:


Pointer use for a variable

The content of the memory location referenced by a pointer is obtained using the ``*'' operator (this is called dereferencing the pointer). Thus, *px refers to the value of x.

C allows us to perform arithmetic operations using pointers, but beware that the ``unit'' in pointer arithmetic is the size (in bytes) of the object to which the pointer points. For example, if px is a pointer to a variable x of type float, then the expression px + 1 refers not to the next bit or byte in memory but to the location of the next float after x (4 bytes away on most workstations); if x were of type double, then px + 1 would refer to a location 8 bytes (the size of a double)away, and so on. Only if x is of type char will px + 1 actually refer to the next byte in memory.

Thus, in

    char* pc;
    float* px;
    float x;
 
    x = 6.5;
    px = &x;
    pc = (char*) px;

(the (char*) in the last line is a ``cast'', which converts one data type to another), px and pc both point to the same location in memory--the address of x--but px + 1 and pc + 1 point to different memory locations.

Consider the following simple code.







 
void main()
{
    float x, y;                      /* x and y are of float type        */
    float *fp, *fp2;                 /* fp and fp2 are pointers to float  */
 
    x = 6.5;                   /* x now contains the value 6.5           */
 
                               /* print contents and address of x   */
    printf("Value of x is %f, address of x %ld\n", x, &x);
      
    fp = &x;                   /* fp now points to location of x    */
            
                               /* print the contents of fp         */
    printf("Value in memory location fp is %f\n", *fp);
 
                               /* change content of memory location */
    *fp = 9.2;
    printf("New value of x is %f = %f \n", *fp, x);
 
                               /* perform arithmetic                 */
    *fp = *fp + 1.5;
    printf("Final value of x is %f = %f \n", *fp, x);
 
                               /* transfer values                   */
    y = *fp;
    fp2 = fp;
    printf("Transfered value into y = %f and fp2 = %f \n", y, *fp2);
}






 

Run this code to see the results of these different operations. Note that, while the value of a pointer (if you print it out with printf) is typically a large integer, denoting some particular memory location in the computer, pointers are not integers--they are a completely different data type.