私の先生は私に違いを見つけるように頼んだ.誰か私を助けることができますか? 実際には、最初の部分はポインターの配列ですが、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.