Structures allow grouping of related data types under a single name. A structure is defined using the struct keyword followed by the structure name and members. Structure variables are then declared and individual members can be accessed using the dot operator. Arrays of structures and structures within structures are also possible. Unions allow storing different data types in the same memory location, but only one member can be accessed at a time. Both structures and unions group variables but structures have separate memory for each member while unions share the same memory location.