You can have pointers to values(variables):
int x = 3;
int* ptr = &x;
just as well as to the other pointers which is used for example in dynamically allocated 2D arrays:
int rows = 3, cols = 5;
int **arr = (int **)malloc(rows * sizeof(int *));
for (int i=0; i<rows; i++)
arr[i] = (int *)malloc(cols * sizeof(int));
In the code above **arr is a pointer to a block of memory storing 'rows' ammount of pointers. Eeach of this pointers is arr[i] (which is by the way equal to '*(arr+i)' - if you've heard about pointer arithmetic then you'll probably know why it is like this) and means each row of the array. Then each of these rows is initialized in 'for' loop similarly to initialization of **arr.
In your code it is similar so i'll try to explain it to you step by step:
pp = (short**)malloc(sizeof(short*));
is the same as:
short **pp = (short**)malloc(sizeof(short*));
and what it does is it initializes pointer to pointer(s), in this case it is a pointer to a single pointer which is indicated by:
If it should point to, for example 4 pointers it would be:
Next line initializes 1st and only row of this array so it stores 1 variable with the type of short.
So basically you get what would be a 2D array but has size of 1x1.
Next line after that is just giving this 1 place in array a value. By the way **pp is the same as pp.
Then it's just the matter of printing the variable out and cleaning memory after our 2D array.
I hope I helped, at least a little :)