Back to C Programming
2026-07-135 min read

Typedefs (C Programming)

Learn Typedefs (C Programming) step by step with clear examples and exercises.

Why This Matters

Typedefs are a powerful tool in C programming, allowing developers to create new names for existing data types. They enhance code readability, reduce the risk of naming collisions, and make it easier for other developers to understand complex programs. Understanding typedefs is essential for excelling in exams, interviews, and real-world programming scenarios.

Prerequisites

Before diving into typedefs, it's important to have a strong foundation in the following C concepts:

  1. Variables and data types
  2. Basic arithmetic operations
  3. Control structures (if, for, while)
  4. Pointers
  5. Arrays
  6. Structures (struct)
  7. Basic I/O operations (printf, scanf)
  8. Function definitions and calls
  9. Preprocessor directives (#define, #include)
  10. Understanding of memory allocation and deallocation (malloc, free)
  11. Understanding of pointers to functions (function pointers)

Core Concept

Definition

A typedef declaration creates a new name for an existing data type. This new name can be more descriptive and easier to remember than the original data type. For example:

typedef int MY_INT; // Creates a new type named MY_INT that represents integer

Now you can use MY_INT instead of int in your code:

MY_INT myNumber = 10;

Typedefs with Structures

Typedefs are particularly useful when working with structures. By defining a new name for a complex structure, you can simplify the usage and make your code more readable:

typedef struct {
char name[50];
int age;
} PERSON; // Creates a new type named PERSON that represents a person structure

PERSON myPerson;
strcpy(myPerson.name, "John Doe");
myPerson.age = 30;

Typedefs with Pointers

Typedefs can also be used to create new names for pointers, making your code more readable and reducing the risk of errors:

typedef int* INT_PTR; // Creates a new type named INT_PTR that represents an integer pointer

INT_PTR myIntPtr = &myNumber; // Assigns the address of myNumber to myIntPtr

Typedefs with Enumerations (enum)

You can create a new name for an enumeration using the typedef keyword:

typedef enum { RED, GREEN, BLUE } COLOR; // Creates a new type named COLOR that represents an enumeration with three values

Typedefs with Arrays

Although you cannot directly create a new type name for an array in C, you can define a new type name for a pointer to an array:

typedef int ARRAY[10]; // Creates a new type named ARRAY that represents an integer array of size 10
ARRAY myArray; // Declares an array with the new type name ARRAY
myArray = (ARRAY) malloc(sizeof(int) * 10); // Dynamically allocates memory for the array and assigns it to the new type name ARRAY

Worked Example

Let's create a VEHICLE structure with typedef and use it in a simple program:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char brand[50];
char model[50];
int year;
} VEHICLE; // Creates a new type named VEHICLE that represents a vehicle structure

void readVehicle(VEHICLE* vehicle) {
printf("Enter %s's brand: ", vehicle->brand);
scanf("%49s", vehicle->brand);
printf("Enter %s's model: ", vehicle->model);
scanf("%49s", vehicle->model);
printf("Enter %s's year: ", vehicle->brand);
scanf("%d", &vehicle->year);
}

void printVehicle(VEHICLE vehicle) {
printf("\n%s %s's Information:\n", vehicle.brand, vehicle.model);
printf("Brand: %s\n", vehicle.brand);
printf("Model: %s\n", vehicle.model);
printf("Year: %d\n", vehicle.year);
}

int main() {
VEHICLE car;
readVehicle(&car);
printVehicle(car);

return 0;
}

Common Mistakes

  1. Forgetting to include the semicolon after the structure definition:

Incorrect:

typedef struct {
char name[50];
int age;
} PERSON

Correct:

typedef struct {
char name[50];
int age;
} PERSON;
  1. Using the new type name incorrectly:

Incorrect:

PERSON john = "John"; // Incorrect usage of PERSON with assignment

Correct:

PERSON john;
strcpy(john.name, "John"); // Correct usage of PERSON with structure member access
  1. Forgetting to include the address operator (&) when using the new type name as a pointer:

Incorrect:

INT_PTR myIntPtr = myNumber; // Incorrect usage of INT_PTR without address operator

Correct:

INT_PTR myIntPtr = &myNumber; // Correct usage of INT_PTR with address operator
  1. Forgetting to initialize a structure when declaring it on the stack:

Incorrect:

PERSON john;
john.age = 30; // Uninitialized structure member access is undefined behavior

Correct:

PERSON john = { .age = 30 }; // Initializing the structure with an initializer list
  1. Forgetting to deallocate memory when using dynamic memory allocation:

Incorrect:

ARRAY myArray = (ARRAY) malloc(sizeof(int) * 10);
// ...

Correct:

ARRAY myArray = (ARRAY) malloc(sizeof(int) * 10);
// ...
free(myArray); // Deallocate memory after use

Practice Questions

  1. Create a new type named STUDENT that represents a student structure containing the name, age, and GPA as strings, and define a variable called student.
  1. Write a program that reads data for multiple students using the STUDENT structure defined earlier and calculates the average GPA of all entered students.
  1. Modify the worked example to read data for multiple vehicles using an array of VEHICLE structures.
  1. Implement a function called sortVehiclesByYear that sorts an array of VEHICLE structures by year in ascending order.

FAQ

How can I create a new type name for an array?

You cannot directly create a new type name for an array in C, but you can define a new type name for a pointer to an array:

typedef int ARRAY[10]; // Creates a new type named ARRAY that represents an integer array of size 10
ARRAY myArray; // Declares an array with the new type name ARRAY
myArray = (ARRAY) malloc(sizeof(int) * 10); // Dynamically allocates memory for the array and assigns it to the new type name ARRAY

Can I use typedefs with enumerations (enum)?

Yes, you can create a new name for an enumeration using the typedef keyword:

typedef enum { RED, GREEN, BLUE } COLOR; // Creates a new type named COLOR that represents an enumeration with three values

What are some best practices when using typedefs?

  1. Use meaningful names for your new types to make the code easier to understand.
  2. Consider grouping related typedefs together in header files for better organization.
  3. Be consistent with naming conventions throughout your project.
  4. Avoid creating unnecessary typedefs that do not improve readability or reduce confusion.
  5. When using dynamic memory allocation, always remember to deallocate the memory after use to avoid memory leaks.