A structure allows grouping of related data types together under one name. It can contain different data types as members. To define a structure, the struct keyword is used followed by the structure name and its members. Structures provide a way to organize data and pass it to functions by name rather than by index. Unions are similar to structures but allocate only enough memory for the largest member, so different members cannot coexist and overwrite each other's memory when accessed. Enumerations allow defining a set of named integer constants for clearer and safer code than #define.