its like this:
s stored the address location
*s stores the value stored in the first position of s
for printf and all functions that use string (i.e. char *) values, you pass the address and all manipulation etc happens to the value stored at address using address pointer -> pointer manipulation
when u print as:
printf("%s", *s); --> this should print junk
but when u print as:
printf("%c", *s); --> this should print the char at first byte location of s
and if u print as:
printf("%s", s); --> this should print the entire string stored in s
read a book on pointers, it will take too long to explain here. and its already explained very well in many books.
also there is a chance your current program (as it is) may core dump. this is because u r defining in one statement and then assigning in another. but since you did not allocate memory before proceeding to assign, your program will core dump. to resolve this, use:
char *s="hello";
doing this does definition, allocation of memory and assignation all at the same time.