(Ignoring the match problem, as mentioned in other answers ...)
Each string literal that you write ( "Mathew Emerson" , "Bob Jackson" , ...) requires some storage space in the compiled code later.
As if you were writing somewhere
char const[] MathewEmerson = { 'M', 'a', , 'o', 'n', 0 };
So you can build your char const * array, and then:
char const* names[] = { &MathewEmerson[0], };
As with arrays, the address of the array itself and its first element are the same, and arrays are implicitly converted to pointers, instead you can write
char const* names[] = { MathewEmerson, };
All this is done implicitly for you if you use string literals.
Similarly, you could write:
int *ptr[] = {var, &var[1], &var[2], &var[3]};
(note: var , not &var[0] for the first element), and if we go further, even:
int *ptr[] = {var, var + 1, var + 2, var + 3};
The result would always be the same. Readability, clarity of one option and another? Well, another topic ...