のみ*、[]および()演算子は(C ++が追加されます宣言でどんな意味を持っている&が、我々はここでそのに行くことはありません)。
宣言で
int *p;
int-ness p型指定で指定されたintのポインタらしをしながら、pで指定される宣言子 *p。
タイプのはp「へのポインタですint」。この型は、型指定子intと宣言子の組み合わせによって完全に指定されます*p。
宣言では、宣言子は、宣言されているものの名前(p)と、型指定子(「ポインタ」)によって提供されない追加の型情報を紹介します。
T v; // v is a single object of type T, for any type T
T *p; // p is a pointer to T, for any type T
T a[N]; // a is an N-element array of T, for any type T
T f(); // f is a function returning T, for any type T
これは重要です-ポインター性、配列性、および関数性は、型指定子1ではなく、宣言子の一部として指定されます。あなたが書くなら
int* a, b, c;
次のように解析されます
int (*a), b, c;
したがってa、へのポインタとしてのみ宣言されますint。bそしてc、通常のように宣言されているintの。
*、[]、および()演算子は任意の複雑なタイプを作成するために組み合わせることができます。
T *a[N]; // a is an N-element array of pointers to T
T (*a)[N]; // a is a pointer to an N-element array of T
T *(*f[N])(); // f is an N-element array of pointers to functions
// returning pointer to T
T *(*(*(*f)[N])())[M] // f is a pointer to an N-element array of pointers
// to functions returning pointers to M-element
// arrays of pointers to T
お知らせその*、[]と()彼らは式の中で行うことを宣言して、同じ優先順位規則に従います。 宣言と式の両方と*a[N]同様*(a[N])に解析されます。
これで実現する本当に重要なことは、宣言の形式がコード内の式の形式と一致することです。元の例に戻ると、という名前の整数へのポインターがありますp。その整数値を取得したい場合は、次のように*演算子を使用して逆参照しpます。
x = *p;
種類発現が *pあるint宣言から追従します、
int *p;
同様に、ポインタの配列がありdouble、特定の値を取得したい場合は、配列にインデックスを付けて結果を逆参照します。
y = *ap[i];
再度、タイプ発現が *ap[i]あるdouble宣言から追従します、
double *ap[N];
なぜしない++宣言のような役割を果たし*、[]または()?または+or ->または&&?の ような他の演算子
まあ、基本的に、言語の定義がそう言っているからです。それだけではさておき設定し*、[]、と()あなたは、ポインタ、配列、および関数型を指定できるようにする必要があるため、宣言内の任意の役割を果たしています。個別の「increment-this」タイプはないため++、宣言の一部である必要はありません。何の「ビットごと-この」タイプは単項の必要がないので、ありません&、|、^、または~宣言のいずれかの一部であることを。使用タイプの場合は.メンバー選択演算子を、我々は使用structしてunion宣言でタグを。->演算子を使用する型の場合、宣言子で演算子と組み合わせてタグstructとunionタグを使用します*。
- もちろん、次のように、ポインタ、配列、および関数型のtypedef名を作成できます。
typedef int *iptr;
iptr a,b,c; // all three of a, b, and c are pointers to int
繰り返しになりますが、typedef名のポインター性を指定するのは宣言 *iptr子です。
void move(int *units) { ... }、これは間接演算子です。 タイプの一部と考えられるので、書くこともできますがvoid move(int* units) { ... }、私は前者のスタイルを好みます。両方とも「intポインター」として読みます。stackoverflow.com/a/8911253