Non-primitive or derived data types in C are constructed from primitive types like int, char, and float, allowing for more complex data structures. The main types include arrays, structures, unions, and pointers, each serving specific purposes, such as storing multiple variables or unique data types under one name. Arrays provide continuous memory for homogeneous data, structures group varied data types, unions share memory for different types, and pointers store variable addresses.