See this is easy but tricky as well.
x is a variable which contains value 1 let say the address of x is 100 .
y is a variable which contains value 9 let say the address of y is 200 .
Now u and v are single pointer pointing to addresses 100 and 200 respectively. And assume the address of u is 300 and v is 400.
And a and b are double pointer pointing to addresses 300 and 400 respectively.And assume the address of a is 500 and b is 600.
Now ubswap() function is called which passes the two double pointers a and b.
Note: a is double pointer , so *a will be a single pointer.
int *temp = *a ;
This line mean temp is a single pointer which pointing to that location for which *a is pointing to .
And we know that *a or just say u , which is single pointer pointing to address location 100 which is nothing but address of x.
Similarly, *b or just say v , which is single pointer pointing to address location 200 which is nothing but address of y.
So basically temp is pointing to x.
*a = *b ;
Means now *a or u starts pointing to y.
*b = temp;
Now *b or v is pointing to x;
And now return.
If we see carefully u and v pairs of variables got swapped as initially u was pointing to x but now it is pointing to y and v intially was pointing to y but now to x.
So, Option B is correct.
Hope, this helps.