int * i; またはint * i; またはint * i; [閉まっている]


30

ポインターを宣言するお気に入りの方法は何ですか?

int* i;

または

int *i;

または

int * i;

または

int*i;

理由を説明してください。

参照:http : //www.stroustrup.com/bs_faq2.html#whitespace


19
私は他の3000行に焦点を当てたいと思います

29
int*i;-ホワイトスペースは木に成長しません、あなたは知っています...
Shog9

これは本質的に同じ質問です。ここに私の答えがあります。
キーストンプソン

回答:


75

あなたが書く場合:

int* i, j, k;

i、j、kのすべてがへのポインタであると誤解を招くように示唆していintます。

したがって、*を変数名に付加する方が優れていると主張します。


35
そしてint * i;、一目で乗算のように見えるという理由だけで、非競合者であることをお勧めします。
ジョンK

1
+1このシナリオを以前は考慮しなかったため。
ポップス

4
「i、j、kはすべてintへのポインタであると誤解を招くように示唆しています。」C#を記述している場合を除き、where int*は型と見int* i, jなされ、2つのポインターを宣言します。質問は不完全であると見なされる可能性があります。どのスタイルが妥当かは、使用している言語によって異なります。CI int *xでは、C#でフォローします。
ジョレン

1
@Joren:申し訳ありませんが、C#プログラマーではありません。質問のコードフラグメントを見ると、単にCまたはC ++であると思いました。
ランドールシュルツ

C#が特に言及されていない限り、CまたはC ++であると仮定するのは完全に合理的だと思います。C#のポインターはあまり見られません。
代替案14年

62

私は「intへのポインター」型を持っているint* iのでi、私は好みます、そして、これは型システムでそれを均一にすると感じます。もちろん、1行に複数のポインターを定義しようとすると、よく知られた動作が発生します(つまり、ポインターを宣言するには、各変数名の前にアスタリスクを置く必要があります)が、この方法ではポインターを宣言しません。また、Cスタイル言語の重大な欠陥だと思います。


8
私もこの慣習に従います。同じ理由で。
ギャブリン

5
個人的に、コード内で複数のポインターを宣言する場合、コードの匂いとして扱います。それほど多くのポインターは必要ありません。そして、通常、私はしません。したがって、1行に複数の宣言があるという問題は、私が書いたコードでは決して発生しません。1行に1つの宣言です。
greyfade

5
これの問題は、型が「intへのポインター」ではないことです。C(およびC ++)にはポインター型がありません。これは、int型のメモリブロックへのポインタです。
ビリーONeal

10
私はそれ*iがタイプを持つと主張しますint
ティムグッドマン

5
@Billy:そうだとすれば、12年間、標準語を理解、解析、説明しようとして、その混乱を見たことはありません。「intへのポインター」は、CおよびC ++で完全に有効な型です。

23

型に重点を置いていないCの場合、私は次のことを好みます。

int *i;

intポインタではなくにエンフェシスがあるためです。何intですか?*iintです。


2
いい視点ね。ポインターを使用すると、名前の一部として開始を考えることができます。たとえば、を持っている場合int i = 5、の値を取得iするには、名前を使用しますi。同様に、を持っている場合int *i; *i = 5、値を取得するにはを使用します*i
ミパディ

私はint * iを次のように読みます:* iはintです。したがって、iはintへのポインターです。Cの変数宣言では型式を使用します。intおよび*は単なる演算子です。int * iはint(*(i))として解析され、iが整数へのポインター型であると解釈されます。char * p []はchar(*([](p)))として解析します([]は*より優先順位が高いため)。つまり、pはcharへのポインターの配列型を持ちます。
ジョルジオ

このため、*は変数に適用される演算子であるため、変数の隣に*を書き込むことを選択したと思います。
ジョルジオ

7

私はint* i何年も好みました。ただし、int *i前者のスタイルを使用する場合、複数の宣言ルールを覚えておく必要があるため、強力な議論があります。

int* a, *b; // not int* a, b;

この規則を覚えておく必要があるため、単純に何も得ることはありませんが、より複雑であるとは言いません。1行で複数の宣言を避けることは、このルールを覚えていると言う別の方法です。2つのスタイルの違いは議論の余地があります。

ただし、私が使用している場合でも、構文的にバインドされている変数ではなく、型の隣にアスタリスクを配置することで、C宣言構文の動作以外のふりをするのは少しばかげています。

