2016-12-11 12 views
2

両方の用途を理解したいですか?私は今あるNode *rootによって理解することはNode* root自体をノードへのポインタである一方、ノードオブジェクトへのポインタを根絶するための基準であるノード*ルートとノード*ルートの違い

+5

これがCであると仮定すると、それらは同じです。 –

+0

Cで "ref"というものはありません。 –

+0

両方とも同じで、ルートとはNode型へのポインタであるポインタです。これは、今からのルートが、データ型がNodeでもあ​​る変数のアドレスを格納できることを意味します。変数があなたの例のようなポインタであると言うとき、それはあなたが宣言したポインタが、そのポインタ自身が宣言された型の他の変数のメモリアドレスを格納できることを意味します。それは何を指しているか(他の変数やメモリ位置のアドレスを格納するためのもの)です。 –

答えて

11

間隔は、この定義では重要ではない、あなたは、交換可能に、次のすべてを書くことができ、それらはすべてNodeへのポインタとしてrootを定義します。

Node*root; 

Node *root; 

Node* root; 

Node * root; 

Node      *root; // I have seen that! 

Node 
* 
root 
; 

Node(((*(root)))); // yes, this is allowed too! 

\  
N\ 
od\ 
e*r\ 
oot ;   // ASCII art style: a corner case ;-) 

それはあなたが好むどの、スタイルの問題です使用する。ただ、心の中でこれらの考慮事項を負担:

  • 可読性が非常に重要愚かなと微妙なバグを回避し、それが自分自身や他の人があるかどうか、維持するためにコードを容易にするためにです。

  • コードを読みやすくするためには、一貫性が必要です。スタイルを1つ選択して、どこでも使用できます。

  • Node * rootは、乗算のように見えますが、混乱を招く傾向があります。あなたは同じ文で複数の変数を宣言するとタイプの末尾に*にタッキング

  • は混乱を作成します。

    Node* root, tree; // defines a pointer root and a structure tree. 
    

    これは、多くのプログラマは、タックすることを好む理由です

    Node *root, *tree; // defines 2 Node pointers root and tree. 
    

    のに対し、宣言の識別子に*を追加します。 typedef Node *Nodeptr;と同様typedef隠すへのポインタの性質を利用し

    、または悪化しtypedef Node *List;は、エラーが発生しやすくなり、さらに、両方のプログラマの混乱や、読者の心を作成する傾向があります。

4

node *foonode* fooはコンパイラと同じです(あなたが参照渡しすることができます)。

!!楽しい!あなたは知らないかもしれません。

int *a; 
int b; 

はあなたが与えなければならない1つのステートメントで複数のポインタを宣言する:コンパイラが見ている何

int* a, b; // two int*, right? 

は、int型のポインタとint型の宣言です:あなたは、複数のポインタの宣言はどのようなものかを書くとき各*

int *a, *b; 

又は

int* a, * b; 
関連する問題