In C, a string literal is an array, since strings in C are arrays of characters.
In C, when an array appears in an expression, almost without exception, what you get (the "value" of the array for the purposes of evaluating that expression) is a pointer to the array's first element.
So if you say
int a[10];
*a = 7;
, that does precisely the same thing that a[0] = 7 would do. And, having done that, you could test it by saying if(*a == 7).
And the situation is 100% analogous to the example you posted. The string literal "Stack" is an array, so when you use it in an expression, its effective value is a pointer to its first element.
Expanding things out to see the "hidden" internal steps, it works identically to what would have happened if you had written
char stringliteral[] = "Stack"; /* the string literal is actually an array */
char *temporary_pointer;
temporary_pointer = &stringliteral[0]; /* we implicitly get a pointer to the array's first element */
if('S' == *temporary_pointer)
...
Addendum: Another demonstration of this fact, that a string literal is actually an array, crops up if you're writing code to convert a number to its string representation. Any integer-to-string algorithm inevitably ends up computing digit values which it must convert to the corresponding characters. If you're working in base 10 or less, you can convert digits to characters by simply adding an offset: dig + '0'. But another way, which works for e.g. hexadecimal digits as well, is "0123456789abcdef"[dig].