char *p="abcd";
printf("%c\n%c\n%c\n%c\n",p[0],p[1],p[2],p[3]);

というようなことができる理由がわかりません。
pは、初期化と共に宣言されて、中には文字列リテラルの先頭値が入るのだと思いますが、
その後どうして配列みたいにp[0]とか言う風にして色々しているのかサッパリわかりません。
printf("%s",p);
なら何も疑問はありませんが・・。