I used to have issues with C typing too, until I learned how it was created.
In C, the type is described in the way you would use a variable of that type.
Therefore, when you see:
int *x;
it means that the expression *x is of type int, so x is variable of type pointer-to-int.
And if you see:
int x[5];
it means that the expression x[3] is of type int, so x is a variable of type array-of-int.
So, to get to your expression:
int (*x)[];
it means that the expression *x is of type int[] (ie, an array of int of unknown size). Therefore x is a variable of type pointer-to-an-array-of-int.