Pointers

The use of pointers as reference parameters is clearly very important, but they have a further purpose which changes the manner in which programs can be used drastically. Pointers are also used to allow instances of structures to be created within a heap, by the library functionscalloc() and malloc(). In this way dynamic data structures, such as linked lists and trees, can be used in programs.

Variables can be declared to be pointers to items of any type by using the asterix syntax we saw for reference parameters. Note that a pointer to a type can refer to a single variable or to an array of that type. The pointer to an array is also a pointer to the first item of that array. The following are examples.

char * s1:      /* pointer to a char or an array of chars */
char ** sp1;    /* pointer to a pointer of chars 
                   or to an array of pointers to chars etc. */
The declaration of a pointer to a type can be mixed with declarations to variables of that type, since the pointer operator, *, is right associative.
int i1, * ip1, i2, *ip2; /* i1 and i2 are int,
                            ip1 and 1p2 are pointer to int */
When using pointers to structs or unions, it is sensible to exploit typedefs to make the program more readable.
struct pr {
      int val1;
      float val2;
   };

struct pr * prp1;

typedef struct pr prs;

prs * prp2;

typedef struct pr * prp;

prp prp3;
prp1, prp2 and prp3 are all pointers to structs of type pr. A pointer to a certain type can be assigned the address of a variable of the same type by using the address operator (or referencing operator) &.
int i;
int * ip;
ip = & i;   /* ip points at the location of i */
The contents of the variable pointed to by a pointer can be accessed by using the dereferencing operator, *.
*ip = 3;   /* set the value in i to 3, via ip */
printf("%d\n",*ip);   /* print out the value in i, via ip */

Exercises on this section.


Next - Arrays vs pointers.

Back to Contents page.