While the types of the three are different :
- sis a- char[32](an array of 32- chars), which transparently decays to a- char*where needed
- &s[0]is a- char*(a pointer to- char)
- &sis a- char(*)[32](a pointer to an array of 32- chars)
they all resolve to the same value (the start address of the character array). So, when passing it to printf, which expects a char*, the result will be the same for all 3 (assuming the object representation of a char(*)[32] is the same as that of a char*, which is implementation dependent, but commonly the case).
Only the first two are valid though - the third just works by accident.