Question: In my knowledge the `%c` expects the int value (as `char` is treated as integer in **C**), and `%s` expects the `char *` as argument, but my doubt is, **does the %s need a pointer to a block of characters? Can it points to a single character in double quotes?** 

For example:

```
char * s = "string"; 
printf("%s",s);// output: string 

```

How is the compiler able to figure out the block of memory where the string is present and terminated by `'\0'`?.

Answer: 
A single character in double quote still is a C-String, actually containing two characters: The single character plus the terminating null character:

```
char const* str = "a"; // actually points to an array { 'a', '\0' }

```

So you still use it with `%s`. Actually, you *can* use it with `%c`, too, if you dereference the string:

```
printf("%c\n", *str);
//             ^

```

You could do that with any C-String (with exception of the empty one ""), but only the first character would then be printed...

*Addition in response to your comment:*

Function calls (at least with cdecl and stdcall calling conventions) are done by placing the function arguments onto the stack (on most modern systems, types smaller than int are promoted to int on the stack). `printf` then simply parses the format string, if it discovers %s, it will interprete the next `sizeof(void*)` bytes on the stack as a pointer to a null terminated string (thus pass `str` directly), if it discovers %c, it reads a character directly from the stack -- so you need to place one there and not a pointer, thus you need to dereference.
The string is made up of character, just as the char array is made up if characters. 

Compilers should be smart, and gcc must have a function that can identify which is which, and peform the appropriate operations (such as adding a null terminator)

And to answer your question, yes it will still print to the console, just as 

```
char * s = "string"; 
printf("%s",s);// output: string 

```

Will print to the console.