C / C ++ int [] против int * (указатели против обозначения массива). В чем разница?

Я знаю, что массивы в C - это просто указатели на последовательно хранимые данные. Но какие различия подразумевают разницу в обозначениях [] и *. Я имею ввиду во ВСЕХ возможных контекстах использования. Например:

char c[] = "test";

если вы предоставите эту инструкцию в теле функции, она выделит строку в стеке, пока

char* c = "test";

будет указывать на сегмент данных (только для чтения).

Можете ли вы перечислить все различия между этими двумя обозначениями во ВСЕХ контекстах использования, чтобы сформировать четкое общее представление.