Depending on the compiler you use, one of those won't compile.
The second version:
char arr[4] = {"C","C++","Java","VBA"};
Declares
arr
to be an array of four characters, and then tries to supply it with a set of four pointer-to-character values.
Some compilers will complain "Too many initializers" because the first pointer alone provides all the data.
The first version:
char *arr[4] = {"C","C++","Java","VBA"};
Declares
arr
to be an array of four pointer-to-character values, and allocates space for four pointers (i.e. probably either 4*4 bytes on a 32 bit system, or 8*4 bytes on a 64 bit system) on the stack.
The second version only ever allocates 4 bytes - one for each character - so you can't load it with "strings" without causing memory problems.