hi,
when we declare a pointer like "int *a" ,anything before "*" tels ihe type of variable of which addres the ponter will store.
like in this case "a" will store the address of a int type
and everything after "*" tells about the tupe of the pointr
like in "const char * const p",
"const char" is the type of var whose address will bestored in p while "const" after "*" tells about the ponter itself that is it is a constant pointer"
now in ur prog. when u write const char *q="hello",it means that "hello"is a constant and can;t be modified hence, *q='m' ,an error
while in ,char *const p="hai" p is aconst ponter ,so p="bye "is not valid.