1) Using fflush() on any input stream gives undefined behaviour, regardless of whether you are using scanf() ot fgets(). In short, don't use fflush(stdin) - ever.
2) Yes, a common use case is to employ fgets() to read a string, and sscanf() to scan the received string. There is no linkage of any buffer to fgets() or sscanf() in doing so (at least, no more linkage than is implied by fgets() reading characters to an array, and sscanf() to interpret the data that fgets() places there).
3) The * modifier on a format means to discard data, rather than write it to a subsequent argument. So, %*s means act as if %s was used, but discard the string rather than writing it.
So, in that link
Code:
sscanf (sentence,"%s %*s %d",str,&i);
is equivalent to
Code:
sscanf(sentence, %s %s %d, str, buffer_to_discard, &i);
if we assume that buffer_to_discard is an array of char large enough to hold the results of the second %s format. The advantage of %*s is that it discards the second string, without having to mess around trying to estimate its length (or worry about chaos that might ensue from a buffer overflow if buffer_to_discard is too short).
Note: the return value from the second sscanf() call will be different than the first, but the code you linked to is not checking the return value anyway.