As with all good "either ... or" questions, the answer is either "it
depends", or "none of these".
These two ways of of passing a struct to a function differ not only in
"programming practice", but also in their actual effect. The first
will let changes to *r done inside the function propagate to the
calling function, the second won't.
If that's not what the function is supposed to be doing, be sure to qualify
the struct as 'const':
thereby making both the pointer itself and the struct it points to
read-only for function().
That settled, the remaining issue is indeed one of good practice, but
still the answer is "it depends". To be precise, it depends on the
size of the struct, and the platform this will be used on, whether you
can afford passing a copy of the struct instead of just the pointer.