char array[3] = "ab"; と宣言したとき、
[C99 6.3.2.1]から式中の array は配列の先頭要素を指すポインタ(points to the initial element of the array object)となりますが、
このポインタ自体はメモリ上に確保されるのか、と疑問に思い調べていたのですがわかりません。
検索で探してみたら、
と載っていて、なるほどと思う内容だったのですが、アドレス定数の定義とは反していると思いました。char a[5];」の宣言では、配列要素のchar型5個分のメモリ(5バイト)が実際に確保されます。そして、配列名aは、配列の先頭アドレスを示すアドレス定数となります。アドレス定数は、値が定数であるポインタと考えられます。なお、aは定数であるため、a自体を格納するメモリ領域は存在せず、aの値を変更するような操作(a++とかaへの代入など)はできません。つまり、配列の宣言とは、「配列要素分のメモリ確保を伴う定数のポインタの宣言である」と言えます。[http://journal.mycom.co.jp/articles/200 ... /index.htm から一部引用]
C99 6.6 Constant expressions 9段落 address constant には
An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator;
となっており、array は、
address constant is a null pointer
pointer to an lvalue designating an object of static storage duration
pointer to a function designator
のいずれでもないですよね?
ただその後に、
implicitly by the use of an expression of array or function type.
から、「アドレス定数は配列型の使用によって暗黙に生成される。」とも読めるのですが
pointer to an lvalue designating an object of static storage duration の
of static storage duration と書いてあることで意味がわからなくなります。
array は静的記憶域期間のオブジェクトを指し示す左辺値ではないですよね?
配列に対する単項&演算子の例外[C99 6.3.2.1]がなければ、単項&演算子を使い &array で確認出来ると思うのですが、、、。
それとも処理系依存の定義なのでしょうか?
もしそうなら、それが定義されている項目が知りたいです。
正直知らなくて困らないことだとは思うのですが、はっきりポインタと書かれているので
興味本位で知りたくなりました。
ご存知の方いらっしゃいましたらご教示下さい。
よろしくお願いします。