単項接頭演算子&
をオブジェクトに適用すると、オブジェクトのアドレスが得られます: &obj
。宣言しようとしている変数に型修飾子を適用すると、変数の型が
参照型に変更されます。&
int&
同じことが*
:にも当てはまります。宣言しようとしている変数の型修飾子
として使用すると、型がポインターになるように変更されます: 。*ptr
*
int*
同様に、宣言されている変数に適用された型修飾子[]
は、変数の型を配列に変更しますが、配列型のオブジェクトに適用された二項中置演算子[]
は、配列のサブオブジェクトの 1 つにアクセスします。
型修飾子が、宣言されている型ではなく、宣言されている変数に適用されるのは役に立ちません。たとえば、これ
int *p, **pp, i, a[10], &r = i;
int
ポインター、 へのポインターへのポインターint
、バニラint
、 10 の配列int
、およびint
参照を定義します。(後者は、初期化されていない参照を持つことができないため、すぐに初期化されます。)型修飾子は、宣言された変数の型ではなく、型を変更する宣言された変数に構文的に属することに注意してください。それにもかかわらず、型修飾子 (*
および&
)は変数の型を変更します。
ただし、次の場合、 with p
、i
、およびa
は既に宣言されている変数と見なされます。
*pp = &i;
a[0] = i;
*
と&
は単項接頭演算子であり、逆参照pp
して のアドレスを生成しi
、一方、配列[]
の最初のオブジェクトを生成します。int
a
C と C++ が型修飾子の周りの空白を気にしないという事実と、それらを配置する際に異なる陣営につながったという事実は、実際には物事を簡単にするものではありません。
型修飾子を型の近くに配置する人もいます。彼らは、それが型を変更するので、そこに行くべきだと主張しています:
int* ptr;
欠点は、複数のオブジェクトを宣言するときに混乱することです。これ
int* a, b;
はa
へのポインタであると定義されていますがint
、であると定義されていb
ますint
。それが、一部の人々が書くことを好む理由です
int *ptr;
int *a, *b;
同じステートメントで複数のオブジェクトを宣言しないことをお勧めします。コードを読みやすくする IMO。また、どちらの規則も自由に選択できます。
さらに複雑なことに、型修飾子と単項前置演算子 &
andに加えて、「ビット単位の AND」と「乗算」を意味する二項中置演算子and*
もあります。さらに侮辱的なことに、C++ では、ユーザー定義型のこれらの演算子の単項プレフィックスとバイナリ インフィックスバリアント (およびバイナリ インフィックス) の両方をオーバーロードし、それらのセマンティクスに関して完全に自由にすることができます。 &
*
[]