web-dev-qa-db-ja.com

C / C ++でポインター変数を宣言する正しい方法

ポインター変数の宣言に次の表記法を使用している人がいることに気付きました。

(a) char* p;

の代わりに

(b) char *p;

私は(b)を使用します。表記法の背後にある合理的な理由は何ですか(a)?文字ポインタは型そのものではないため、表記(b)は私にとってより意味があります。代わりに、タイプは文字であり、変数は文字へのポインターである場合があります。

char* c;

これは、char *型があり、変数cがその型であるように見えます。しかし、実際には、型はcharであり、* c(cが指すメモリ位置)はその型(char)です。一度に複数の変数を宣言すると、この区別が明らかになります。

char* c, *d;

これは奇妙に見える。 cとdは、文字を指す同じ種類のポインターです。これでは、次のものがより自然に見えるので。

char *c, *d;

ありがとう。

74
keeda

Bjarne Stroustrupは言った:

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

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

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

ソース: http://www.stroustrup.com/bs_faq2.html#whitespace

単一の行で複数のポインターを宣言する状況(4番目の例)では、変数にアスタリスクを使用するのが慣れているので、後者のスタイルをお勧めします。

92
BlackJack

私は個人的に*残りのタイプ

char* p;  // p is a pointer to a char.

人々は「しかし、char* p, q;は誤解を招くものになります」と私は言います、「そうしないでください」。

45
ikegami

書き方に違いはありません。ただし、1行で2つ以上のポインターを宣言する場合は、(b)バリアントを使用する方が適切です。これは、目的が明確であるためです。以下を見てください:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.
29
George Gaál

妥協は

char * p;

K&Rは

char *p;

コーディング標準に従わない限り、あなた次第です。その場合は、他の全員が行うことに従う必要があります。

9
jnnnnn

個人的にはchar *を見るプロジェクトでは、それはすべて好みの問題です。別々の行で複数のポインターを宣言する傾向があります。これを行うための実際の「正しい」方法はなく、すべては好みに依存します。 (a)読みやすいと言う人もいれば、(b)同じ行で同じ型の変数を宣言する方が簡単だと言う人もいます。

(b)がより一般的であり、場合によっては見たことがある

char * a;

またはこのようなもの。再び好み。あなたが満足しているもの、または私が取り組んでいるプロジェクトが使用するものは何でも使用します(私が(a)を使用する場合は自分で作成しない限り)

2
Jesus Ramos