sobre a expressão “& anArray” em c

Primeiro, eu li isso:

array&array&array[0]

Tudo será o mesmo, desde que "array" seja realmente um array. Então eu tentei:

int main(){ 
     char ar[]={'a','b','c','\0'};
     printf("argument: &ar     %s\n",&ar);
     printf("argument: &ar[1]    %s\n",&ar[1]);
}

a saída:

argument:&ar   abc  
argument:&ar[1]  bc

Parece que&ar é tomado como um ponteiro para o primeiro elemento em vez de um ponteiro para "ar", que em si é um ponteiro para o primeiro elemento, se não me engano.

porque isso não deve ser como & (ponteiro para um char) são tratados, eu tentei:

char a='s';
char *pa=&a;
printf("argument: &pa   %c\n",&pa);

A saída para%c nem é um personagem. Nem deveria ser como um ponteiro para o primeiro elemento de um array tratado. Eu tentei:

char *pa=&ar[0];
char **ppa= &pa;
printf("argument: &pa   %s\n", ppa);

A saída para%s é, sem surpresa, um disparate; mas porque não tem&ar foi um disparate? Para sear eram um ponteiro, não deveria&ar ser tanto um ponteiro para um ponteiro como éppa?

Minhas perguntas:

É simplesmente "&" ignorado quando colocado antes de um nome de matriz? Os nomes das matrizes são simplesmente especiais?Em caso afirmativo, como o compilador verifica se o identificador que segue "&" é uma referência a uma matriz? Ele realmente procura por ele em uma lista de matrizes para declarado?

questionAnswers(3)

yourAnswerToTheQuestion