Structures in C

A Dr. Taylor Tutorial

A struct is a way of creating a composite type in C. Basically it allows one to group of attributes together. It is a user-defined data structure.

The are declared as follows:

struct Color {
  uint8_t r;
  uint8_t g;
  uint8_t b;
};

Typically this declaration would appear in a header file. The Color struct can be used like this:

struct Color color;
color.r = 0;
color.g = 0;
color.b = 0;

This creates a Color "object" and then assigns the r, g, and b fields to zero (for black).

We can make use of a typedef to clean up the syntax slightly:

typedef struct {
  uint8_t r;
  uint8_t g;
  uint8_t b;
} Color;

which allows us to now declare a Color struct like this:

Color color;
color.r = 0;
color.g = 0;
color.b = 0;

This looks a lot like how references are declared in Java, but it is really quite different. Here the compiler is actually allocating space (on the stack) for the "object". In Java, a declaration like Color color would just allocate space (also on the stack) for a reference to an object. The actual object would not be created until a new Color() operation was performed.

We can create a pointer (like a reference in Java) to a Color in C as follows:

Color color;
Color *ptr = &color;
ptr->r = 0;
ptr->g = 0;
ptr->b = 0;

The arrow operator -> allows us to access a field of an "object" through a pointer. It is equivalent to (*ptr).x = 0;.

It is possible for a struct to contain other structs. Consider the following example which results in a Rectangle.

#include <inttypes.h>
  
#ifndef COLOR_H
#define COLOR_H
  
typedef struct {
  uint8_t r;
  uint8_t g;
  uint8_t b;
} Color;
  
#endif
#include <inttypes.h>
  
#ifndef POINT_H
#define POINT_H
  
typedef struct {
  int16_t x;
  int16_t y;
} Point;
  
#endif
#include <inttypes.h>
  
#ifndef RECTANGLE_H
#define RECTANGLE_H
  
typedef struct {
  Point upperLeft;
  Point lowerRight;
  Color color;
} Rectangle;
  
#endif

Making a white, 10 x 10 square centered at the origin would require:

Rectangle rect;
rect.upperLeft.x = -5;
rect.upperLeft.y = 5;
rect.lowerRight.x = 5;
rect.lowerRight.y = -5;
rect.color.r = 255;
rect.color.g = 255;
rect.color.b = 255;

Tutorials for Other Courses

Additional Links

Site Mirror

This is a mirror to be used when http://myweb.msoe.edu/taylor/, (EDU instead of US) is not available.