私の先生は私に違いを見つけるように頼んだ.誰か私を助けることができますか? 実際には、最初の部分はポインターの配列ですが、2番目の部分が何を意味するかはわかっています。このコードを試したので、両方とも同じではありません。
i = 1;
j = 2;
x[0] = &i;
x[1] = &j;
「左辺値が必要です」というエラーが発生しました
int *x[3];
x
への 3 つのポインタの配列を次に示しますint
。
int (*x)[3];
x
これは、3 つの の配列へのポインターですint
。
両方の使用例を次に示します。
int* arrayOfPointers[3];
int x, y, z;
arrayOfPointers[0] = &x;
arrayOfPointers[1] = &y;
arrayOfPointers[2] = &z;
int (*pointerToArray)[3];
int array[3];
pointerToArray = &array;
HTH
まず、C宣言は式のタイプを反映していることを忘れないでください(つまり、宣言は使用を模倣します)。
たとえば、整数へのポインタがあり、ポイントされている整数値にアクセスする場合は、次のように単項演算子を使用してポインタを逆参照します。*
int x = *p;
式 のタイプは*p
、int
であるため、ポインタの宣言は次のようになりますp
。
int *p;
int
ここで、 ;へのポインタの配列があるとします。特定の整数値にアクセスするには、配列に添え字を付けて正しいポインターを見つけ、結果を逆参照します。
int x = *a_of_p[i];
下付き演算子[]
は単項*
演算子よりも優先順位が高いため、式は;*a_of_p[i]
として解析されます。*(a_of_p[i])
式の結果を間接参照していますa_of_p[i]
。式 の型はであるため*a_of_p[i]
、int
配列の宣言は次のようになります。
int *a_of_p[N];
今それを裏返します。へのポインタの配列の代わりに、の配列へのポインタがint
ありますint
。特定の整数値にアクセスするには、最初にポインターを逆参照してから、結果に添え字を付ける必要があります。
int x = (*p_to_a)[i];
はより[]
も優先順位が高いため、式の結果*
に添え字が適用されるように、括弧を使用して演算子を強制的にグループ化する必要があります。式のタイプがであるため、宣言は次のようになります。*p_to_a
(*p_to_a)[i]
int
int (*p_to_a)[N];
少し毛むくじゃらに見える宣言を見つけたら、左端の識別子から始めて、それを覚えて、よりも優先順位が高いことを覚えておいてください。ポインター[]
の()
配列、配列へのポインター、ポインターを返す関数です。 、および関数へのポインタです。*
*a[]
(*a)[]
*f()
(*f)()
x -- x
(*x) -- is a pointer
(*x)[N] -- to an N-element array
int (*x)[N] -- of int
x -- x
x[N] -- is an N-element array
*x[N] -- of pointer
int *x[N]; -- to int.