ret is an input parameter. You are simply passing the address of a variable to the function.
ret is an output parameter. You get back a value from the function. Such value can, for example, be set to
pthread_join, you get back the address passed to
pthread_exit by the finished thread. If you pass just a plain pointer, it is passed by value so you can’t change where it is pointing to. To be able to change the value of the pointer passed to pthread_join, it must be passed as a pointer itself, that is, a pointer to a pointer.