C / C ++ int [] vs int * (ponteiros versus notação de matriz). Qual é a diferença?

Eu sei que as matrizes em C são apenas ponteiros para dados armazenados sequencialmente. Mas quais diferenças implicam a diferença na notação [] e *. Quero dizer, em TODO o contexto de uso possível. Por exemplo:

char c[] = "test";

se você fornecer essa instrução em um corpo de função, ela alocará a string em uma pilha enquanto

char* c = "test";

apontará para um segmento de dados (somente leitura).

Você pode listar todas as diferenças entre essas duas notações em TODOS os contextos de uso para formar uma visão geral clara.