Это может помочь.
Разборка
char charArray1[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";
с GCC8.3 показывает
charArray1:
.string "Array"
.LC0:
.string "Array"
charPtr1:
.quad .LC0
charPtr2:
.quad .LC0
Другими словами, два указателя указывают на одну и ту же ячейку памяти, содержащую строку «Массив», в то время как массив содержит собственную копию строки.
Как следует из ссылки, память для массива char разделена таким же образом из-за различных рассматриваемых типов. Что касается указателей, поскольку их работа заключается в том, чтобы просто указывать на некоторые данные, возможно, компилятор решит оптимизировать дублированные выделения для одних и тех же литеральных данных.
Буквальные данные для указателей доступны только для чтения.