Спасибо, я это понял. Вопрос в том что же такое тогда массив? это ссылка или структура или че ваще? И зачем в языке два способа сделать одно и тоже?
Ну... на самом деле мало ли языков, в которых можно сделать одно и то же разными способами? На самом деле * нотация удобна когда у нас указатель на один-единственный элемент, тогда как-то глупо писать ptr[0] каждый раз, проще *ptr. И когда у нас модифицируется сам указатель, типа *ptr++ = 42.
Отличие между указателями и массивами состоит в том, что это разные типы данных, для которых, например, sizeof вернёт разные результаты. Например,
char chars[2];
char * ptr;
sizeof(chars) == 2 // всегда
sizeof(ptr) == 8 или 4 ил какое-то другое число, которое зависит от архитектуры
Ну и для обращения к элементам именно массива нотация chars[1] предпочтительнее.
А так можно и 1[chars] = 42 писать.