Let's literally take this line by line and hope anything you don't understand becomes crystal clear:
void f(thing t){
Here, you're not passing the array by reference, so it decays into a pointer to the first element of the array (t is a char *).
thing *p;
Here, p is a pointer to an array of 1 character, so char (*p) [1].
p=t;
Now you're trying to assign a pointer to a character to a pointer to an array. The types simply don't match (I get something like invalid conversion from char * to char (*)[1]).
*(*p)='C';
This simply dereferences p to get the actual array, which then decays to a pointer to the first element to be dereferenced, effectively giving you the first element.
In main:
thing g;
thing *h
Now you're not dealing with it being passed to a function. g is a char [1] and h is a char (*)[1].
h=&g;
h is a pointer to an array, g is an array. This makes perfect sense.
g[0]='A';
g is an array; this is normal.
*(*h)='B';
Here you're doing the same thing as in f().
In the modified function:
First of all, remember t is a pointer to the fist element (char *)
char * *p;
p is a pointer to char *.
p=&t; /* note the & */
You're assigning the address of a char * to a pointer to char *. Perfectly normal.
*(*p)='C';
*p dereferences p to get the char * (t). Another dereference gives you what's pointed to by t, which is the first element of the array.
I hope that clears up any confusion.