1

私の先生は私に違いを見つけるように頼んだ.誰か私を助けることができますか? 実際には、最初の部分はポインターの配列ですが、2番目の部分が何を意味するかはわかっています。このコードを試したので、両方とも同じではありません。

i = 1;
j = 2;
x[0] = &i;
x[1] = &j;

「左辺値が必要です」というエラーが発生しました

4

5 に答える 5

3
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

于 2012-09-26T13:10:19.327 に答える
2

まず、C宣言は式のタイプを反映していることを忘れないでください(つまり、宣言は使用を模倣します)。

たとえば、整数へのポインタがあり、ポイントされている整数値にアクセスする場合は、次のように単項演算子を使用してポインタを逆参照します。*

int x = *p;

のタイプは*pintであるため、ポインタの宣言は次のようになります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.  
于 2012-09-26T13:37:55.980 に答える