Вопрос: Я слышал, что char a[] эквивалентно char *a...
Ответ: Ничего подобного! То, что Вы слышали, касается формальных параметров функций.
Объявление массива - это не объявление указателя. Объявление массива "char a[6];" требует определенного места в памяти для шести символов, которое будет известно под именем "a". То есть, существует место в памяти под именем "a", в которое будут помещены 6 символов.
С другой стороны, объявление указателя "char *p;" требует места только для самого указателя. Указатель будет известен под именем "p" и может указывать на любой символ или непрерывный массив символов.
Как обычно, лучше один раз увидеть, чем сто раз услышать.
Объявление
char a[] = "hello";
char *p = "world";
породит структуры данных, которые могут быть представлены так:
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+