Does this mean that example resolves to the literal it holds but example[0] resolves to H?
Yes. But note that in this case, example is converted to a pointer, as the appropriate overload of operator<< takes const char* as a parameter and treats the pointer as if it was the beginning of a null-terminated character array (a.k.a. C string).
It points to the first character of the literal. The characters that follow after the first can be accessed via pointer arithmetic. That's why the fact that elements of an array are adjacent in memory is important - if you have a pointer to any element of the array (and if you know which one it is), you can calculate the address of all other elements.
What. No. "Hi" is a string literal, not a memory address.
And "Hi" has nothing to do with the array example other than the fact that the characters of "Hi" are copied into the array example on initialization.