Java's stupid (=political) C compatibility C started as a simple language on top of assembly language. Lingual considerations of abstractional consistency had no priority. As error awareness. Everything is an int, boolean, pointer, array, functions. In fact declarations have a weird kind of syntax requiring a large parsing. Or for a human a bit of back-and-forth reading. As java was launched, it intended to improve some parts of C++/C. So in java the entire type info becomes separate from the variable.
char[] jarr; // Normal java.
But as novice java kept the C style for accustomed C/C++ programmmers:
char jarr[]; // Obsolete C style java.
If one looks at java's:
char[] jarr = new char[1024];
one get's an idea why C chose:
char str[1024];
The 1024 is not part of the `char*` data structure as field, but some compile time allocation. In general one should accept C as it is: a compiler strong, thin layered, fun language. For language features it is pedagogical unsuited w.r.t. type systems, actual data, error prevention and so on. Taking any language, like a simple Pascal, might give less confusion with pointer versus array like in parameter passing. Then going back to C one sees that arrays are passed as pointers i.o. the pointed-to data as in Pascal.