Writting day_of_month and month_day with pointers instead of array indexing
It would have been nice to see your daytab definition as well.  I'll just assume that you're satisfied with the way it's defined, and that the functions work as intended.

I find this condition in month_day() a bit monstrous:

if((leap == 1 &amp;&amp; (yearday &gt;= 1 &amp;&amp; yearday &lt;= 366)) || (leap == 0 &amp;&amp; (yearday &gt;= 1 &amp;&amp; yearday &lt;= 365)))


I would shorten it to the following.  Also, I've inverted the check, so that the function returns early if the parameters fail validation.  Returning early is a better habit, as it reduces indentation, and reduces mental load when reading the code by getting the simpler branch out of the way.

int leap = (year % 4 == 0) &amp;&amp; ((year % 100 != 0) || (year % 400 == 0));
if (yearday &lt; 1 || yearday &gt; 365 + leap) {
    return -1;
}
for (…) {
    …
}