8

重複の可能性:
ポインターの宣言。タイプと名前の間のスペースの左または右にアスタリスク?

*とを配置する正確な正しい位置は何かといつも思っていました&。C++ は、これらのマークをどこに置くかについてかなり寛容であるようです。たとえば、ポインタとアンパサンドがキーワードの左右または 2 つのキーワードの中間に置かれているように見えますが、紛らわしいことに、特にconst

void f1(structure_type const& parameter)
void f2(structure_type const &parameter)

void f2(structure_type  const *sptr);
void f2(structure_type  const* sptr);
void f2(structure_type  const * sptr);

例はすべてを網羅しているわけではありません。宣言されている間、または関数に渡されている間、どこでもそれらを見ます。彼らは同じことを意味していますか?しかし、パッティング*がポインターとして参照されるオブジェクトに影響を与える場合もあります ( *is が 2 つのキーワードの間にある場合など)。

編集:

int const *Constant
int const * Constant // this above two seem the same to me, both as pointer to a constant value
int const* Constant //  EDIT: this one seems the same as above. instead of a constant pointer

const int * Constant // this is also a pointer to a constant value, but the word order changed while the pointer position stays the same, rather confusing.

int* const Constant
int * const Constant // instead, these two are constant pointers

だから私はこれを結論付けました:

T const* p; // pointer to const T
const T* p  // seems same from above
T* const p; // const pointer to T

それでも、これは私を混乱させました。コンパイラは、それらに必要な位置と間隔を気にしませんか?

編集:一般的にポジションの問題を知りたいです。はいの場合、どのような場合に。

4

3 に答える 3

14

空白は、トークンが一緒に実行されないようにし、(たとえば) 単一のトークンを作成する程度にのみ重要であるため、(たとえば)int xとは明らかに異なりintxます。

次のようなものを扱っている場合:int const*x;のいずれかのサイズの空白は*、コンパイラにとってまったく違いはありません。

pointer to const intaとの違いは、constconst pointer to intのどちら側にあるかによって異なります。*

int const *x;    // pointer to const int
int *const x;    // const pointer to int

主な違いは、同じ宣言で複数のオブジェクトを定義/宣言する場合の読みやすさです。

int* x, y;
int *x, y;

最初に、x と y が int へのポインターだと考える人がいるかもしれませんが、実際には、x は int へのポインターであり、y は int です。一部の人々の目には、2番目の方がその事実をより正確に反映しています。

誤解を防ぐ 1 つの方法は、一度に 1 つのオブジェクトだけを定義することです。

int *x;
int y;

*これらのいずれについても、空白を完全に無視し (1 つのトークンがどこで終了し、別のトークンが開始するかを示す場合を除いて、" const int" は 2 つのトークンであることがわかります)、正しい解釈はかなり簡単です。に"。例: int volatile * const x;「x は volatile int への const ポインターです」と読み取られます。

于 2013-01-09T04:09:33.673 に答える
3
int const *Constant
int const * Constant 
int const* Constant

上記のすべては、定数整数への非定数ポインターを宣言することを意図しています。

簡単なルール:

constの後に続く場合*は、ポインターに適用されます。そうでない場合は、ポイントされたオブジェクトに適用されます。間隔は関係ありません。

于 2013-01-09T04:06:18.027 に答える
-3

変数宣言での & と * の両方の配置は許容され、独自のフレーバーにのみ依存します。これらは厳密には同じことを意味し、それぞれポインターと参照を作成します。

ただし、const キーワードの配置は基本的なものであり、 a は非定数intへの定数ポインターをint const* variable宣言し、定数int への非定数ポインターです。const int* variable

于 2013-01-09T04:08:46.510 に答える