char s[ ] = "AB";
書き換え可能な領域にAB\0が確保されてその先頭アドレスがsにセットされる

char *p = "12";
書き換え不可能なReadOnlyの領域に12\0が確保されてその先頭アドレスがpにセットされる

コンパイラの人がそうやると決めてやってるからとしか