【C言語】&配列名の値とは?

問題です。以下の値はそれぞれどうなるでしょうか?

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]のアドレス

 

コメント

タイトルとURLをコピーしました