My rule is simple: use * when you want to show that value is optional and thus can be 0.
Excluding from the rule: all the _obj_s around are stored in containers and you don't want to make your code look ugly by using everywhere foo(*value);
instead of foo(value);
So then to show that value can't be 0 put assert(value);
at the function begin.