#include <string.h>

// structures can hold data items of different types

// OUTSIDE SCOPE: define a structure
struct Contacts {
    char name[40];
    char email[40];
    int number;
} contact;

// INSIDE SCOPE: access structure
// declare struct type
struct Contacts contact_one;

strcpy(contact_one.name, "Adam");
strcpy(contact_one.email, "[email protected]");
contact_one.number = 2445055;

printf("%s\n", contact_one.name);           // Adam
printf("%s\n", contact_one.email);          // [email protected]
printf("%d\n", contact_one.number);         // 2445055

// struct as function argument
void function(struct Contacts contact);

// OUTSIDE SCOPE: define a structure
// typedef: define a new data type
typedef struct Contacts {
    char name[40];
    char email[40];
    int number;
} contact;

// INSIDE SCOPE: access structure
Contact contact;

strcpy(contact.name, "Adam");
strcpy(contact.email, "[email protected]");
contact.number = 2445055;

printf("%s\n", contact.name);               // Adam
printf("%s\n", contact.email);              // [email protected]
printf("%d\n", contact.number);             // 2445055

// bit fields: 
struct {
    unsigned int x;
    unsigned int y;
} status_one;

struct {
    unsigned int x : 1;
    unsigned int y : 1;
} status_two;

printf("%lu\n", sizeof(status_one));        // 8
printf("%lu\n", sizeof(status_two));        // 4