int my_int;              // Allocates memory on the stack.
                         // Variable is global (read / writable by entire program)
static int my_local_int; // only available locally (in this file)
extern const char *var;  // Defined in some other file
const int MY_CONST = 10; // constant (immutable), convention: SCREAM_CASE

enum { ONE, TWO } num; // Enum. ONE will get value 0, TWO has value 1

enum { O = 2, T = 1 } n; // Enum with values specified

// Structs are like classes, but contain no logic
struct MyStruct {
        int el1;
        int el2;
};

// Like structs, but can only hold one of the values!
union MyUnion {
        int ival;
        float fval;
        char *sval;
};

int fun( int j ) {
    static int i = 0;              // Persists across calls of fun
    short my_var = 1;              // Block scoped (deallocated when going out of scope)
    int my_var_dbl = (int) my_var; // Explicit casting (works between almost all types)
    return i;
}

int main( int argc, char *argv[] ) {
    if ( ( my_local_int = fun( 10 ) ) ) {
        // Every c statement is also an expression, i.e. you can do the above!
    }
    struct MyStruct test;            // Allocate memory on stack for struct
    struct MyStruct *test_p = &test; // Pointer to memory where test resides
    struct MyStruct test2;
    union MyUnion my_uval; // Work exactly like structs for access
    test.el1 = 1;          // Direct element access
    test_p->el2 = 2;       // Via pointer
    test2 = test;          // Copies the struct
    return 0;
}
