Structures allow users to define custom data types that can store multiple related data items under one name. Structures are useful for storing records like student records that contain related fields. Structures can contain basic data types as well as other structures, allowing for nested structures. Structures can be passed to functions by passing individual fields or the entire structure. Macros provide a way to define symbolic constants and perform simple text substitution before compilation.