В libgmp есть интересный трюк, который эмулирует ссылки:
typedef mpz_t __mpz_struct[1];
и тогда вы можете написать так:
mpz_t n;
mpz_init(n);
...
mpz_clear(n);
Я бы не рекомендовал использовать этот метод, потому что он может быть непонятен для других, он все еще не защищает от того, чтобы быть NULL: mpz_init((void *)NULL)
, и он настолько же многословен, как и его указатель-указатель.