Arrays cannot be passed to functions, so whenever you see [brackets] as a parameter, it's actually passing a pointer. Therefore... these two are identical:
void calculate(char *x) and void calculate (char x[])
They both have a pointer to a char.
And these two are also identical: void calculate(char **x) and void calculate( char *x[] )
If you need to change the value of the pointer pointed to but can't use references for some reason (e.g. working with a C library). This is more preferable: