Welcome to the worst part of C.
The [] syntax is used for arrays. The * syntax is used for pointers. You can treat pointers and arrays the same way, most of the time, but not when declaring them. That's because when you are declaring an array, the compiler sets aside some space for the array's items. But when you are declaring a pointer, you don't get any extra space set aside. The pointer is just a place for you to store a memory address.
In other words,
// Sets aside space for one memory address. (Likely 4 or 8 bytes).
char *a;
// Sets aside space for an array of ten characters. (Likely 10 bytes).
char b[10];
// This is an error because the compiler doesn't know how much space to set aside.
char c[];
// If you say "b", the compiler will automatically return to you
// the memory address of b's first entry, so you can do this:
a = b;