配列とアドレス演算子に関して
Posted: 2014年1月17日(金) 15:34
配列名にアドレス演算子を作用させる操作は定義されているのでしょうか?
たとえば
を実行すると a と &a は同じ値になります。( p と &p は当然一般に異なる値になります。)
このコードにおいて、配列名 a は a[0] へのポインタになると思います。
しかしメモリ上に実体を持つポインタ変数 p とは違うのでアドレス演算子 & を作用させるのは未定義なのかなと思っていました。
しかし複数の環境で上のコードをためしたところどれも a = &a となります。
これは偶然でしょうか?
それともC言語では配列名にアドレス演算子を作用させる操作がこのように「配列名にアドレス演算子を作用させると、配列名と同じポインタ型の数値を返す」と定義されているのでしょうか?
たとえば
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言語では配列名にアドレス演算子を作用させる操作がこのように「配列名にアドレス演算子を作用させると、配列名と同じポインタ型の数値を返す」と定義されているのでしょうか?