Дело в разнице между массивами и указателями. Она, вообще говоря, есть.
При инициализации
char array[] = «abc» выделяет память для нового строкового массива и устанавливает его элементы в «a»,«b»,«c» и "\0"
char *pointer = «abc» устанавливает pointer на строку «abc», которая, вообще говоря, может находиться (как строковой литерал) в защищенной области памяти (i.e. только для чтения).