C宣言は、オブジェクトではなく、式のタイプに基づいています。
int
名前付きのへのポインタがあり、pi
それが指す整数値にアクセスする場合は、次のようにポインタを逆参照する必要があります。
x = *pi;
printf("%d", *pi);
*pi = 1 + 2;
など。式のタイプは *pi
次のint
とおりです。したがって、宣言は次のように読み取る必要があります。
int *pi;
char
ここで、 ;へのポインタの配列があると仮定しましょう。任意の文字に到達するには、最初に配列に添え字を付けてから、結果を逆参照する必要があります。
c = *pc[i];
if (*pc[j] == 'a') {...}
繰り返しますが、式のタイプは、 *pc[i]
でchar
あるため、宣言は次のようになります。
char *pc[N];
*pi
とは両方とも宣言*pc[N]
子として知られており、型指定子によって指定されていない追加の型情報を指定します。IOW、の配列とポインタは宣言子の一部として指定され、-nessは型指定子によって指定されます。 pc
char
どちらのスタイルが適切かという質問については...
どちらも「正しい」わけではありませんが、私(および他の多くのCプログラマー)は、言語文法(宣言子の一部)をより厳密に反映し、複数の項目を宣言するときの混乱を避けるのに役立つため、ではT *p
なく書くことを好みます。私は、ポインターになることを 書いたり期待したりする人々の例をあまりにも多く見ました。T* p
*
T* a, b;
b
その批判に対する通常の反応は、「1行に複数の項目を宣言しないでください」です。その回答に対する私の回答は、「宣言者を正しく記述すれば問題はない」というものです。
このスタイルを好む多くのC++プログラマーの間には異なる考え方があり、コードを読みやすくする ことができるT* p
場合がいくつかあります(C ++に限定されます) 。
ただし、これは次の単純なポインターに対してのみ機能しT
ます。ポインターの配列、配列へのポインター、関数へのポインター、関数へのポインターの配列へのポインターなどを処理し始めると、パラダイムは急速に崩壊します。つまり、何かを書くことです。お気に入り
T* (*(*p)[N])(); // p is a pointer to an array of pointers to functions
// returning pointers to T.
混乱した思考を示しているだけです。ただし、パラダイムに従わなければならないことを本当に本当に感じている場合は、いつでも一連のtypedefを作成できます。T* p
編集
もう一度試してみましょう。
typedef T* TPtr; // pointer to T
typedef TPtr TPtrFunc(); // function returning pointer to T
typedef TPtrFunc* TPtrFuncPtr; // pointer to function returning
// pointer to T
typedef TPtrFuncPtr TPtrFuncPtrArray[N]; // N-element array of pointer to function
// returning pointer to T
TPtrFuncPtrArray* p;
神の愛のために、そうしないでください。