web-dev-qa-db-ja.com

ポインターの宣言。タイプと名前の間のスペースの左側または右側にアスタリスクがありますか?

可能性のある重複:
何がより理にかなっています-char * stringまたはchar * string?C++でのポインター宣言:アスタリスクの配置

私はこれの混合バージョンを多くのコードで見ました。 (これはCとC++に当てはまります。)人々は2つの方法のいずれかでポインターを宣言しているようで、どちらが正しいのか、それが重要かどうかはわかりません。

次のように、型名の隣にアスタリスクを配置する最初の方法:

someType* somePtr;

2番目の方法は、次のように、変数名の隣にアスタリスクを置くことです。

someType *somePtr;

これは今しばらく私を夢中にさせてきました。ポインターを宣言する標準的な方法はありますか?ポインターがどのように宣言されるかは重要ですか?以前に両方の宣言を使用したことがありますが、コンパイラーはどちらの宣言も気にしないことを知っています。しかし、ポインターが2つの異なる方法で宣言されているのを見たという事実は、その背後に理由があると信じるようになります。どちらかの方法が読みにくいか、何らかの形で欠けている論理的である場合、私は興味があります。

111
jakogut

それは好みの問題であり、ブレースのスタイルのように、やや聖戦のようなものです。

スタイル

someType* somePtr;

ポインター変数の型を強調しています。基本的に、「somePtrの型はsomeTypeへのポインターです」と言っています。

スタイル

someType *somePtr

ポイント先データのタイプを強調しています。基本的に、「somePtrが指すデータのタイプはsomeTypeです」と言っています。

これらは両方とも同じことを意味しますが、ポインターを作成するときの特定のプログラマーのメンタルモデルが、いわば、ポイント先のデータまたはポインター変数に「焦点を合わせている」かどうかに依存します。

中央に置く(someType * somePtr)いずれかへのコミットを回避しようとしています。

96
Tyler McHenry

関係ありません。誰かが出てきて、だましとして質問を閉じ、他の誰かがint* aが同じ宣言で複数の変数を宣言している場合、int *a wayはコードの構文構造をよりよく反映しており、別の人はStroustrupがint* a 仕方。

多くの意見がありますが、ここには「正しい」方法はありません。

113

それは問題ではなく、個人的な好みです。

一部の人々は、型を一緒に保つことを好む:

int* p;

次の理由により、変数の隣に移動する必要があると言う人もいます。

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.

時間が経つにつれて、これを見落とし、両方のバリエーションを受け入れるようになります。

51
Brian R. Bondy

C++がCの上に強力な型システムを追加したため、違いが生じました。Cプログラマーは通常、「値」の観点から考えます。

int  *pValue;

「pValueの逆参照はint」であるのに対し、C++プログラマーは「型」で考える

int* pValue;

「pValue型はintへのポインタです」と読みます。コンパイラは、もちろん違いを認識しません。ただし、C++でプログラミングするときに「値のセマンティクス」を主張するのはCプログラマーであることがわかります。

22
Lance Diduck

変数の名前の隣にアスタリスクを置く方が明確だと思います。

誤ってsomeType* one, two;が両方ともポインターであると考えているが、変数oneのみがポインターであると宣言する場合があります。 twoは単なるsomeTypeです。 someType *one, *twoとして宣言すると、この問題を回避できます。

18
dteoh