Pointers to Structs

You can declare a pointer to a struct just like you declare a pointer to another element type. The format for declaring a pointer is:

type* name;

So, to declare a pointer to a struct person element, we could say:

struct person* personPtr;

Suppose we have another struct person variable:

struct person p1;
strcpy(p1.name, "Jill");
p1.age = 18;

Then we can make personPtr point to p1:

personPtr = &p1;

Allocating Memory

We can also create struct variables by:

  1. Declaring a pointer to a struct
  2. Allocating memory for the struct

This approach (using pointers instead of standard variables) is handy when building data structures like linked lists.

To create a struct person in this way, we first declare a pointer:

struct person* personPtr;

Then we allocate memory for the struct, and give personPtr the address of that memory. We can use sizeof(struct person) to get the number of bytes needed to store a variable of type struct person:

personPtr = malloc(sizeof(struct person));

Now, personPtr points to a struct person, which has space for the name and age fields.

Accessing Fields

We can get at the struct person object itself by dereferencing personPtr:

*personPtr

We can then initialize the fields:

(*personPtr).age = 18;

This line does two things:

  1. Dereferences the pointer to get at the struct person object
  2. Changes the person’s age to 18

Do NOT write something like this:

*personPtr.age = 18;    //BAD!

The compiler will try to resolve the “.” operator first. Because personPtr is a pointer and not a struct, using a . doesn’t make sense. This line will result in a compiler error. We need to dereference the pointer before we can access any fields.

Pointers to structs are very common in C, and you’ll often find yourself dereferencing a struct pointer and then accessing one of the fields. Because of this, there is a shortcut notation:

personPtr->age = 18;

//Is equivalent to:
(*personPtr).age = 18;