They're using a pointer to a pointer. It's easy enough if you remember this concept: In order to change something you pass to a function, you need to instead pass a pointer to that item. For example, if you have an integer outside of a function, and you wish to keep whatever changes happen inside the function, you use a pointer to it. Like so:
Code:
void foo( int *bar )
{
    *bar = 10;
}
...

int x;

foo( &x ); /* x's address is passed to the function, so it knows where it is */
That's in a nutshell what's happening. You pass the address of an object, so that you can use it to change the origional. This applies to pointers too. If you want to change what a pointer points to, like we changed what x contains, we pass a pointer to it. Same concept:
Code:
void foo( int **bar )
{
    *bar = somenewpointer;
}
...
int *xptr;

foo( &xptr ); /* allow xptr to be changed inside the function */

Quzah.