Well, if you're using ship
only in the ISR, then you might as well declare it static inside this function:
void interrupt my_keyboard_interrupt_handler()
{
static space_ship ship = {0};
...
print_space_ship(ship);
}
But if you're using it in other threads or ISRs, then you have to declare it as a shared (global) variable, and protect it with a standard OS resource (such as Semaphore, or more likely - Mutex) where needed.
If that is indeed the case, then passing it as an argument to the ISR is not going to make any difference.