問題です。以下の値はそれぞれどうなるでしょうか?
char arr[9]; printf("%p\n", arr); // (A) printf("%p\n", &arr); // (B) printf("%p\n", &arr[0]); // (C) /*「%p」はアドレス表示書式です */
答えは
(A)(B)(C)すべて同じ値で、配列の先頭アドレスになります。
私の環境で実際に実行すると、すべて同じ値「008FFD94」が出力されました。
なぜそうなるのか、詳細はこちら

「&配列名」の意味について
初質問です。 確認のための質問なのですが... 現在読んでいる本でchar array[];と宣言した1次元配列について、「&arrayはchar*型のarrayにアドレス演算子を付けたものだから
引用すると
配列はその先頭要素へのポインタへ暗黙の型変換をされる
ただし、この暗黙の型変換には例外があり、&
を適用するときは起こらない
arrを使うときには、暗黙的キャストが起きていたんですね。
そしてさらに「&」をつけて使うと例外処理が起きると。
ずっとarrのことをポインタ変数だと勘違いしてました。arrは(ここでは)char[9]型の変数だったんですね(当たり前)。いろいろなことに納得。
コード解説
char arr[9]; printf("%p\n", arr); // 暗黙の型変換により、配列の先頭要素へのポインタ printf("%p\n", &arr); // arrのアドレス printf("%p\n", &arr[0]); // arr[0]のアドレス
コメント