1. From the Advanced Programming in Unix Environment:
...
The difference between getc and fgetc is that getc can be implemented as a macro, whereas fgetc cannot be implemented as a macro. This means three things:
The argument to getc should not be an expression with side effects.
Since fgetc is guaranteed to be a function, we can take its address. This allows us to pass the address of fgetc as an argument to another function.
Calls to fgetc probably take longer than calls to getc, as it usually takes more time to call a function.
...
2.
Seems like the differences are, in 99.9% of the cases, meaningless.
One point which may make a difference - The man page says getc() may be implemented as a macro which evaluates stream more than once.
It could lead to strange behavior in some (not very useful) cases, e.g.:
FILE*my_files[10]={...},*f=&my_files[0];for(i=0; i<10; i++){int c = getc(f++);// Parameter to getc has side effects!}
If getc evaluates f++ more than once, it will advance f more than once per iteration. In comparison, fgetc is safe in such situations.