In expressions array designators are implicitly converted to pointers to their first elements.
From the C Standard (6.3.2.1 Lvalues, arrays, and function designators)
3 Except when it is the operand of the sizeof operator or the unary &
operator, or is a string literal used to initialize an array, an
expression that has type ‘‘array of type’’ is converted to an
expression with type ‘‘pointer to type’’ that points to the initial
element of the array object and is not an lvalue. If the array object
has register storage class, the behavior is undefined.
String literals have types of character arrays. From the C Standard (6.4.5 String literals)
6 In translation phase 7, a byte or code of value zero is appended to
each multibyte character sequence that results from a string literal
or literals.78) The multibyte character sequence is then used to
initialize an array of static storage duration and length just
sufficient to contain the sequence. For character string literals, the
array elements have type char, and are initialized with the individual
bytes of the multibyte character sequence...
So for example in this expression
s2 == s3
there are compared addresses of the first characters of two string literals.
Moreover if to write for example
"aaa" == "aaa"
then the expression can yield either 1 or 0 depending on compiler options because according to the C Standard (6.4.5 String literals)
7 It is unspecified whether these arrays are distinct provided their
elements have the appropriate values. If the program attempts to
modify such an array, the behavior is undefined.
If you want to compare string literals as arrays instead of comparing addresses of their first characters you should use standard C function strcmp
declared in the header <string.h>
For example
#include <string.h>
//...
printf("s1 == s2: %d\n", strcmp( s1, s2 ) == 0 );