Вопрос: Я слышал, что 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 |
+-----+ +---+---+---+---+---+---+