#include <stdio.h>
#include <string.h>

#define N 2   /* defines the number of employees */ 

typedef struct
{
        int age;
        float salary;
        char * fName;
        char * lName;
}employee;

/* the functions are now passed pointers the structure rather than the 
   structure itself. So the functions PrintInfo and RaiseSal are passed a 
   memory address not the value of a variable */

void PrintInfo ( employee *emp);
void RaiseSal  (employee *emp);

main()
{
   /* Create an array of size N and of type employee */
   employee emp_list[N] = { {24,100000.00, "Jack", "Hill"}, 
                            {25,200000.00, "Jill", "Hill"} 
                          };   
   int i;

   for (i=0;i<N;i++)
     {
       PrintInfo( &emp_list[i] ); /* PrintInfo called with argument the memory
				     address of emp_list[i] */  
       RaiseSal( &(emp_list[i]) ); /* ditto RaiseSal */
       PrintInfo( &emp_list[i] ); /* Printinfo again to see any changes */

     }    /* end of loop over i*/
}

void PrintInfo( employee *emp )
{
  /* now to print out the info. about emp_list[i] we use the pointer to the 
     structure, called emp: emp->fName is the same as (*emp).fName and *emp is
     the value of the variable of which emp is the address ie. it is 
     emp_list[i] therefore (*emp).fName is just emp_list[i].fName */

  printf("%s %s is %d years old.", emp->fName, emp->lName, emp->age);
  printf("\n%s's salary is %.2f.\n", emp->lName, emp->salary);

}

void RaiseSal(employee *emp)
{
 /* the same comments about pointers, as in PrintInfo apply here. 
    also this function is now declared as "void" ... this is because we have 
    not copied a structure to the function and we are not copying one out.
    the statement below is equivalent to (*emp).salary *=1.5 which means
    ( emp_list[i] ).salary is multiplied by 1.5.
    so we accomplish the change to emp_list[i].salary by "reference" rather 
    than by passing its value to the function.				   */

  emp->salary *= 1.5;
}