Salve, ho dei problemi a fare quest'analisi di codice!

codice:
int f(char c, char *cs)                          
{                                                         
     while(*cs!='\0')                              //fino a che finisce il vettore di caratteri
     {
          if(c==*cs) return 1;                   //se il carattere corrisponde esce con 1
          cs++;                                                //altrimenti passa al successivo
     }
     return 0;                                                //se non trova niente ritorna 0...
}

char* g(char* s, char* cs)
{
     while(!f(*s,cs) && *s!='\0')            //...se non ha finito l'altra stringa....
          s++;                                          //...prova col carattere successivo
     return s;                          //qui?? ritorna il carattere che hanno in comune o 
}                                //l'ultimo se non ne hanno? o ritorna più di un carattere?

int main(int argc, char** argv)
{
     char* a[3]={"quare", "id", "faciam"};
     char* b[3]={"aeiou", "qwerty", "quiquoqua"}

     int i;
     for(i=0; i<3; i++)
          printf("%ld\n", g(a[i], b[i])-a[i]);      //qui non capisco la sottrazione...
}
non riesco a capire l'operazione della printf...se qualcuno è così gentile da spiegarmelo...
grazie!