Exercises 8-10
ex8.c  - sizeof() function, char size is 1 byte
ex9.c  - int array[4] = {1;} fills first slot with 0 and others with 1
         char array[4] = {'a'}; fills first slot with 'a' and next with '\0'
ex10.c - argc, argv basic stuff.
Exercise 11
ex11.c - Using a while loop
Exercise 14
ex14.c - Using isblank() makes things convenient
         strlen(char *) is located inside 'string.h'
Exercise 15
ex15.c - Four different ways to use pointers
         One confusing one is if you do pointer_name[i] it's the same as
         *(pointer_name + i). When from I know, poiinter's aren't the same as
         arrays. Weird.
Exercise 16 - Stack (no pointer) vs. Heap (pointer)
ex16.c - strdup(char *) -
            This function is located in stdlib.h (I think)
            It allocates new memory for a duplicate string with malloc()
            After we are done using it, even if it's in a pointer, we have to
            use the free() function on the new string otherwise valgrind will
            complain about memory leaks. (Try removing free(who->name) and see)
        assert(expression) -
            This function is located in assert.h
            We have used it here to make sure tha malloc works properly.
            If expression is false, prints error message and terminates program
ex16-2.c -
        Does everything that ex16.c does but without pointers
        When we use pointers we are malloc-ing memory from the heap and this
        memory needs to be free()-ed after usage.
        Over here, as we allocate memory on the stack, after we exit the scope
        of the structure, the memory is free()-ed by C.
        Even in this case, we need to explicitly free() the memory allocated
        when we used strdup() otherwise Valgrind will complain