5
int (*x)[10];
で
int (*x)[10];
x
は10
int
の配列へのポインタです
なぜこのコードはコンパイルされません:
int arr[3] ;
int (*p)[3] =arr;
しかし、これは動作します:
int arr[3];
int (*p)[3] =&arr;
int (*x)[10];
で
int (*x)[10];
x
は10
int
の配列へのポインタです
なぜこのコードはコンパイルされません:
int arr[3] ;
int (*p)[3] =arr;
しかし、これは動作します:
int arr[3];
int (*p)[3] =&arr;
arr
は、int*
と評価される式です(これは有名な「配列の減衰からポインタへ」の偉業ですure)。
&arr
は、int (*)[3]
と評価される式です。
sizeof
または&
演算子のオペランドを除いて、すべての式の配列の最初の要素を指す配列名は 'decay'です。これら2つの操作では、配列名は配列のままです(C99 6.3.2.1/3「Lvalues、配列、および関数指定子」)。
それはまったく同じ理由で動作しません:
int i;
int* pi = i; // error: no conversion from int to int*
1:私はまた、異なるタイプのが、両方の式が同じポインタアドレスを返す、と指摘します。 –