static Hero spin(Hero hero, const uint8_t* key)
static void damage(const Hero* hero, const Sprite* sprite);
This is analougous to good use of privacy in C++ classes.
hero = spin(hero, key);
Pointer aliasing is another thing. Inlining is easier with fewer pointers. A fun C++ experiment is to count your instruction and data cache points with valgrind's cachegrind with pod types both passed by value and by reference (&).
Performance of modern CPUs is very nonobvious.
Amazing how powerful pass by value can be when it comes to pod structs.