ポインターを宣言するお気に入りの方法は何ですか?
int* i;
または
int *i;
または
int * i;
または
int*i;
理由を説明してください。
int*i;
-ホワイトスペースは木に成長しません、あなたは知っています...
ポインターを宣言するお気に入りの方法は何ですか?
int* i;
または
int *i;
または
int * i;
または
int*i;
理由を説明してください。
int*i;
-ホワイトスペースは木に成長しません、あなたは知っています...
回答:
あなたが書く場合:
int* i, j, k;
i、j、kのすべてがへのポインタであると誤解を招くように示唆していint
ます。
したがって、*を変数名に付加する方が優れていると主張します。
int * i;
、一目で乗算のように見えるという理由だけで、非競合者であることをお勧めします。
int*
は型と見int* i, j
なされ、2つのポインターを宣言します。質問は不完全であると見なされる可能性があります。どのスタイルが妥当かは、使用している言語によって異なります。CI int *x
では、C#でフォローします。
私は「intへのポインター」型を持っているint* i
のでi
、私は好みます、そして、これは型システムでそれを均一にすると感じます。もちろん、1行に複数のポインターを定義しようとすると、よく知られた動作が発生します(つまり、ポインターを宣言するには、各変数名の前にアスタリスクを置く必要があります)が、この方法ではポインターを宣言しません。また、Cスタイル言語の重大な欠陥だと思います。
*i
がタイプを持つと主張しますint
。
型に重点を置いていないCの場合、私は次のことを好みます。
int *i;
int
ポインタではなくにエンフェシスがあるためです。何int
ですか?*i
intです。
int i = 5
、の値を取得i
するには、名前を使用しますi
。同様に、を持っている場合int *i; *i = 5
、値を取得するにはを使用します*i
。
私はint* i
何年も好みました。ただし、int *i
前者のスタイルを使用する場合、複数の宣言ルールを覚えておく必要があるため、強力な議論があります。
int* a, *b; // not int* a, b;
この規則を覚えておく必要があるため、単純に何も得ることはありませんが、より複雑であるとは言いません。1行で複数の宣言を避けることは、このルールを覚えていると言う別の方法です。2つのスタイルの違いは議論の余地があります。
ただし、私が使用している場合でも、構文的にバインドされている変数ではなく、型の隣にアスタリスクを配置することで、C宣言構文の動作以外のふりをするのは少しばかげています。
1つは、に私が購入していない強調(のためのポインタ型をi
他の(ためのint型を強調しながら)*i
)、それは、CおよびC ++使用の15年後、それだけということかもしれでなくて、私はそれを見たときそれについて考える必要がある—この質問をするほとんどの初心者はまだできません。
また、私の好みを考えても、他のスタイルでコードを読み書きするのは面倒ではありません。一貫性、ほらほら。
言及する必要さえありませんint * i
。
私はint* i
(C ++スタイル)を好みます。
結果の視覚的なあいまいさ(int* i, j
)により、1つのステートメントで複数の変数を宣言することは避けます。
理論的根拠については、Bjarne StroustrupのC ++スタイルとテクニックに関するFAQも参照してください。
複数の変数を宣言したいが、アスタリスクを繰り返したくない場合:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(構造体テンプレートの内部で見ることができるように、私はint* i
スタイルを好みます。)
そして、より一般的なソリューションは次のとおりです。
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
これは、配列や参照などの「問題のあるタイプ」で動作します。
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptr
トリックを行っていただろう。確かに、さまざまなポインター型に対して新しいtypedefを宣言する必要がありますが、実際にはいくつになるでしょうか?せいぜい8個?
int* i;
最初の部分は変数の型(intへのポインター)を示し、2番目の部分は名前(i
)を示しているので、先に進みます。タイプがint
で名前がであることは私には意味がないでしょう*i
。また、int * i;
私には少し乗算のように見えます。
私は実際に特定の状況で3つすべての規則を使用します。一見矛盾しているようですが、...
int *
識別子が存在しない場合、名前が存在しないことを視覚的に補強します。int* intptr
上typedef
のと同様の宣言を視覚的に強化するタイプのそれの一部が。同様に、関数ポインター宣言の場合:(int* (*foo)(int))
int *identifier
またclass &identifier
、パラメータが潜在的にいわゆる「出力」パラメータであることを視覚的に強化するための関数パラメータ。const int * const * const
cv修飾子を使用するときはいつでも。int * foo;
ローカル宣言について。私はやや視覚志向だと思います。
Cにはポインター型はありません!したがって、「int *」は何も意味しません。アスタリスクは、常にその右側に書かれた要素にバインドされており、その右側の要素に属します。「* i」は整数です。また、* iはintであるため、iはintへのポインターになります。それがその背後にある論理であり、それが「int * i」が唯一の可能な解決策である理由です。それ以外はすべて幻想です(ほとんどの場合、コンパイラによって自動的に修正されます)。C ++とC#では、これは別のものです。しかし、Cには「デニスM.リッチー:Cプログラミング言語」という聖書が1つしかありません。デニス(RIP!)が書いた:「int * i」。これを疑問視する必要はありません。
int*
ポインタ型です。