1つは、に私が購入していない強調(のためのポインタ型をi他の(ためのint型を強調しながら)*i)、それは、CおよびC ++使用の15年後、それだけということかもしれなくて、私はそれを見たときそれについて考える必要がある⁠—⁠この質問をするほとんどの初心者はまだできません。

また、私の好みを考えても、他のスタイルでコードを読み書きするのは面倒ではありません。一貫性、ほらほら。

言及する必要さえありませんint * i


6

私は最初のものを好む。ポインタであることは型の一部であるため、自然になります。

私はC#を使用しているため、Cよりも直感的な方法で型を処理するため、同じステートメントで複数のポインターを宣言しても問題はありません。

int* a, b, c; // three pointers


4

複数の変数を宣言したいが、アスタリスクを繰り返したくない場合:

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);

omg、c ++は常に新しいものを表示します:)。ありがとう!
タマスゼレイ

1
OMG、C ++は恐ろしい!typedef int* int_ptrトリックを行っていただろう。確かに、さまざまなポインター型に対して新しいtypedefを宣言する必要がありますが、実際にはいくつになるでしょうか?せいぜい8個?
ベンザド

1
@benzado実際には、健全な人が1行で複数の変数を宣言することはないため、typedefや私が説明した凝ったトリックは必要ありません。それでも面白い。
fredoverflow

2
私は、C ++プログラムが言語機能を使用できるという理由だけでそれを使用する傾向があることをよく知っていました。
ベンザド

@benzado:!!! 私はこれを頻繁に見ました!
ジョルジオ

2

int* i;最初の部分は変数の型(intへのポインター)を示し、2番目の部分は名前(i)を示しているので、先に進みます。タイプがintで名前がであることは私には意味がないでしょう*i。また、int * i;私には少し乗算のように見えます。


C宣言の構文は、この点で一貫していません。型情報は識別子の後に簡単に来ることができるためです。配列が最も明確な例です。

@ロジャー:私は知っているが、この質問は、単一の変数宣言に関するものであり、他には何もありませんでした。
アロングラネネク

私はそれを少し読んでいると思います。:)私が質問を理解する方法は、どこでどのスタイルを使うかを尋ねていることです。

@ロジャー:あなたはおそらく正しいですが、私の目的はOPの質問に答えることでした:「ポインターを宣言するあなたの好きな方法は何ですか?」。明らかに、誰もが質問で提示された問題を自由に見渡すことができ、ここでも奨励されています。C / C ++で開発しない人として、そうすることは私の専門分野からあまりにも遠く離れていると感じました。
アロングラネク

2

私が使用する宣言ではint * i;、あなたはそれをとして読みますi is a pointer to an integer

ポインターは型と変数の両方に寄与するため、中央にある必要があります。

同じ行で複数のものを宣言しないようにすることは良いことです。 int * i, j;


1

私は実際に特定の状況で3つすべての規則を使用します。一見矛盾しているようですが、...

  • int * 識別子が存在しない場合、名前が存在しないことを視覚的に補強します。
  • int* intptrtypedefのと同様の宣言を視覚的に強化するタイプのそれの一部が。同様に、関数ポインター宣言の場合:(int* (*foo)(int))
  • int *identifierまたclass &identifier、パラメータが潜在的にいわゆる「出力」パラメータであることを視覚的に強化するための関数パラメータ。
  • const int * const * constcv修飾子を使用するときはいつでも。
  • int * foo; ローカル宣言について。

私はやや視覚志向だと思います。


1

Cにはポインター型はありません!したがって、「int *」は何も意味しません。アスタリスクは、常にその右側に書かれた要素にバインドされており、その右側の要素に属します。「* i」は整数です。また、* iはintであるため、iはintへのポインターになります。それがその背後にある論理であり、それが「int * i」が唯一の可能な解決策である理由です。それ以外はすべて幻想です(ほとんどの場合、コンパイラによって自動的に修正されます)。C ++とC#では、これは別のものです。しかし、Cには「デニスM.リッチー:Cプログラミング言語」という聖書が1つしかありません。デニス(RIP!)が書いた:「int * i」。これを疑問視する必要はありません。


6
「Cにはポインタ型はありません」 -そのアイデアはどこで得たのですか?int*ポインタ型です。
キーストンプソン

-2

int *iポインタであることが簡単にわかるので、私はそれを使用しますが、それは本当に重要ではないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.