That way, users of the library would have no direct access to the fields of the struct (e.g. hashtable->num_buckets;), they'd have to use a function declared at the correspondent header file. (e.g. get_num_buckets(hashtable);).
Direct access to member fields could break the data structure because data structures always needs to follow certain rules in insertion and deletion.