3

私はポインターthingy.graduedからポインターをいじっていました->ポインターの配列->関数ポインター->ポインターへのポインター..

これが私が行き詰まっているものです...ほとんどが複雑な構文です。

整数の配列があるとしましょう。

int arr[4] = {1,2,3..};

また、ポインターの配列があります

int* ptr[4];
ptr[0] = arr; 

ここで、ptr[0] は 1 を指し、ptr[1] は他の場所を指します。

これは完全に機能します!!

上記の背景を考慮して、これを試しました。

char* crr[4] ={"C","C++","C#","F#"};
char** btr[4];
btr[0] = crr;

これは、btr の oth 要素のポインターとして機能し、crr の別のポインター要素を指しています。

それから私はこれを試しました。

char* crr[4] ={"C","C++","Java","VBA"};
char** btr[4]= &crr; // Exception: cannot convert char* [4] *  to char**[4]

しかし、私がこれを行うと動作します:O

char* crr[4] ={"C","C++","Java","VBA"};
char* (*btr)[4]= &crr;

私は最後の 2 つのシナリオを理解していません。RHS Pls でのブラケットの使用について説明します。

4

3 に答える 3

3
char** btr[4]= &crr; // Exception: cannot convert char* [4] *  to char**[4]

これは、ポインターから (ポインターへのポインターの) 配列を初期化しようとしていますが、これはできません。(最初の例のように)指す最初の要素を初期化する場合は、crr次のようにします。

char** btr[4]= {crr};

最後の例は、(ポインターの) 配列へのポインターを宣言し、互換性のあるポインターから初期化しています。

(定数) 文字列リテラルへのポインターが含まれているため、元の配列はconst char *ではなくである必要があることに注意してください。char *

于 2013-10-21T17:35:20.117 に答える
2

sizeofまたは 単項演算子のオペランドである場合、または宣言で別の配列を初期化するために使用される文字列リテラルである場合を除いて&、型 "N 要素配列 " の式は次の式Tに変換 ("decay") されます。 「ポインタT」と入力すると、式の値が配列の最初の要素のアドレスになります。

あなたが書くとき

btr[0] = crr;

式のcrr型は「4 要素配列char *」です。sizeofor演算子のオペランドではないため、&「へのポインタchar *」、 or型に変換されますchar **。これは のタイプに一致しbtr[0]ます。

ただし、書くときは

char** btr[4]= &crr;

crrは演算子のオペランド&です。したがって、式の型&crrは「4 要素配列へのポインタchar *」、またはchar *(*)[4].

後置演算子は単項演算子[]よりも優先順位が高いため、括弧が必要です。**a[i]は常に として解析され*(a[i])ます。したがって、

T *a[N];               // a is an N-element array of pointer to T
T (*a)[N];             // a is a pointer to an N-element array of T
T *(*a)[N];            // a is a pointer to an N-element array of pointer to T

同じことがポインターと関数にも当てはまります。

T *f();                // f is a function returning a pointer to T
T (*f)();              // f is a pointer to a function returning T
T *(*f)();             // f is a pointer to a function returning pointer to T
于 2013-10-21T18:29:04.227 に答える