たとえば
int a[2];
int *p;
p = (int *) malloc(2*sizeof(int));
printf("a : %p\n", a);
printf("&a : %p\n", &a);
printf("p : %p\n", p);
printf("&p : %p\n", &p);
このコードにおいて、配列名 a は a[0] へのポインタになると思います。
しかしメモリ上に実体を持つポインタ変数 p とは違うのでアドレス演算子 & を作用させるのは未定義なのかなと思っていました。
しかし複数の環境で上のコードをためしたところどれも a = &a となります。
これは偶然でしょうか?
それともC言語では配列名にアドレス演算子を作用させる操作がこのように「配列名にアドレス演算子を作用させると、配列名と同じポインタ型の数値を返す」と定義されているのでしょうか?