@Debojit Acharjee Your question is based on a false premise.
In C, the character, integer, and floating point types are intrinsic types. But in C, string is not a type. It is a concept, namely a contiguous series of char terminated by the char '\0'. While it is pretty common to use the phrase "pointer to string" as convenient linguistic short hand, what you really have is a pointer to char that points to the first character of a series that meets the definition above.
Therefore, in your code a is a pointer to char but b is not a pointer to string. Dereferencing a, if you ever bothered to set it up properly, would produce the char it points to. Dereferencing b would do the same. However, the %s format is not looking for a char; it is looking for the series of char. By not dereferencing b, you pass its value, the address of what it points to, to printf and then printf can access data at that address and subsequent addresses (courtesy of pointer arithmetic) to deal with each char that is in the string.
It would behoove you to remember that in C all function arguments are passed by value.