15

私は C++ の研究に戻り、基本を理解しようとしています。ポインターはいつも私に問題を与えてきました。先に進んで混乱する前に、本当にそれを理解できるようにしたいと思っています。

悲しいことに、私が読んでいるチュートリアルの矛盾によって、最初から困惑していました。次のようにポインタ宣言を行うものもあります。

int *x

そして、いくつかはこのようにします:

int* x

現在、2 つのうち前者が最も一般的なようです。2番目のほうが私にははるかに理にかなっているので、これは動揺しています。int *x を読むと、「これは int で、その名前は *x です」と読みますが、これは正しくありません。しかし、2 番目を読むと、「ここには int ポインターがあり、その名前は x です」と表示されます。これはかなり正確です。

では、独自のメンタル マップを作成する前に、この 2 つに機能的な違いはあるのでしょうか? 2 番目の方法で行うと、ハンセン病患者の追放者になるのでしょうか?

ありがとう。

4

10 に答える 10

19

C++ の作成と開発で知られる有名なBjarne Stroustrupは、次のように述べています。

「int* p;」の選択 および「int *p;」善悪についてではなく、スタイルと強調についてです。C強調表現; 宣言はしばしば必要悪にすぎないと考えられていました。一方、C++ は型に重点を置いています。

「典型的な C プログラマー」は「int *p;」と書きます。そして、構文を強調する「*p は int とは何か」を説明し、スタイルの正確さを主張するために C (および C++) 宣言文法を指す場合があります。実際、* は文法で名前 p にバインドされます。

「典型的な C++ プログラマー」は「int* p;」と書きます。そして、「pはintへのポインタです」と型を強調して説明しています。実際、p の型は int* です。私は明らかにその強調を好み、C++ のより高度な部分をうまく使用するために重要であると考えています。

だから、違いはありません。それは単なるコードスタイルです。

ここから

于 2013-04-10T17:55:55.460 に答える
10

コンパイラにとって、それらはまったく同じ意味を持ちます。

スタイル的には、両方に賛成と反対の議論があります。

1 つの議論は、2 番目のバージョンが次の理由で最初のバージョンが望ましいということです。

int* x, y, z;

xyおよびzはすべてポインターであり、それらはそうではありません (そうであるだけですx)。

最初のバージョンにはこの問題はありません:

int *x, y, z;

つまり、*は型ではなく変数名にバインドされるため、変数名のすぐ隣に配置するのが理にかなっています。

反論は、同じ宣言でポインタ型と非ポインタ型を混在させてはならないというものです。そうしないと、上記の引数は適用されず、 type の一部であるため*、右の隣に配置するのが理にかなっています。int

どちらの学派に加入することに決めたとしても、実際には両方のスタイルに遭遇することになります (一部の人々は と書いていますint * x)。

于 2013-04-10T17:53:20.520 に答える
5

まったく違いはありません。

それは単にスタイルの問題です。

私は個人的にこれを好みます:

int *x;

この上に、

int* x;

後者は、同じ行で多くの変数を宣言すると読みにくくなるためです。たとえば、これを参照してください。

int* x, y, z;

ここxに へのポインタintがありますがy、 とzポインタもありますか? ポインターのように見えますが、そうではありません

于 2013-04-10T17:53:59.593 に答える
3

違いはありません。int* xすべての型を名前から離れた場所にグループ化しておくことを好むため、フォームを使用しますが、そのようなものは、 のようなより複雑な型ではうまくいきませんint (*x)[10]

「逆参照はあなたにint *x」と読むことができるので、好む人もいます。しかし、参照型を使い始めると、それも崩壊します。のアドレスを取得してもが得られるわけではありません。xintint &xxint

もう 1 つの理由int *xは、文法の観点から、intが宣言指定子シーケンスであり、*xが宣言子であるためです。これらは宣言の 2 つの別個の部分です。のような複数の宣言子がある場合、これはより明白になりますint *x, y;yこの場合、 がポインターではないことを確認する方が簡単かもしれません。

ただし、多くの人は、私のように、1 つの宣言で複数の変数を宣言することを好みません。C++ ではあまり必要ありません。int* xそれがフォームを好むもう1つの理由かもしれません。

ルールは 1 つだけです。一貫性を保つことです。

于 2013-04-10T17:54:44.067 に答える
1

変わりはない。私は、

int* x

「x」は int* 型を持つと考えているためです。

于 2013-04-10T17:55:49.023 に答える
1

まったく違いはありません。

于 2013-04-10T17:54:09.113 に答える
1

コンパイラにとって、それらは同じです

しかし同時に、複数の変数がある場合の違いは可読性です

int *x,y

しかし、これはもっと誤解を招く

int* x,y

于 2013-04-10T17:57:01.527 に答える
0

どちらも同じことです。

ただし、前者の方が好ましいです。同じ行で 2 つのポインター p & q を宣言するとします。

int* p、q;

これは実際には、'p' が int へのポインターであり、'q' が int であることを意味します。

正しい構文は次のとおりです。

int* p、*q;

したがって、ポインターの名前に * を含めます。

于 2013-04-10T17:58:03.980 に答える
0

これはコーディングのスタイルの一種です。あなたが言ったように、違いはありません。好みの問題です。クリアしてください。コーディングをお楽しみください

于 2013-04-10T18:05:41.040 に答える
-2

私の意見では、式のint * x,y; xyは変数の名前です。これらの名前がプログラマーによってこのように宣言されている場合、それはそれらが型を持ちsame typeint *型であることを意味します。

于 2013-04-10T18:11:03.493 に答える