Sorry, but char* ay declares 2D array of pointers to char.
Probably, coveredinflies wants to pass an array as a function argument so right example is most likely
void foo(char ay );
But it's not the same as
void foo(char **ay);
A pointer to an array is a funny thing in C and C++. Array name is implicitly converted in a pointer in all contexts except argument of sizeof operator. So no need in pointers to arrays.
But we can't pass 2D array declared as a[...][...] in the second foo because of its argument type is a pointer to a pointer to char, but not an implicit pointer to 2D array with 255 columns...
It's impossible to declare 2D array which can be passed as type** if a declarator does not know "how to define a pointer to a 2D array". He/she must declare an array of pointers then fill the array with proper pointers to 1D arrays and so on... It's impossible...