0

リンクされたリストの長さを見つける関数を書いています。私の質問は、ポインターの宣言に固有のものです。

int lengthOfLinkedList(Node *head) 
{ 
Node* current = head; 
}

vs. 

int lengthOfLinkedList(Node *head) 
{
Node* current = NULL; 
current = head; 
}

これが私の理解です。最初の例では、Node オブジェクトを指すポインターが宣言され、ヘッド ポインターのアドレスを逆参照します。


| | メモリ アドレス | <--- 現在


これは私がやりたいことではありません。代わりに、ポインターが指しているノードにアクセスできるように、ポインターを参照したいと思います (これは、2 番目のコード スニペットで行ったことです)。


|データ| *次| <--- 現在


したがって、ポインタは初期化時に異なる動作をすると考えています.('*')演算子を使用して初期化するときに、メモリアドレスへのポインタを直接宣言できますが、初期化後にこれを行うことはできなくなりました。それはかなり奇妙です..

私は正しいですか、それとも何か他のことが起こっていますか?

4

4 に答える 4

0

初期化は代入と同じではありません。初期化で逆参照currentしていません。は、ポインター型が *あることを示すためだけに存在し、それ以上のものはありません。current

C および C++ の宣言構文は、オブジェクトではなく式の型に基づいています。たとえば、整数へのポインターがあり、その整数値を取得したい場合は、単項演算子でポインターを逆参照する必要があります*

x = *p;

の型は*pintあるため、 の宣言はpです。

int *p;

宣言では、*トークンは単に追加の型情報を提供するために存在します。つまり、これpは へのポインタintです。T *pポインター宣言の場合、*は型指定子ではなく、宣言子にバインドされることに注意することが重要です。IOWT *p;として解析されT (*p);ます。したがって、1 つの宣言で複数のポインターを宣言する場合は、次のように記述する必要があります。

T *p, *q, *r;

この例では、 、 、およびのそれぞれはp、型へのポインタです。 qrT

多くの C++ プログラマーT* p;は、オブジェクトの型を強調することがより重要であると感じp、コードの意図をより明確にする場合があるため、このスタイルを使用します。ただし、常に として解析されT (*p);ます。

于 2013-09-13T19:51:22.907 に答える